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

H K님의 프로필 이미지
H K

작성한 질문수

스프링과 JPA 기반 웹 애플리케이션 개발

모임 목록 조회

안녕하세요 기선님 질문이있습니다..

작성

·

136

0

음.. 다시 쿼리를 보는데

@GetMapping("/events/{id}")
public String getEvent(@CurrentUser Account account, @PathVariable String path, @PathVariable Long id,
                       Model model) {
    model.addAttribute(account);
    model.addAttribute(eventRepository.findById(id).orElseThrow());
    model.addAttribute(studyService.getStudy(path));
    return "event/view";
}

이쪽을 탈때

 

쿼리가 총 3개 나가는건 이해 했는데

 

마지막에 enrollment 엔티티 가져올때 쿼리리는 왜

account 랑만 조인 하나요 ?

연관관계를 보면 Event도있는데

Event도 조인해야 하는거 아닌가요 ??

@ManToOne 관계라 Eager 모드 아닌가요 ??

 

 

 

답변 1

0

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

다음으로 질문하신 내용은 @ManyToOne 관계와 Eager, Lazy 로딩에 대해 관련된 부분입니다.

JPA에서 @ManyToOne 관계는 기본적으로 Eager 로딩(strategy)을 가집니다. 이는 관계가 설정된 엔티티를 조회할 때 연관된 엔티티도 함께 조회하기위해 즉각적으로 데이터베이스를 통해 로딩한다는 것을 의미합니다. 따라서, 이론적으로는 Enrollment 엔티티를 조회할 때 Event 엔티티도 함께 조회(조인)되어야 합니다.

그러나, 실제로 쿼리가 어떻게 실행되고 조인이 이루어지는지는 여러 요소에 의존합니다. 예를 들어, Spring Data JPA의 Repository 메서드 중 명시적으로 조인을 지정하지 않았거나, @EntityGraph 어노테이션을 사용하여 특정 연관관계를 Eager 또는 Lazy 로딩으로 명시적으로 변경했을 수도 있습니다.

또한, OpenEntityManagerInViewInterceptor 설정에 따라서도 영향을 받을 수 있습니다. Spring Boot에서는 웹 애플리케이션을 운영할 때에 ‘Open EntityManager in View’ 패턴을 기본적으로 적용하여 웹 뷰에서 지연 로딩(lazy loading)을 가능하게 합니다. 만약 이러한 행위를 원치 않는 경우, ‘application.properties’에서 spring.jpa.open-in-viewfalse로 설정해야 합니다.

Spring Boot Reference Documentation 관련 내용

이러한 설정이나 사용한 Repository 메서드에 따라 실제 데이터베이스에서 실행되는 쿼리와 조인되는 테이블이 달라질 수 있습니다. 따라서, 여러분의 코드에서 Event 엔티티가 조인되지 않았다면, 이는 JPA 구현, 구성, 또는 사용한 Repository 메서드의 특정 방식 때문일 가능성이 큽니다.

H K님의 프로필 이미지
H K
질문자

@EntityGraph 도 따로 설정하지 않은걸로 보입니다

H K님의 프로필 이미지
H K

작성한 질문수

질문하기