자바 ORM 표준 JPA 프로그래밍(인프런)

Ch05. 연관관계 매핑 기초 - 양방향 연관관계와 연관관계의 주인(기본)

webmaster 2021. 12. 12. 12:01
728x90

양방향 매핑

  • 현재는 Member -> Team은 가능하지만 Team->Member는 안된다.
  • 테이블은 외래키 하나로 양방향 매핑이 가능하다(조인만 된다면 방향이 상관없이 다된다)
    • 객체의 연관관계는 다르다(방향이 있다)

Team Entity에 Member의 컬렉션을 저장하는 members를 생성 ( 양방향 연관관계)

  • mappedBy로 어떤 것과 연관되어 있는지를 적어준다.
  • 연관관계의 주인이 아님을 mappedby를 통해 표시

양방향 참조값이 있으므로 양방향 조회 가능

연관관계의 주인과 mappedBy

객체와 테이블이 관계를 맺는 차이

  • 객체 연관관계 = 2개
    • 회원 -> 팀 연관관계 1개(단방향)
    • 팀 -> 회원 연관관계 1개(단방향)
  • 테이블 연관관계 = 1개
    • 회원 <-> 팀의 연관관계 1개(양방향)
    • 외래 키값 하나로 모든 연관관계가 끝이 난다.

객체의 양방향 관계

  • 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단 방향 관계 2개다.
  • 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.

테이블의 양방향 연관관계

  • 테이블은 외래키 하나로 두 테이블의 연관관계를 관리
  • MEMBER.TEAM_ID 외래 키 하나로 양방향 연관관계 가짐 (양쪽으로 조인할 수 있다.)

둘 중 하나로 외래 키를 관리해야 한다.

양방향 참조가 있으면 어떤것을 바꿔야하는지 모르기 떄문에 연관관계의 주인을 결정해야한다.

  • Member의 team값을 바꿔야 되는 건지, Team의 members를 바꿔야 되는 건지 헷갈린다.
  • 둘 중 하나를 주인을 정해야 된다 = 연관관계의 주인

연관관계의 주인

양방향 매핑 규칙

  • 객체의 두 관계 중 하나를 연관관계의 주인으로 지정
  • 연관관계의 주인만이 외래 키를 관리(등록, 수정)
  • 주인이 아닌 쪽은 읽기만 가능 
  • 주인은 mappedBy 속성 사용 X
  • 주인이 아니면 mappedBy 속성으로 주인 지정

누구를 주인으로?

연관관계 주인 정하기

  • 외래 키가 있는 있는 곳을 주인으로 정해라
  • Team의 members를 연관관계의 주인으로 정한다면 Team테이블을 변경하면 Member테이블이 변경된다.
  • DB의 입장에서 보면 많은 쪽에 외래키가 있다
  • 따라서, 외래키가 있는 사 쪽이 연관관계의 주인으로 설정하는 것이 좋다.
  • 단, 연관관계의 주인이라고, 비즈니스적으로 우위에 있는 것은 아니다(바퀴-차를 예를 들면 다인 바퀴가 주인이지만 비즈니스적으로는 차가 더 우위임으로 연관관계 주인인 것이랑 비즈니스는 아무런 연관이 없다)
728x90