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 |