TIL(Today I Learned)

Day.41 - 금일의 학습 내용 -

지팡구 2023. 1. 11. 14:43

인프런 실전! 스프링 부트와 JPA 활용 2편을 듣고 정리한 내용은 다음과 같다

 

  1. DTO 속에서도 Entity를 가지면 안된다 (ex. List<Member>). 이는 엔티티 스펙이 외부에 노출되며, 완전히 entity에 대한 의존을 끊어야 한다.  (Entity가 바뀔 위험이 있으니까)
  2. N+1의 문제를 다시 접하게 되었다 ( 정리할 것 - 면접 단골 질문 )
  3. 일단 모든 연관관계는 지연로딩 (Lazy)로 설정해놓고 필요하다면 fetch join을 사용할 수 있어야 한다.
  4. 이는 실무에서 매우 중요하게 작용하며 JPA를 사용하는 곳에서 대부분의 성능 최적화는 fetch join을 통해서 이행된다.
  5. 이 fetch join을 직접 작성하고 눈으로 확인해보니 확실히 쿼리가 줄어들었다. 
  6. 또한 Repository는 순수한 엔티티를 조회할 때 사용 하는 것이 옳다
  7. Jpa에서는 DTO로 바로 조회가 가능한데, fetch join보다 쿼리의 양이 줄었다 -> 성능과 에너지 면에서 우세하지만 막 그렇게 많은 차이를 내진 않는다
  8. 그러나 이는 로직의 재활용이 힘들며 fetch join과 이 DTO를 바로 조회하는 fetch join의 최적화는 trade off 관계이다.
  9. 또한 이는 API 스펙에 맞춘 코드가 레포지토리에 들어가는 단점이 발생한다. 

 

출처 : 실전 스프링부트와 JPA 활용 2편 - 인프런 (김영한)