Spring JPA [활용] (컬렉션 조회) DTO 직접조회, API 개발 고급 정리

신재원·2023년 2월 15일
0

Spring JPA 활용

목록 보기
15/18

To One 관계들을 먼저 조회하고, To Many관계는 각각 별도로 처리한다.

  • To One 관계는 조인해도 데이터 row 수가 증가하지 않는다.
  • To Many 관계는 조인하면 row 수가 증가한다.

row 수가 증가하지 않는 (To One) 관계는 최적화 하기 쉬움으로 한번에 조회하고, To Many 관계는 최적화하기 어려움으로 findOrderItems() 같은 별도의 메서드로 조회한다.

  • 사용 예시
    ( select 문에 new 오퍼레이터를 사용해 패키지명을 다적어준다)

컬렉션 조회 최적화 (map 사용)

  • 위의 사용 예시는 컬렉션 조회시 루프문을 돌게 된다.
    • "where oi.order.id in :orderId" in문을 사용, Map을 사용해 매칭 성능을 향상 시킨다.

📌 정리

엔티티 조회

    1. 엔티티를 그대로 조회해서 그대로 반환 (엔티티를 외부 노출 X, 사용X)
    1. 엔티티 조회후 DTO로 변환
    1. 패치 조인으로 쿼리 수 최적화
  • 컬렉션 페이징과 한계 돌파
    : 컬렉션은 페치 조인시 페이징이 불가능
    To One 관계는 페치 조인으로 쿼리 수 최적화
    컬렉션은 페치 조인 대신에 지연로딩 (LAZY)을 유지하고, hibernate.default_batch_fetch_size, @BatchSize로 최적화

DTO 직접 조회

  • JPA에서 DTO를 직접 조회
  • 컬렉션 조회 최적화
    : 일대다 관계인 컬렉션은 IN 절을 활용해서 메모리에 미리 조회해서 최적화
  • 플랫 데이터 최적화
    : JOIN 결과를 그대로 조회 후 애플리케이션에서 원하는 모양으로 직접 변환

권장 순서

  1. 엔티티 조회 방식으로 우선 접근
    1. 패치 조인으로 쿼리 수를 최적화
    2. 컬렉션 최적화
    • 페이징이 필요 ? : hibernate.default_batch_fetch_size, @BatchSize로 최적화
    • 페이징이 필요 X : 패치 조인 사용
  2. 엔티티 조회 방식으로 해결이 안되면 DTO 조회 방식 사용
  3. DTO 조회 방식으로 해결이 안되면, NativeSQL or 스프링 JdbcTemplate

✔ 참고

엔티티 조회 방식은 패치 조인이나,hibernate.default_batch_fetch_size, @BatchSize 같이 코드를 거의 수정하지않고, 옵션만 약간 변경해서, 다양한 성능 최적화를 시도할 수있다. 반면에 DTO를 직접 조회하는 방식은 성능을 최적화 하거나 성능 최적화 방식을 변경할때 많은 코드를 변경해야 한다.

📍 캐시 사용시 엔티티로 사용 X, 꼭 DTO 클래스를 만들어서 사용

0개의 댓글