반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.
* 목록 조회
- 값 콜렉션을 eager 하게 fetch한 엔티티를 페이징 처리해서 읽어온다고 해보자.
- 예를 들어, Role 엔티티에 eager 하게 fetch한 role_perm은 원래는 한 번에 같이 넘어와야 한다.
- 그러나 일반적인 JPQL을 실행하면, 먼저 role 엔티티들을 가져와 List에 담고, 다시 List를 돌면서 role_perm을 가져온다. 즉, 반복이 2번 일어나게 된다.
- 이를 해결하기 위해 join fetch 를 사용하면, role을 읽어올 때 role과 role_perm을 join해서 데이터를 읽어온다.
- 그러나 이 때는 페이징 처리를 했음에도 limit을 걸지않고 일단 두 테이블을 join해서 모든 테이블을 읽어온다.
- 그 이후에 페이징 처리를 메모리에서 담당한다. 결국 메모리 문제가 발생할 수 있게된다.
* 성능 문제
- 설문 직문 목록을 보여줄 때 각 질문의 보기 개수를 함께 표시하고 싶으면
- 페이징 처리 필요
- 컬렉션 데이터 자체는 필요 없음
- 역할 목록을 표시할 때 가진 권한을 함께 표시하고 싶으면
- 페이징 처리 필요
- 각 역할마다 권한을 조회하기 위한 쿼리를 실행하고 싶지 않음
* 성능 문제 -> CQRS로 해결
- JPA만으로 해결하기 쉽지 않다.
- CQRS는 변경 기능을 위한 모델과 조회 기능을 위한 모델을 분리하느 ㄴ것
- 변경 기능 - JPA 활용
- 조회 기능 - MyBatis / JdbcTemplaye / JPA 중 알맞은 기술 사용
- 모든 기능을 JPA로 구현할 필요 없음
- 특히 목록, 상세와 같은 조회 기능
- 범균좌의 CQRS 아는 척 하기 영상을 참고하자.
* 정리
- JPA로 다 할 수는 있겠지만 고통만 커질 수 있음
- 컬렉션 / 연관을 다룰 때 특히 그렇다.
- JPA로 다 하겠다는 생각은 하지 말자!
- 명령 모델(상태 변경)과 조회 모델을 구분하면 좋다.
반응형
'Programming > JPA & Spring Data JPA 기초' 카테고리의 다른 글
13. 엔티티 연관 매핑 시작에 앞서 (0) | 2023.03.25 |
---|---|
12. 영속 컨텍스트 & 라이프사이클 (0) | 2023.03.23 |
10. 값 콜렉션 Map 매핑 (0) | 2023.03.21 |
09. 값 콜렉션 List 매핑 (0) | 2023.03.20 |
08. 값 콜렉션 Set 매핑 (0) | 2023.03.02 |
댓글