JPA 양방향 연관관계의 주인

김두현·2023년 4월 25일
1

JPA

목록 보기
7/14
post-thumbnail

Goal

  • 객체와 테이블이 관계를 맺는 차이에 대해 이해한다.
    • 연관관계 주인의 필요성
  • 양방향 연관관계의 규칙을 파악한다.
  • 주인을 설정하는 기준을 파악한다.
    • mappedBy

객체와 테이블의 차이

  • 아래와같은 엔티티와 테이블 구조가 있다.
  • 객체의 경우, Member에서 Team을 참조하기 위한 필드Team teamTeam에서 Member를 참조하기 위한 필드List members가 있다.
    • 즉, 양방향이 아닌 2개의 단방향 관계다.
  • 테이블의 경우, 외래 키인 TEAM_ID 하나로 서로를 참조할 수 있다.

  • 그렇다면, Member의 Team team을 수정했을 때와 Team의 List members를 수정했을 때 중 언제 외래 키를 갱신해야할까?
    • 이러한 딜레마에 대한 해결책이 연관관계의 주인이다.

양방향 연관관계의 규칙

규칙

  • 주인의 역할을 명확히 하기위해, 양방향 매핑은 아래와같은 규칙을 따른다.
  1. 객체의 두 관계 중 하나를 연관관계의 주인으로 지정한다.
  2. 연관관계의 주인만이 외래 키를 등록, 수정한다.
  3. 주인이 아닌 쪽은 읽기만 가능하다.
  4. 주인이 아닌 쪽은 mappedBy 속성으로 주인을 지정한다.

주인을 설정하는 기준

기준에 대한 질문에는 답이 존재한다.

  • 외래 키가 있는 곳을 주인으로 정하라.
    • 외래 키가 존재하지 않는 곳을 주인으로 지정하면, 변경된 데이터가 반영되지 않은 상태에서 연관관계를 설정하는 것을 방지하기 위해 추가적인 UPDATE query를 실행해야하고, 이는 성능 저하를 초래한다.

즉, 위에서 살펴본 예시의 주인은 외래 키인 TEAM_ID가 위치한 쪽인 Member.team이 된다.


mappedBy

주인이 아닌 쪽에서는 항상 mappedBy 속성을 통해 주인을 명시한다.
아래의 경우 "team"Member.team을 의미한다.


주의점

  • JPA만 고려하면, 값 수정시 주인에만 값을 입력해도 무방하다.
    그러나, 객체 관계를 고려하여 반드시 양쪽 모두 값을 입력한다.
    • 매번 양쪽에 입력하는 것은 까먹을 수도 있고 번거로우므로, 연관관계 편의 메서드를 생성하는 것을 추천한다.
      아래는 Member 엔티티와 Team 엔티티 양쪽에 값을 수정하는 연관관계 편의 메서드이다.

참고 자료

https://www.inflearn.com/course/ORM-JPA-Basic


💕오류 지적 및 피드백은 언제든 환영입니다. 복제시 출처 남겨주세요!💕
💕좋아요와 댓글은 큰 힘이 됩니다.💕
profile
I AM WHO I AM

0개의 댓글