강의

멘토링

로드맵

Inflearn brand logo image

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

nickheatlhy님의 프로필 이미지
nickheatlhy

작성한 질문수

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

페치 조인 1 - 기본

join fetch를 사용하지 않아도 쿼리가 한번 조회

해결된 질문

작성

·

79

·

수정됨

1

6:46초에서 설명하시는대로 패치 조인을 사용하지 않고, 기본 조회만 했을 때 프록시로 인해 지연 로딩이 발생할 것으로 기대했으나, 마치 패치 조인처럼 한번만 조회되고 모든 데이터가 출력됩니다.

원인을 잘 모르겠는데 알려주세요.

  • Team은 LAZY 조인으로 설정되어 있음

Team teamA = new Team();
teamA.setName("teamA");
em.persist(teamA);

Team teamB = new Team();
teamB.setName("teamB");
em.persist(teamB);

Member member1 = new Member();
member1.setUsername("USER1");
member1.changeTeam(teamA);
em.persist(member1);

Member member2 = new Member();
member2.setUsername("USER2");
member2.changeTeam(teamA);
em.persist(member2);

Member member3 = new Member();
member3.setUsername("USER3");
member3.changeTeam(teamB);
em.persist(member3);

List<Member> noFetchJoin = em.createQuery("SELECT m FROM Member m", Member.class).getResultList();
for (Member member : noFetchJoin) {
    System.out.println("member: " + member.getUsername() + " | Team: " + member.getTeam().getName());
}

 

결과:

image.png

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. nickheatlhy님.

질문을 읽어보니, 여러분의 코드에서 예상과 달리 패치 조인을 사용하지 않았음에도 불구하고 쿼리가 한 번의 호출로 모든 데이터가 조회되는 현상을 보셨습니다. 이는 Java Persistence API (JPA)에서의 약간의 트릭을 이해하시면 쉽게 설명할 수 있습니다.

일반적으로 지연 로딩(LAZY)은 실제 데이터가 필요할 때까지 연관된 데이터를 불러오지 않습니다. 하지만, 코드에서 보듯이 Member의 team 필드를 사용할 때마다 지연 로딩을 통해 새로운 쿼리를 수행해야 합니다. 그러나 이번 경우 결과처럼 스크린에 보이는 모든 데이터가 한 번에 조회된 것은, 다음과 같은 몇 가지 이유가 있을 수 있습니다:

  1. 1차 캐시 또는 영속성 컨텍스트의 활용: em.persist()를 통해 teamAteamB가 이미 영속성 컨텍스트에 저장되어 있을 것입니다. JPA는 이미 영속성 컨텍스트에 있는 엔티티에 대해는 데이터베이스 조회를 하지 않고 바로 값을 가져옵니다.

  2. Persistent Context: 만약 연관된 엔티티가 이미 Persistent Context(영속성 컨텍스트)에 있다면 추가 쿼리 없이 데이터를 가져올 수 있습니다.

  3. 배치 사이즈: 일부 JPA 구현체는 기본적으로 지연 로딩을 최적화하기 위해 직접 또는 배치(batching)를 사용하여 여러 개의 Fetch를 병합할 수 있습니다.

  4. Hibernate의 동작: JPA의 구현체로 많이 사용되는 Hibernate는 최적화의 일환으로 필요한 데이터를 얻게 되면 적절히 내부적으로 패치 전략을 취할 수 있습니다.

강의 중간에 이러한 상황과 관련된 동작에 대한 안내가 있었다면, 그것을 바탕으로 자신의 설정 및 환경을 검토하는 것이 필요합니다.

더 깊은 이해를 위해, 아래의 관련된 답변도 확인해 보시면 도움이 될 것입니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

nickheatlhy님의 프로필 이미지
nickheatlhy

작성한 질문수

질문하기