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

LUA님의 프로필 이미지
LUA

작성한 질문수

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

양방향 연관관계와 연관관계의 주인 2 - 주의점, 정리

질문드립니다.

작성

·

163

3

강의 영상의 9분 45초 쯤에 양쪽(member와 team)에 다 값을 넣어야하는데  Owner인 member에만 값을 넣어도 문제는 발생한다!

라는점을 설명해주실 때 이해가 안되서 질문드립니다. 제가 나름대로 이해하기로는

 new team()을 통해 팀을 만들어서 persist()를 하면 영속성컨텍스트의 1차 캐시에만 값이 존재하고 아직 sql저장소에 저장만 되어있을 뿐 실제쿼리를 안날리기떄문에 아직 DB는 안들어가있는 상태이다. 그런데 이상태에서 em.find()를 하니까 DB에서 값을 찾아오려고 해도 값이 없어서 반복문을 실행하며 System.out.print를 하려고 해도 아무값도 출력이 안되는 것이다.

저는 이렇게 이해를 하고있는데 제가 이해하고 있는부분이 맞을까요??

9분 52초 정도부터 말씀해주시는 "team에 컬렉션에 아무것도 없단말이에요 메모리 아무것도 없이 그대로 가져온 상태에요, 순수한 객체상태라고 보시면되요 그걸 그대로 가져오면 컬렉션에도 값이 없죠" 라는 말씀이 무슨 뜻인지 잘 이해가 안됩니다 슨생님... ㅜㅜ

답변 1

5

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

안녕하세요 LUA님^^! 좋은 질문입니다.

member -> team의 관계를 설정하고, team -> member의 관계를 설정하지 않으면? 어떻게 될까요?

em.persist(member) 를 호출하면 JPA는 member 인스턴스 객체를 현재 상태 그대로 영속성 컨텍스트에 저장합니다.

그런데 이 영속성 컨텍스트에 저장한 member 객체가 문제입니다.

member.getTeam()을 호출하면 team을 찾을 수 있는데, team.getMembers()를 호출하면 여기에는 아무것도 없는 상태입니다. 왜냐하면 양쪽을 설정하지 않고 한쪽만 설정하고 저장했기 때문입니다.

영속성 컨텍스트는 한번 저장하면 영속성 컨텍스트를 삭제하기 전까지 유지됩니다. 당연히 그 안의 객체들도 유지됩니다. 그래서 이후에 em.find(member)를 호출하면, 방금 영속성 컨텍스트에 저장해둔 그 member 인스턴스가 조회됩니다.

여기서 member.getTeam()을 호출하고, team.getMembers()를 호출하면 아무것도 없습니다.

왜냐하면 앞서 말씀드린 것 처럼 양쪽을 설정하지 않고 한쪽만 설정하고 저장했기 때문입니다!

그런데! 여기서 부터가 중요합니다.

앞서 저장 요청이 완전히 끝나고 새로운 요청이 왔을 때 새로운 영속성 컨텍스트에서 em.find(member)를 호출하면 어떻게 될까요?

새로운 영속성 컨텍스트는 member가 없기 때문에 DB에서 새로 member를 조회하고, JPA가 member 객체를 생성합니다.

그리고! JPA가 member 객체를 생성할 때, 연관관계 매핑이 되어 있기 때문에  member.getTeam()은 물론이고, team.getMembers() 모두 값을 채워줍니다.(물론 지연 로딩을 사용할 수도 있습니다.)

방금 말씀드린 부분을 코드로 짜서 하나씩 실행을 해보면 이해가 되실꺼에요^^!

LUA님의 프로필 이미지
LUA

작성한 질문수

질문하기