인프런 커뮤니티 질문&답변

김선도님의 프로필 이미지
김선도

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

연관관계 주인 관련 질문 드립니다.

작성

·

245

0

안녕하세요 영한님 강의 잘 듣고 있습니다!

연관관계 매핑 기초에서 양방향 연관관계 관련 질문이 있습니다.

우선 제가 이해한 것은,

테이블은 PK - FK로 양방향이 구현됩니다.

객체는 Member의 team / Team의 members로 단방향이 2개로 양방향을 구현이 됩니다.

그래서 객체와 테이블을 매핑하기 위해서는 하나의 단방향 2개인 것 중에서 1개를 선택해줘야한다.

이것이 연관관계의 주인이다.

이렇게 이해한 상황입니다.

만약, Team을 바꾼다고 하면

Member의 team 필드를 바꿔서 할지, 아니면 Team의 members를 통해서 수정할지 하나를 정해줘야 한다고 했습니다.

(이 의미 자체가 단방향이 2개이기 때문에 생기는 문제라고 이해했습니다)

그런데 왜 하나를 정해줘야하는 건가요? 둘의 방법을 모두 이용해서 Team을 바꿀수는 없나요? 이게 단방향이 2개인 객체의 관계에서 하나의 주인을 선택해줘야하는 것과 무슨 관계가 있는지 궁금합니다.

답변 1

2

1. 가장 기본적인 문제는 테이블 정의부터가 제대로 안 됩니다.
이해하신 것처럼 DB는 외래키 하나로 양방향이 가능한데, 객체는 단방향 참조 두 개로 이를 흉내냅니다.
반대로 양방향으로 연결되도록 엔티티를 설계하면 DB입장에서는 이게 하나의 연관관계를 양방향으로 흉내낸건지 두 개의 연관관계가 필요한건지 모르게 됩니다.

실제로 강의에 나온 Member와 Team 예제에 있어서, mappedBy를 넣지 않고 ddl-auto crreate로 돌려보시면 team -> member 일대다 연관관계를 맵핑하기 위한 테이블이 하나 더 추가로 생성됩니다. 


Hibernate: create table member (member_id bigint not null, team_id bigint, primary key (member_id))
Hibernate: create table team (team_id bigint not null, primary key (team_id))
Hibernate: create table team_team (team_team_id bigint not null, team_member_id bigint not null   

연관관계의 주인 개념이 있어야 우리가 설정한 양방향 관계가 TABLE 개념에서의 연관관계 하나임을 보장할 수 있습니다.

2. 영속성 컨텍스트 변경감지 기준
member.setTeam(), team.addMember()를 모두 허용하게 되면 영속성 컨텍스트가 너무 복잡해집니다.

경우에 따라서 update 쿼리가 두 번 나가게 될 수 있고 (양쪽 연관관계가 모두 업데이트 된 경우), 이를 최적화하기 위한 추가적인 연산도 많을 것 입니다.

또한 양쪽 연관관계가 모순되는 경우에는 어떻게 처리할지에 대한 규약도 훨씬 복잡해집니다.
예컨대 team.members에는 member1이 있는 상태에서 member1.setTeam(null) 을 한 경우 어느쪽을 따라야 하는가? 등등..

김선도님의 프로필 이미지
김선도
질문자

자세한 답변 감사드립니다!

김영한님의 프로필 이미지
김영한
지식공유자

감사합니다. 임세준님

김선도님의 프로필 이미지
김선도

작성한 질문수

질문하기