작성
·
368
1
안녕하세요.
엔티티가 Member, Team 이렇게 있을 때, 멤버 1명이 팀을 옮기게 되면 add(member)를 해주고 team에서 기존 멤버를 빼주는 게 맞지만
db 관점에서는 괜찮지만 어플리케이션에서는 지워주는게 맞다고 하셨는데요
이 부분이 잘 이해가 가지 않습니다.
해당링크 : (https://www.inflearn.com/questions/25417)
우선 제가 현재 이해하고 있는 것을 말씀드려보겠습니다.
저는 엔티티가 곧 테이블이라고 이해하고 있습니다. (틀리다면 정정해주시면 감사합니다)
Member, Team 테이블이 각각 있을 때
Team에는 team_id, team_name, list team member
이렇게 설계가 되는 것까지는 이해했습니다.
이 team 에서 list 는 실제 member 데이터가 삽입되는 것이 아니고 team에 있는 team_id를 통해 member 테이블에서 team으로 fk를 걸어 놓은 것으로 알고 있습니다.
member가 team을 옮기게 될 경우, member가 team 에 걸어놓은 fk가 변경이 되기 때문에 member 쪽에서만 update 해줘도 된다고 이해하고 있고요.
db 관점에서 괜찮다고 하시는 부분은 아마 이 부분을 말씀하시는 거 같고, 어플리케이션 관점은 영속성 컨택스트에서 관리되고 있는 데이터를 말씀하시는 것 같은데
제가 제대로 이해하고 있는 게 맞을까요?
맞다면 후자의 경우에는 영속성에서 관리되는 부분을 끊으면 된다는 이야기(비영속으로 적용)인 걸까요?
감사합니다.
답변 1
1
안녕하세요. 해마님, 공식 서포터즈 David입니다.
양방향 연관관계를 가지는 객체 관점에서 데이터가 등록, 수정, 삭제 되었을 때 DB에 반영되는 쪽은 연관관계 주인(강의 내용상 Member 객체 내 team) 쪽입니다.
그 반대편인 Team의 List<Member> members(이하 members)는 객체 관점에서 양방향 연관관계를 구현하기 위해 추가한 것입니다. 그리고 연관관계 주인에 매핑된 members 특성상 데이터가 등록, 수정, 삭제 되더라도 DB에 반영되진 않습니다.
이 특성에 따라 링크하신 질문 글의 답변을 생각해보면, Member(연관관계 주인)의 team을 변경(changeTeam())했을 때는 DB에 반영됩니다. 그러면 객체 관점에서 생각해보면 당연히 Team 내 members에서 특정 member를 지워주어야 합니다. 팀이 바뀌었으니깐요. 그런데 DB 관점에서는 굳이 지워주지 않아도 괜찮다는 것입니다. 왜냐하면 이미 Member가 team을 변경하기만 해도 Member 테이블의 team fk가 변경되었기 때문입니다. 그러나 Team의 members는 연관관계 주인이 아니기 때문에 members에서 특정 member를 지워도 데이터베이스에는 반영되지 않습니다.
결론적으로 객체 관점에서는 팀을 변경한 멤버를 팀 객체의 멤버 목록에서 지워주는 게 맞지만 보통 변경된 데이터를 즉시 사용하는 경우는 드물기에 지워주는 로직을 추가하지 않았다고 보시면 됩니다.
혹시나 이 부분이 잘 이해가 되지 않으시다면 본 강의 '양방향 연관관계와 연관관계의 주인 1, 2'편을 반복 수강하시길 권장드립니다.
감사합니다.