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

Joon님의 프로필 이미지
Joon

작성한 질문수

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

양방향 연관관계와 연관관계의 주인 1- 기본

딜레마라고 말씀하신 부분 자체가 이해가 잘 가지 않습니다

작성

·

228

·

수정됨

1

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

양방향 연관관계와 연관관계의 주인 1-기본 편 강의에서
13:33 즈음에 딜레마라고 말씀해주신 부분에서
(제가 설계적인 센스가 있어서 그런게 아니라)
Member클래스의 team필드를 당연히 외래키와 맵핑시켜야 하는거 아닌가? 라는 생각이 들었는데 오히려 둘 다 가능하다고 하니 이해가 가질 않습니다. 어쩨사 Team 클래스의 멤버를 바꾸는데 외래키를 수정해야 하는지 자세한 설명 부탁드립니다 (뒷 내용은 Team클래스에서 연관관계를 맺지 말라고 하셨지만 이해가 안 가는건 어쩔 수 없네요)

좀 더 질문을 자세히 드리자면 13:33 이전까지 db는 외래키를 이용하기 때문에 방향의 개념이 필요없다고 하셨는데 객체는 서로 참조로 방향이라는 개념이 생긴다 이로 인해 패러다임의 불일치라는 문제가 생긴다라고 하셨는데 객체와 db의 방향성 까지는 이해했는데 패러다임의 불일치로 정확히 어떤 문제가 발생하는지 까지 이해하지 못했습니다 설명 부탁드립니다

답변 1

1

안녕하세요. Joon님, 공식 서포터즈 y2gcoder입니다.

테이블 관계에서는 외래키가 한 곳에 있는 반면, 양방향 관계에 있는 두 객체에서는 서로에 대해 참조를 가지고 있습니다.

team 의 members

member의 team

이러한 상황에서 어떤 멤버의 팀을 바꾸려면 DB에서는 member 테이블의 외래키를 수정해주면 되겠습니다 🙂

양방향 관계로 있는 객체에서는 두가지 방법이 있을 수 있습니다.

  1. team의 members를 업데이트 한다.

  2. member의 team을 업데이트 한다.

객체는 이렇게 참조값을 통해 서로 연결되어 있기 때문에 이 때 문제가 발생하게 됩니다. 어떻게 보면 객체 입장에서는 두가지 방법으로 해당 member의 team을 변경해줄 수 있기 때문입니다. 만약 객체 입장에서는 team의 members를 수정하고 member의 team을 수정해주지 않았다면? 혹은 반대로 member의 team을 수정하고 team의 members를 수정해주지 않았다면? 그래서 DB에서는 변경할 수 있는 포인트가 MEMBER 테이블의 team_id 밖에 없는 반면, 객체에서는 변경할 수 있는 포인트가 2가지가 있기 때문에, 외래키를 한 곳에서 관리할 수 있도록 명확할 룰을 정한 것이라고 이해하시면 될 것 같습니다!

말씀해주신 부분을 한 번 더 스크립트와 함께 읽어보시면 더 도움이 되실 거 같습니다 🙂 저도 처음에는 헷갈렸으나 오히려 답을 모른다고 생각하고, 천천히 읽어보니 영한님의 설명이 더 잘 이해가 되었습니다!

 

감사합니다.

Joon님의 프로필 이미지
Joon
질문자

혹시 좀 더 자세한 설명 가능할까요
member클래스의 team을 수정하면 테이블의 외래키도 바뀌어야 하는 건 이해가 갑니다만
team 클래스의 members를 수정하면 그 자체로 members의 값이 바뀌었으니 member 테이블의 외래키(team_id)의 값도 수정될 수 있다는 의미인가요?

JPA가 룰을 정하기 이전에
자바 객체를 기준으로 양방향으로 연결되어있다고 가정했을 때만을 생각해보시면 좋을 것 같습니다.
team 과 member라는 두 객체 간에 서로 참조로 연결되어있기 때문에, 객체 관점에서는 member의 team을 바꾸는 방법이 2가지가 될 수 있습니다 🙂

