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

leech2479님의 프로필 이미지
leech2479

작성한 질문수

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

즉시 로딩과 지연 로딩

즉시 로딩 상황에서 select문 호출에 대해 질문드립니다.

해결된 질문

작성

·

72

·

수정됨

0

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

[질문 내용]
Member 클래스의 team이 즉시 로딩으로 설정된 상황에서 아래 코드와 같이 실행 했을 때, team 엔티티의 select문이 한번 밖에 호출 되지 않습니다.
저는 member 엔티티를 다 순회하면서 select문을 호출 할 것으로 예상했는데, 이 경우는 어짜피 각 member들의 team이 모두 같기 때문에 JPA에서 알아서 해당 team만 호출 하는 것인가요? 이부분이 궁금하여 질문 드립니다.

Team team = new Team();
team.setName("Team 1");
em.persist(team);

Team team2 = new Team();
team2.setName("Team 2");
em.persist(team2);

Member member = new Member();
member.setUsername("user1");
member.setTeam(team);
em.persist(member);

Member member2 = new Member();
member2.setUsername("user2");
member2.setTeam(team);
em.persist(member2);


em.flush();
em.clear();

List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();

tx.commit();

답변 1

1

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

leech2479님의 질문에 대해, 즉시 로딩(EAGER) 방식에서 엔티티를 조회할 때 발생하는 select 문의 호출 횟수와 관련된 궁금증 해결에 도움이 될만한 정보를 찾았습니다.

즉시 로딩(EAGER) 설정이 있는 관계에서 JPA를 사용하면 연관된 엔티티를 조회할 때 해당 엔티티를 함께 가져오기 위해 보통 추가의 select 문이 실행됩니다. 하지만, JPQL을 사용하여 조회를 할 때는 이와 다르게 동작할 수 있는데, JPQL 쿼리 실행 시 모든 관련 엔티티를 미리 로딩하기보다는 실제로 해당 엔티티에 접근할 때 추가 쿼리를 실행하여 가져오는 방식(LAZY)으로 동작할 수 있습니다. 이는 JPA 구현체와 설정에 따라 다를 수 있습니다.

아래의 내용은 leech2479님의 상황과 유사한 문의에 대한 답변 예제입니다:

  • 즉시로딩 메커니즘에 대해 질문 드립니다.에서는 즉시 로딩으로 설정된 MemberTeam의 관계에서 실행된 JPQL 쿼리와 select 문의 실행에 대한 설명이 포함되어 있습니다. 질문자는 즉시 로딩 설정에도 불구하고 실제로 어떠한 경우에 select 문이 실행되는지에 대한 궁금증을 가지고 있었고, 답변에서는 즉시 로딩이 실행되는 과정과 영속성 컨텍스트의 역할에 대해 설명하고 있습니다.

이 경우와 마찬가지로, 여러분의 코드에서도 Member 엔티티를 조회할 때 Team 엔티티에 대한 select 문이 한 번만 호출되는 현상은 해당 Team 엔티티가 이미 영속성 컨텍스트 내에 존재하기 때문에 추가적인 select 문 없이 접근이 가능했을 가능성이 있습니다. 그리고 모든 memberTeam이 같기 때문에 JPA 구현체가 최적화를 통해 한 번만 쿼리를 실행하는 것일 수 있습니다.

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

leech2479님의 프로필 이미지
leech2479

작성한 질문수

질문하기