인프런 실전! 스프링 부트와 JPA 활용 2편을 듣고 정리한 내용은 다음과 같다
- DTO 속에서도 Entity를 가지면 안된다 (ex. List<Member>). 이는 엔티티 스펙이 외부에 노출되며, 완전히 entity에 대한 의존을 끊어야 한다. (Entity가 바뀔 위험이 있으니까)
- N+1의 문제를 다시 접하게 되었다 ( 정리할 것 - 면접 단골 질문 )
- 일단 모든 연관관계는 지연로딩 (Lazy)로 설정해놓고 필요하다면 fetch join을 사용할 수 있어야 한다.
- 이는 실무에서 매우 중요하게 작용하며 JPA를 사용하는 곳에서 대부분의 성능 최적화는 fetch join을 통해서 이행된다.
- 이 fetch join을 직접 작성하고 눈으로 확인해보니 확실히 쿼리가 줄어들었다.
- 또한 Repository는 순수한 엔티티를 조회할 때 사용 하는 것이 옳다
- Jpa에서는 DTO로 바로 조회가 가능한데, fetch join보다 쿼리의 양이 줄었다 -> 성능과 에너지 면에서 우세하지만 막 그렇게 많은 차이를 내진 않는다
- 그러나 이는 로직의 재활용이 힘들며 fetch join과 이 DTO를 바로 조회하는 fetch join의 최적화는 trade off 관계이다.
- 또한 이는 API 스펙에 맞춘 코드가 레포지토리에 들어가는 단점이 발생한다.
'TIL(Today I Learned)' 카테고리의 다른 글
Day.43 피드백 (0) | 2023.01.17 |
---|---|
Day.42 JPA 데이터 삭제 이슈 + 그 속에서 발생한 오류 (0) | 2023.01.15 |
Day.40 밀린 TIL 그리고 학습 요약 (0) | 2023.01.10 |
Day.39 테스트 그리고 refactoring (0) | 2022.12.28 |
Day.38 Stream 그리고 for (0) | 2022.12.27 |