API 개발 고급 - 컬렉션 조회 최적화 정리
실전! 스프링부트와 JPA활용2
1. 엔티티 조회방식으로 우선 접근
A. 페치조인으로 쿼리수를 최적화
B. 컬렉션 최적화
i. 페이징필요 (hibernate.default_batch_fetch_size, @BatchSize 로 최적화
ii.페이징필요 x -> 페치조인사용
2. 엔티티조회방식으로 해결이 안되면 DTO조회방식사용
i. ToOne 관계에서는 V4를 사용하고
ii. ToMany관계에서는 V5를 사용하여 IN절을 활용해서 메모리에 미리조회해서 최적화를 시킨다.
3. DTO조회방식으로 해결이 안되면 NativeSQL or JdbcTemplate
참고: 엔티티 조회 방식은 페치 조인이나, hibernate.default_batch_fetch_size, @BatchSize 같이 코드를 거의 수정하지 않고, 옵션만 약간 변경해서, 다양한 성능 최적화를 시도할 수 있다. 반면 DTO로 직접 조회하는 방식은 성능을 최적화 하거나 성능 최적화 방식을 변경할 때 많은 코드를 변경해야 한다.
참고:Entity를 직접조회하면서 fetch 조인이나 batch를 넣어서 해결이 안된다 ? 이정도면
서비스가 트래픽이 무진장 많을것이다. redis같은 캐시를 사용해서 해결을 해야지 DTO조회방식으로
해결이 될까 ?라는 의문이있다.(대부분의 서비스는 fetch 조인만으로도 성능이 나온다)
참고: Entity는 직접캐시하면안된다. Entity는 영속성컨텍스트에서 관리되기때문에 캐시에 잘못 올라갈경우
안지워지니 꼬일수있다. Entity 를 Dto로 변환후 DTO는 캐시에 넣어야한다.