• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

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

23.08.30 22:29 작성 23.08.30 22:32 수정 조회수 298

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님의 프로필

David

2023.08.31

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

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

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

감사합니다.