본문 바로가기
강의 정리/스프링 부트와 JPA활용 2

1. 지연 로딩과 조회 성능 최적화

by 이석준석이 2021. 1. 7.

1. 순환참조가 있는 엔티티를 직접 반환하는 API 의 문제점과 해결책

 

  • 순환참조가 있는 엔티티를 반환하는 api를 사용하면 순환참조로 인한 무한루프가 발생
    • 해결책 (비추천) :
      • @JacksonIgnore
  • FetchType.LAZY 인 경우, 프록시를 통한 가짜 객체를 생성하는데, Jackson이 파싱하지 못하는 에러 발생
    • 해결책 (비추천) :
      • implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5' 모듈을 등록
      • Hibernate5Module을 빈으로 등록하여 프록시는 Jackson 이 파싱하지 않도록 함

 

애초에 엔티티를 직접 반환하지말고, DTO로 변환하는 정책을 사용하자.


2. Dto 로 감싸서 반환하도록 하는 API 로 변경

 

  • 엔티티를 Dto로 변환하여 Jackson 을 통해 json 으로 반환하므로 순환참조는 발생하지 않음

문제점

  • 연관관계가 묶여있는 경우 묶여있는 연관관계를 조회할 시, N+1 문제 발생

3. Fetch Join 을 사용하여 N+1 최적화

 

  • fetch join을 이용하여 한번에 쿼리를 가져와서 최적화를 하여 N+1 문제를 발생하지 않도록 함

예시)

return em.createQuery(
        "select o from Order o" +
        " join fetch o.member m" +
        " join fetch o.delivery d", Order.class).getResultList();

 


4. JPA에서 애초에 DTO로 조회하여 오는 방법

 

  • dto로 가져오는 방식을 통해서 select 문의 쿼리 최적화
  • 재사용성은 없지만 하나의 쿼리에 대해서는 최적화가 가능하다.
return em.createQuery("select new jpabook.jpashop.repository.OrderSimpleQueryDto(o.id, m.name, o.orderDate, o.status, d.address)" +
        " from Order o" +
        " join o.member m" +
        " join o.delivery d", OrderSimpleQueryDto.class).getResultList();

'강의 정리 > 스프링 부트와 JPA활용 2' 카테고리의 다른 글

3. OSIV와 성능 최적화  (0) 2021.01.09
2. 컬렉션 조회최적화  (0) 2021.01.09