연관 관계 매핑 기초 - 단방향 연관 관계

연관 관계가 필요한 이유

객체를 테이블에 맞추어 모델링

  • 예제 시나리오
    • 회원과 팀이 있다.
    • 회원은 하나의 팀에만 소속될 수 있다.
    • 회원과 팀은 다대일 관계이다.
  • 객체를 테이블에 맞추어 모델링하며 연관관계가 없는 경우

    위 그림과 같이 MEMBER 테이블은 TEAM 테이블의 TEAM_ID를 FK로 가져와 연관관계가 존재하지만 객체에서는 서로 연관 관계가 존재하지 않는다.
  • Entity 구현
    Member 객체는 Team의 id를 외래키로 가져올 때 참조하는 것 대신 외래키를 그대로 사용하였다.
  @Entity
  public class Member {
    @Id @GeneratedValue
    private Long id;

    @Column(name = "USERNAME")
    private String name;

    @Column(name = "TEAM_ID")
    private Long teamId;}

  @Entity
  public class Team {
    @Id @GeneratedValue
    private Long id;

    private String name;}
  • 객체 지향적이지 않다.
    Member 객체에 Team의 id를 설정하기 위해서는 Team 객체에서 id 값을 얻어와 직접 주입해주어야 한다.
 //팀저장
 Team team = new Team();
 team.setName("TeamA");
 em.persist(team);
 //회원 저장
 Member member = new Member();
 member.setName("member1");
 //team의 id를 가져와 직접 주입
 member.setTeamId(team.getId());
 em.persist(member);
 //팀저장
 Team team = new Team();
 team.setName("TeamA");
 em.persist(team);
 //회원 저장
 Member member = new Member();
 member.setName("member1");
 //team의 id를 가져와 직접 주입
 member.setTeamId(team.getId());
 em.persist(member);

Member와 Team을 조회하는 경우에도 Member와 Team을 각각 식별자로 조회해야한다.

 //조회
 Member findMember = em.find(Member.class, member.getId()); 
 //연관관계가 없음
 Team findTeam = em.find(Team.class, team.getId());
  • 객체를 테이블에 맞추어 데이터 중심으로 모델링하는 경우 협력 관계를 만들 수 없다.
    • 테이블은 외래 키로 조인하여 연관된 테이블을 찾는다.
    • 객체는 참조를 사용해서 연관된 객체를 찾는다
    • 이렇듯 객체와 테이블 사이에는 큰 차이점이 있다.


단방향 연관 관계

객체 지향 모델링

  • 객체의 연관 관계를 사용해서 모델링 하는 경우
    Member 객체는 Team의 id가 아닌 Team 그 자체를 참조를 통해 연관 관계가 형성되어 있다.

    코드로 보면 아래와 같이 @ManyToOne을 통해 다대일 관계를 형성한다.
   @Entity
   public class Member {
     @Id @GeneratedValue
     private Long id;
 
     @Column(name = "USERNAME")
     private String name;
     private int age;
 
     @ManyToOne
     @JoinColumn(name = "TEAM_ID")
     private Team team;
   }
  • 객체 지향적이다.
    Member에 Team을 설정해줄 때도 바로 Team을 주입해준다. 다른 Team을 주입하고자 할 때도 마찬가지로 간단하게 가능하다.
   //팀 저장
   Team team = new Team();
   team.setName("TeamA");
   em.persist(team);
   
   //회원 저장
   Member member = new Member();
   member.setName("member1");
   member.setTeam(team); //단방향 연관관계 설정, 참조 저장
   em.persist(member);

또한 조회를 해줄 때에도 Member 객체에서 바로 Team을 조회 가능하다.

  //조회
   Member findMember = em.find(Member.class, member.getId()); 
  //참조를 사용해서 연관관계 조회
   Team findTeam = findMember.getTeam();



[Reference]

Inflearn 김영한 님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

좋은 웹페이지 즐겨찾기