본문 바로가기
프레임워크/JPA

[JPA] 연관관계 매핑 (단방향, 양방향)

by so5663 2023. 4. 2.

위에 그림을 보면 객체를 테이블에 맞추거 모델링 한 경우인데 현재 회사에서 주로하는 JPA를 사용하지않고 있어서 주로 하는 방법인데 김영한의 JPA강의를 듣고 뭔가 잘못된다는 것을 알게 되었습니다.

 

meber객체로 team정보를 찾으려고면 외래키를 직접 다루기 때문에 식별자로 한번더 조회를 해야 한다.

객제지향 방법과는 상당히 거리가 있다.

 

JPA를 사용하면 이런한 문제를 아주 쉽게 해결 할 수 있다. 바로 단방향 연관관계다.

테이블 설계는 위의 그림과 동일하다.

 

단방향

@Entity
 public class Member {
 
 @Id @GeneratedValue
 private Long id;
 @Column(name = "USERNAME")
 
 private String name;
 
 private int age;
 
// @Column(name = "TEAM_ID")
// private Long teamId;

 //member입장에서는 team은 ManyToOne 이다
 @ManyToOne
 @JoinColumn(name = "TEAM_ID")
 private Team team;
}

 

@Entity
public class Team {

    @Id @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;
    
    private String name;
}

이게 가능해진다.

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

 

 

양방향

 

member클래스 소스는 동일하다.

@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;
}

 

@Entity
public class Team {
 @Id @GeneratedValue
 private Long id;
 
 private String name;
 
 @OneToMany(mappedBy = "team")
 List<Member> members = new ArrayList<Member>();
}

 

team으로도 memebr정보를 가져올수 있게 된다.

//조회
 Team findTeam = em.find(Team.class, team.getId()); 
 int memberSize = findTeam.getMembers().size(); //역방향 조회

 

양방향 매핑 규칙

• 객체의 두 관계중 하나를 연관관계의 주인으로 지정

연관관계의 주인만이 외래 키를 관리(등록, 수정)           <-- 제일 많이 하는 실수

• 주인이 아닌쪽은 읽기만 가능

• 주인은 mappedBy 속성 사용X

• 주인이 아니면 mappedBy 속성으로 주인 지정

 

 

연관관계의 주인을 정하는 기준

• 비즈니스 로직을 기준으로 연관관계의 주인을 선택하면 안됨

연관관계의 주인은 외래 키의 위치를 기준으로 정해야함 

 

 

출처 : 김영한의 JAP강의