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

황지호님의 프로필 이미지

작성한 질문수

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

즉시 로딩과 지연 로딩

자바 ORM 표준 JPA 프로그래밍 기본 - 8.프록시와 연관관계 관리

23.08.30 22:29 작성

·

341

·

수정됨

0


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

[질문 내용]
즉시로딩과 지연로딩 파트 설명해주실때 질문이 있습니다.

fetch = FetchType.LAZY)로 지연로딩을 사용해서 프록시로 조회한다고 하시면서 코드로 설명해 주실때

Team만들고 em.persist(team);

Member 만들고 em.persist(member);

em.flush();

em.clear();

Member m = em.find(~~);

m.getTeam().getName();

이 부분에서 마지막 m.getTeam().getName(); 이 부분할때 db에 쿼리가 나간다고 하셨는데 왜 쿼리가 나가는 건가요?? em.find로 db에서 찾은 객체가 영속성 컨텍스트에 올라와 있어서 쿼리문을 안날려도 되는거 아닌가요??

 

그리고 지연로딩할때 Member클래스의 Team 필드에만 지연로딩을 적용했는데 JpaMain 클래스에서 em.find(Member.class,~~);로 객체 찾을때 이 Member 클래스 자체가 프록시가 되는건가요???

답변 1

0

David님의 프로필 이미지

2023. 08. 31. 21:51

안녕하세요. 황지호님, 공식 서포터즈 David입니다.

  1. 지연로딩의 의미를 다시 생각해보시면, 멤버를 조회할 때 팀까지 조회하지 않고 팀의 필드에 접근할 때 로딩을 하게 됩니다. 즉, 팀의 조회를 지연시키는 것입니다. 따라서, 멤버를 조회했음에도 팀의 필드에 접근할 때 팀을 조회하는 추가 쿼리가 발생하게 됩니다.

  1. 2분 38초쯤 설명하시는 것처럼, 멤버는 멤버 객체이고, 팀은 프록시 객체가 주입됩니다.

감사합니다.