연관관계 매핑 질문드립니다.
77
90 asked
강의 13:30분 부터 설명하시는 부분에 대한 질문입니다.
해당 부분은 Member의 팀 값을 변경했을때 DB의 Member의 외래키(TEAM_ID)가 변경되어야하는지, Team의 멤버들을 업데이트 했을 때 외래키 값이 업데이트 돼야하는지에 대한 내용인데요.
전자는 코드상으로
member.setTeam(team)이 될것이고
후자는
team.getMembers().addMember(member)가 될텐데요.
전자는 이전 강의인 단방향 연관관계에서도 봤듯이 해당 코드를 진행하면 DB Member의 외래키 업데이트가 자동적으로 이루어 지는 것으로 이해하고 있습니다
후자는 후자의 코드를 진행해도 FK 업데이트가 이루어 지지 않는 것으로 알고 있습니다.(Team에는 외래키가 없는 것이 원인으로 알고있습니다.)
그래서 영상에서 말씀하신 둘중 무엇으로 외래키를 업데이트 해야하냐 같은 딜레마라고 언급하신 것이 이해가 잘 되질 않습니다.
어차피 후자의 코드자체가 외래키가 업데이트 되지 않는 코드인데 강의에서 언급하신 전자, 후자 중 어느 것으로 업데이트 해야 하는지에 대한 딜레마가 나온 이유를 모르겠습니다.
이부분을 어떻게 이해하여야할까요?
Answer 2
0
안녕하세요. yoon6669님, 공식 서포터즈 David입니다.
외래키 관리의 주체를 정하는 부분에 있어서 딜레마가 생긴다는 것입니다.
객체 관점에서만 보면 Team이든 Member든 DB에 외래키를 업데이트만 잘 해주면 됩니다.
그러면, Team과 Member 둘 중에 어느 것을 통해 외래키가 업데이트 되도록 하면 좋을까요? (이 부분이 딜레마라는 것입니다.)
이에 대한 부분을 JPA 사용 관점에서 명확하게 가이드해 드리는 부분이 '외래키가 있는 곳을 주인으로 정해라'입니다.
감사합니다.
1
감사합니다.
그럼 team.getMembers().addMember(member) 같이 실제 외래키가 업데이트 되냐 마냐의 문제는 차치하고 순수하게 객체의 관점에서만 따져봤을 때, 둘다 외래키를 변경 할 수 있는 가능성(?)이 있으니 어느 쪽을 기준으로 업데이트를 해야하냐의 문제라는 말씀인거죠?
0
안녕하세요, 인프런 AI 인턴입니다. yoon6669님.
JPA의 양방향 연관관계에서는 실제 데이터베이스 내 외래키 업데이트가 수행되는 ‘주인’이라고 부르는 방향이 존재합니다. 즉, 양방향 매핑 시 어느 한쪽은 실제 데이터베이스의 외래키 값 변경을 담당하게 됩니다. 이를 ‘연관관계의 주인(owner)‘이라고 하며, 주로 다대일(N:1) 관계의 ‘N’(다수) 쪽인 Member 클래스에서 관리합니다.
Member 엔티티의 ‘setTeam()’ 메서드를 통해 변경을 수행할 경우에는 외래키 업데이트가 자동으로 이뤄지며, ‘Team’ 클래스에 멤버를 추가하는 경우는 단순히 메모리 상의 계층 구조만 변경되는 것입니다. 이렇게 인해 혼란이 생길 수 있는 지점은, 양방향 매핑에서 객체 연산과 데이터베이스 동작 간의 차이점 때문입니다.
JS에서, 객체 관계에만 집중한다면 Member의 team을 통해 변경할 수 있고, Team의 members 컬렉션을 통해서도 비슷하게 보일 수 있지만, 데이터베이스 입장에서의 실질적인 FK 값 변경은 Member에서만 가능합니다.
아래 추가 설명 자료를 통해 이와 관련된 상세한 해설과 코드 예시를 참고하실 수 있습니다:
https://www.inflearn.com/questions/25417 - changeTeam 관련하여 질문 있습니다.
- 김영한님은 이곳에서 연관관계의 주인 객체를 정확히 설정해야 한다고 설명하고, 객체의 실용적인 사용에서도 혼란을 방지할 수 있는 방법을 제시합니다.
- 김영한님은 이곳에서 연관관계의 주인 객체를 정확히 설정해야 한다고 설명하고, 객체의 실용적인 사용에서도 혼란을 방지할 수 있는 방법을 제시합니다.
https://www.inflearn.com/questions/1339813 - 딜레마라고 말씀하신 부분 자체가 이해가 잘 가지 않습니다.
- 패러다임의 불일치 문제를 해결하기 위해 JPA에서 직접적으로 설정 가능한 방법이 무엇인지에 대한 논의입니다.
- 패러다임의 불일치 문제를 해결하기 위해 JPA에서 직접적으로 설정 가능한 방법이 무엇인지에 대한 논의입니다.
이 내용이 도움이 되셨길 바랍니다. 추가적인 도움이 필요하시다면, 질문을 이어가주시면 좋겠습니다. 감사합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
실무 조언 관련 질문입니다.
0
36
1
H2데이터베이스 파일 생성
0
45
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
47
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
45
1
JPQL 메소드와 락
0
47
1
Delivery @OneToOne
0
54
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
84
2
UnsupportedOperationException 발생
0
80
3
H2 Database 연결이 안됩니다.
0
86
2
h2데이터베이스 실행오류
0
103
2
persistence.xml
0
100
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
74
1
영속성 컨텍스트
0
59
1
JPA 프록시
0
86
1
Native Query와 MyBatis
0
60
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
81
1
임베디드 타입 예시 코드 관련 질문
0
110
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
89
3
인텔리제이 패키지 커서 단축키 질문
0
100
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
133
1
양방향 연관관계 시 연관관계 주인을 설정하는 이유
0
67
1
임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.
0
95
1
데이터베이스가 초기화되는 것 같아요
1
172
2
getReference()하면 영속성 컨텍스트에 속하게 되나요?
0
74
1

