[강의]스프링 부트와 JPA 활용2 - API 개발과 성능 최적화(1)

스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 강의를 예전에 들었었는데

시간이 지나면서 잊어버린 부분도 있고, 들었던 것을 한번 더 들으면서

내가 부족했던 부분이나 핵심적인 부분을 정리를 다시 한번 해보기 위해서 다시 강의를 듣기 시작했다.


@Controller + @ResponseBody => @RestController

Entity를 외부에 노출해서는 안된다. Entity를 파라미터로 받지말고 외부에 노출해서는 안된다. Dto를 만들어준다.

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

지연 로딩 때문에 발생하는 성능 문제를 단계적으로 해결

Order Order - Member (ManyToOne) Order - Delivery (OneToOne) Order - OrderItems (OneToMany)

XToOne

ORDER에 조회를 한번 했을 떄 문제 발생

(모든 연관관계는 LAZY로 설정! : 지연로딩은 영속성 컨텍스트에서 조회한다.)

- Order 조회 1번 (order 조회 결과 수가 N이 된다.)
- Order -> Member 지연로딩 조회 N번.
- Order -> delivery 지연로딩 조회 N번.

쿼리가 총 1 + N + N 번 실행된다..!

N+1문제발생

N+1문제를 fetch join을 사용해서 해결한다. ( 실무에서 JPA를 사용한다면 fetch join은 꼭 이해하자! )

fetch join을 사용해서 쿼리 1번에 조회.

fetch join으로 order -> member , order -> delivery는 이미 조회 된 상태이므로 지연로딩X

정리

  1. 우선 엔티티를 DTO로 변환한다.
  2. 필요하면 페치 조인으로 성능을 최적화 한다. -> 대부분의 성능 이슈해결.

스프링 부트와 JPA 활용2 - API 개발과 성능 최적화(2)에서는 컬렉션 조회 최적화에 대해서 정리할 예정이다.

컬렉션 조회(일대다) , OneToMany