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

공부싫어님의 프로필 이미지
공부싫어

작성한 질문수

실전! 스프링 데이터 JPA

@EntityGraph

편의성 메소드에 대한 질문입니다.

해결된 질문

작성

·

415

0

 

jpa 강의들을 보다보면

entity 간에 양방향 연관관계를 설정한 경우

위처럼 changeTeam 메소드를 추가 해주셨는데요.

this.team = team; 의 경우 외래키(연관관계 주인) 이기 때문에 필요한 것은 이해를 했습니다.

 

그런데 team.getMembers().add(this); 부분의 경우

기존에 member 테이블에 값들이 존재하고, 신규 회원이 새로운 트랜잭션에서 join 로직을 실행했을때,

해당 로직에서 생성된 team.members에는 기존의 member 값들은 add 되어있지 않은 상태일텐데, team.members를 제대로 사용이 가능한가 해서 질문드립니다.

 

제 생각에는 team.members를 정상적으로(?) 사용하려면 team과 member를 join 으로 가져 온뒤에 사용이 가능할 것 같습니다.

 

list에 add 하는것만으로는 query가 발생하는게 아닌것으로 알고있습니다.

 

제가 이해를 잘 못 하고 있는 부분이 있는걸까요?

아니면 단순히 편의성 메소드의 예시로 작성을 하시는건지 궁금합니다.

 

 

 

답변 1

1

안녕하세요. 공부싫어님, 공식 서포터즈 David입니다.

이해하고 계신대로 Team쪽 members는 읽기전용입니다. Team.members에 member가 추가된다고 데이터베이스에 반영되진 않습니다.

다만, 양방향 연관관계의 싱크를 맞춰주기 위해 changeTeam을 통해 Team쪽의 members에 새롭게 생성된 member를 추가하게 됩니다.

신규회원에 의해 새로운 트랜잭션이 시작될 경우, 이전에 생성된 Member가 데이터베이스에 저장되기 전, 후에 따라 달라집니다. 만약 이전에 생성된 Member가 저장된 후 신규회원에 의해 새로운 트랜잭션이 생성될 경우 이전에 생성된 Member가 Team내 members에 추가된 상태로 불러오게 될 것입니다.

감사합니다.

공부싫어님의 프로필 이미지
공부싫어
질문자

답변 감사합니다.

그런데 여전히 제가 이해하지 못한 부분이 있는거같아요.

예를들어 memberA가 데이터베이스에 들어가고 트랜잭션이 종료가 되면 영속성 컨텍스트도 사라지게 되는게 아닌건가요?

새로운 트랜잭션이 생성되고 새로운 memberB가 저장됐을때, 어떻게 team.members의 리스트에 memberA가 추가된 상태로 불러와지는게 가능한가요?

 

새로운 트랜잭션 내에서 데이터베이스로부터 memberA가 추가되었던 Team을 불러오게 되면, memberA가 추가된 상태로 불러와집니다.

공부싫어님의 프로필 이미지
공부싫어
질문자

제가 질문을 이상하게 드리긴 했는데, 아무튼 원하는 답변은 해주셨네요 ㅋㅋ

답변 감사합니다

공부싫어님의 프로필 이미지
공부싫어

작성한 질문수

질문하기