inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

349

ㅎㅇㅎㅇㅎㅇ

작성한 질문수 25

0

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

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

우선 제가 이해한 것은,

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

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

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

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

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

만약, Team을 바꾼다고 하면

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

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

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

JPA java

답변 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) 을 한 경우 어느쪽을 따라야 하는가? 등등..

0

ㅎㅇㅎㅇㅎㅇ

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

0

김영한

감사합니다. 임세준님

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

28

2

inheritance startegy 선택시 고려사항

0

22

1

Entity 동등성 비교

0

21

1

실무 조언 관련 질문입니다.

0

47

1

H2데이터베이스 파일 생성

0

56

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

53

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

52

1

JPQL 메소드와 락

0

55

1

Delivery @OneToOne

0

60

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

94

2

UnsupportedOperationException 발생

0

86

3

H2 Database 연결이 안됩니다.

0

95

2

연관관계 매핑 질문드립니다.

0

85

2

h2데이터베이스 실행오류

0

108

2

persistence.xml

0

108

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

80

1

영속성 컨텍스트

0

66

1

JPA 프록시

0

96

1

Native Query와 MyBatis

0

70

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

87

1

임베디드 타입 예시 코드 관련 질문

0

115

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

95

3

인텔리제이 패키지 커서 단축키 질문

0

108

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

145

1