반면 테이블은 MEMBER 테이블의 team_id로 외래키가 잡혀있기 때문에 데이터베이스 관점에서는 MEMBER 테이블에 있는 한 member의 team을 바꾸는 방법이 한 가지 뿐입니다.

그렇기 때문에 양방향에서는 외래키를 한 곳에서만 바꿀 수 있게 하는 룰이 필요하다고 영한님께서 말씀하고 계신 것이라 저는 이해하고 있습니다 !

Joon님의 프로필 이미지
Joon
질문자

사실 영상 끝에서 보면 헷갈릴 일이 없개 n쪽을 연관 관계의 주인으로 잡고 반대쪽을 maddeby해라가 이 영상의 요점이지만
계속해서 답답한 상태여서 죄송하지만 다시 질문 드립니다.

궁금한 지점은 단 하나 입니다. 딜레마라고 말씀하셨던 13:45지점에서 어떻게 Team 클래스의 ListMembers가 업데이트 되었을 때 외래키 값인 Team_id가 업데이트 될 수 있는지 입니다.

(결국 Team 클래스의 ListMembers안에 있는 member를 수정할 때도 Member클래스 안에 세팅된 메서드들로 수정하는 거 아닌지요)

혹시 강사님께서 하신 말씀이 업데이트 한다면 Member 테이블 컬럼에 들어가는 값들 전체가 바뀐 다는 것이여서

연관관계의 주인이 필요하다는 것인지요

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

안녕하세요. Joon님

이해를 돕기 위해 데이터베이스는 생각하지 말고 객체의 연관관계만 생각해볼게요.

Member와 Team이 서로 관계가 있다고 하려면 2가지 옵션이 있습니다.

1. Member -> Team으로 연결한다. (Member.team)

2. Team -> Member로 연결한다. (Team.members 리스트에 Member를 담는다)

여기서 1번은 이해가 되실 것이니 2번으로 설명을 드릴게요.

질문하신 내용중에 다음 내용이 있는데요. 이 내용을 기반으로 답변을 드릴게요.

Q: (결국 Team 클래스의 ListMembers안에 있는 member를 수정할 때도 Member클래스 안에 세팅된 메서드들로 수정하는 거 아닌지요)

A: 아닙니다. Team.members에 Team을 넣으면 객체 입장에서는 연관 관계가 만들어집니다. team.members를 통해 team -> member로 접근할 수 있습니다. member의 속성을 전혀 건드리지 않아도 됩니다.

그래도 이해가 어렵다면 섹션 6을 모두 듣고, 반대 반향의 연관관계 까지 공부하신 다음에 다시 한번 복습해보시면, 이해가 되실거에요 :)

감사합니다.

Joon님의 프로필 이미지
Joon
질문자

강사님이 직접 답글 달아주셔서 영광입니다.

"아닙니다. Team.members에 Team을 넣으면 객체 입장에서는 연관 관계가 만들어집니다. team.members를 통해 team -> member로 접근할 수 있습니다. member의 속성을 전혀 건드리지 않아도 됩니다."
아 저는 속성들을 건드려서
원래 질문인 13:45초에서 팀에 있는 멤버들을 업데이트 했을 때 외래키 값이 업데이트가 돼야 돼? 라고 말씀하신 부분이 성립하게 되나라고 생각했는데 아니라면 어떻게 Team클래스의 members를 수정하면 외래키 값이 업데이트가 될 수 있는지가 궁금합니다.

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

Joon님 이 부분은 답변 드린 것 처럼 섹션6 강의를 끝까지 들어보시면 궁금한 부분이 해소가 되실거에요 🙂 특히 일대다 단방향 연관관계에서 해당 내용을 설명합니다.

감사합니다.

Joon님의 프로필 이미지
Joon

작성한 질문수

질문하기