API 개발 고급 정리

2023. 1. 11. 02:00·BackEnd/실전! 스프링 부트와 JPA 활용2

지금까지 내용 정리

엔티티 조회

  • 엔티티를 조회해서 그대로 반환: V1
  • 엔티티 조회 후 DTO로 변환: V2
  • 페치 조인으로 쿼리 수 최적화: V3
  • 컬렉션 페이징과 한계 돌파: V3.1 -> 컬렉션은 페치 조인 시 페이징이 불가하다. ToOne 관계는 페치 조인으로 쿼리수를 최적화하고 컬렉션은 패치 조인 대신에 지연 로딩을 유지한다. hibernate.default_batch_fetch_size , @BatchSize로 최적화한다

DTO 직접 조회

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

 

강사님의 추천 순서

  • 엔티티 조회 방식으로 우선 접근 

1. 페치조인으로 쿼리 수를 최적화

2. 컬렉션 최적화 -> 페이징 필요 hibernate.default_batch_fetch_size , @BatchSize 로 최적화

                           -> 페이징 필요 없으면 페치 조인 사용

  • 엔티티 조회 방식으로 해결이 안되면 DTO 조회 방식 사용
  • DTO 조회 방식으로 해결이 안되면 NativeSQL or 스프링 JdbcTemplate
더보기

엔티티 조회 방식은 페치 조인이나, hibernate.default_batch_fetch_size , @BatchSize 같이 코드를 거의 수정하지 않고, 옵션만 약간 변경해서, 다양한 성능 최적화를 시도할 수 있다.

반면에 DTO를 직접 조회하는 방식은 성능을 최적화 하거나 성능 최적화 방식을 변경할 때 많은 코드를 변경해야 한다.

엔티티는 캐시에 올리면 안된다. 영속성 컨텍스트가 관리하고 있어 꼬일 수가 있다. 그러므로 캐시에 올릴 때는 DTO로 반환하고 캐시에 집어 넣어야 한다.

 

개발자는 성능 최적화와 코드 복잡도 사이에서 줄타기를 해야 한다.

항상 그런 것은 아니지만, 보통 성능 최적화는 단순한 코드를 복잡한 코드로 몰고간다. (강사님 말씀)

  • 엔티티 조회 방식은 JPA가 많은 부분을 최적화 해주기 때문에, 단순한 코드를 유지하면서, 성능을 최적화 할 수 있다.
  • 반면에 DTO 조회 방식은 SQL을 직접 다루는 것과 유사하기 때문에, 둘 사이에 줄타기를 해야 한다

 

 

출처

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-API%EA%B0%9C%EB%B0%9C-%EC%84%B1%EB%8A%A5%EC%B5%9C%EC%A0%81%ED%99%94/dashboard

 

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 - 인프런 | 강의

스프링 부트와 JPA를 활용해서 API를 개발합니다. 그리고 JPA 극한의 성능 최적화 방법을 학습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

'BackEnd > 실전! 스프링 부트와 JPA 활용2' 카테고리의 다른 글

OSIV와 성능 최적화  (0) 2023.01.11
컬렉션 조회 최적화  (0) 2023.01.10
지연 로딩과 조회 성능 최적화  (1) 2023.01.08
API 개발 기본  (0) 2023.01.08
'BackEnd/실전! 스프링 부트와 JPA 활용2' 카테고리의 다른 글
  • OSIV와 성능 최적화
  • 컬렉션 조회 최적화
  • 지연 로딩과 조회 성능 최적화
  • API 개발 기본
인프라 감자
인프라 감자
  • 인프라 감자
    삶은 인프라
    인프라 감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 클라우드&인프라 (28)
        • 인프라 공부 (4)
        • AWS 구조와 서비스 (18)
        • 클라우드 공부 (4)
        • Terraform (2)
      • AWS Cloud School (13)
        • project (5)
        • Linux, Network (6)
        • Docker (2)
      • BackEnd (162)
        • JAVA 공부 (15)
        • 알고리즘 공부 (71)
        • MySQL 문제 풀기 (8)
        • 스프링 핵심 원리 - 기본편 (18)
        • 스프링 MVC 1편 (4)
        • 자바 ORM 표준 JPA 프로그래밍 (21)
        • 실전! 스프링 부트와 JPA 활용1 (8)
        • 실전! 스프링 부트와 JPA 활용2 (5)
        • 스프링 데이터 JPA (8)
        • Querydsl (4)
      • 혼자하는 프로젝트 (32)
        • 배달의 민족 클론코딩 (7)
        • 나만의 프로젝트 (10)
        • 스프링 부트로 구현한 웹 (15)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Email
    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    dp
    자동 배포
    중첩 선언
    자바
    완전탐색
    쿼드 압축
    백트래킹
    상속
    이것이 자바다
    다이나믹 프로그래밍
    디팬스 게임
    VPN
    유니온 파인드
    네트워크 기본 용어
    프로그래머스
    조합
    정렬
    querydsl
    스프링 핵심 원리-기본편
    linux
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
인프라 감자
API 개발 고급 정리
상단으로

티스토리툴바