개발놀이터

JPA 연관관계의 주인 본문

JPA/JPA

JPA 연관관계의 주인

마늘냄새폴폴 2021. 8. 23. 05:43

*연관관계의 주인

연관관계의 주인 딜레마는 양방향 연관관계에서 고민해야할 문제인데 양방향 매핑 규칙이 있다. 연관관계의 주인이란 단방향 연관관계를 두개를 만들어야하는 양방향 연관관계에서 둘 다 객체를 만들어버리면 예를들어 Member, Team 두개에서 Team클래스에서는 Member member로 단방향 매핑을 구축하고 Member 클래스에서는 Team team으로 단방향 매핑을 구축하면 둘 중 어떤 클래스에서 디비에 있는 FK를 수정할지 결정을 해야한다. 이것이 바로 연관관계의 주인이다.

양방향 매핑 규칙
1. 객채의 두 관계중 하나를 연관관계의 주인으로 지정
2. 연관관계의 주인만이 외래키를 관리 (등록, 수정)
3. 주인이 아닌 쪽은 읽기만 가능
4. 주인은 mappedBy 속성 사용 X
5. 주인이 아니면 mappedBy 속성으로 주인 지정

누구를 주인으로?
-외래키가 있는 곳을 주인으로 정해라
-여기서는 Member.team이 연관관계의 주인

외래키가 있는 쪽이 N이 되고 없는 쪽이 1이 된다. 외래키가 있는 N쪽이 연관관계의 주인이 된다. => 그럼 N : M은?


*주의사항
연관관계의 주인이 아닌 역방향에만 연관관계를 설정하면 null이 들어가기 때문에 연관관계의 주인의 객체 값들을 설정해 주어야 한다 > 은근히 많이 하는 실수

그냥 양쪽 다 값을 넣으면 된다. (객체지향 적으로 생각 했을 때 양쪽에 다 값을 넣는것이 좋다)

cf)연관관계 편의 메소드
연관관계의 주인되는 클래스에서 외래키의 데이터 값을 가공할 때 mappedBy를 쓰는 클래스의 값을 동시에 넣어주는 방법이다.
private void setTeam(Team team) {
this.team = team;
team.getMembers.add(this);
}
그리고 이런 역할이 큰(?) 메소드는 단순히 getter, setter를 쓰는 것 보다 특정한 이름을 지어주는 것이 명시성을 올려준다. 즉 private void changeTeam(Team team) 이라고 적는것이 다른 개발자가 봤을 때 아 팀을 바꾸는 특정한 메소드구나라고 생각할 수 있다. 


일단 설계단계에서는 단방향 연관관계로 설계를 마치고 양방향 연관관계가 필요할 때 그때 추가하면 된다. 

'JPA > JPA' 카테고리의 다른 글

지연로딩과 즉시로딩 (프록시)  (0) 2021.08.24
JPA 상속관계 매핑  (0) 2021.08.23
JPA 기본키 매핑  (0) 2021.08.21
JPA Entity 매핑  (0) 2021.08.21
JPA 영속성컨텍스트  (0) 2021.08.21