- 객체와 테이블이 관계를 맺는 차이에 대해 이해한다.
- 연관관계 주인의 필요성
- 양방향 연관관계의 규칙을 파악한다.
- 주인을 설정하는 기준을 파악한다.
- mappedBy
- 아래와같은 엔티티와 테이블 구조가 있다.
- 객체의 경우, Member에서 Team을 참조하기 위한 필드
Team team
와 Team에서 Member를 참조하기 위한 필드List members
가 있다.
- 즉, 양방향이 아닌 2개의 단방향 관계다.
- 테이블의 경우, 외래 키인
TEAM_ID
하나로 서로를 참조할 수 있다.
- 그렇다면, Member의 Team team을 수정했을 때와 Team의 List members를 수정했을 때 중 언제 외래 키를 갱신해야할까?
- 이러한 딜레마에 대한 해결책이 연관관계의 주인이다.
규칙
- 주인의 역할을 명확히 하기위해, 양방향 매핑은 아래와같은 규칙을 따른다.
- 객체의 두 관계 중 하나를 연관관계의 주인으로 지정한다.
- 연관관계의 주인만이 외래 키를 등록, 수정한다.
- 주인이 아닌 쪽은 읽기만 가능하다.
- 주인이 아닌 쪽은
mappedBy
속성으로 주인을 지정한다.
기준에 대한 질문에는 답이 존재한다.
- 외래 키가 있는 곳을 주인으로 정하라.
- 외래 키가 존재하지 않는 곳을 주인으로 지정하면, 변경된 데이터가 반영되지 않은 상태에서 연관관계를 설정하는 것을 방지하기 위해 추가적인 UPDATE query를 실행해야하고, 이는 성능 저하를 초래한다.
즉, 위에서 살펴본 예시의 주인은 외래 키인
TEAM_ID
가 위치한 쪽인Member.team
이 된다.
mappedBy
주인이 아닌 쪽에서는 항상
mappedBy
속성을 통해 주인을 명시한다.
아래의 경우"team"
은Member.team
을 의미한다.
주의점
- JPA만 고려하면, 값 수정시 주인에만 값을 입력해도 무방하다.
그러나, 객체 관계를 고려하여 반드시 양쪽 모두 값을 입력한다.
- 매번 양쪽에 입력하는 것은 까먹을 수도 있고 번거로우므로, 연관관계 편의 메서드를 생성하는 것을 추천한다.
아래는Member
엔티티와Team
엔티티 양쪽에 값을 수정하는 연관관계 편의 메서드이다.