인프런 커뮤니티 질문&답변

dionisos198님의 프로필 이미지
dionisos198

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V5: JPA에서 DTO 직접 조회 - 컬렉션 조회 최적화

1대 다 fetch join 에 대해서 질문이 있습니다.

작성

·

203

0


[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예

[질문 내용]
요새 너무 질문을 많이 하는 것 같네욤 ㅠㅠ

1대다 fetch join 에서 @OneToMany 밑에다가 @BatchSize를 설정해서 성능을 최적화하는 강의 를 이해했습니다.

그런데 궁금한게 생겼습니다.

예를 들어 A, B , C 가 1대 다 , 다대 1 이라고 치면 (C는 중간 테이블 ) A에서 C의 데이터를 가지고 오는데 이 경우에는 @BatchSize를 이용해서 성능을 최적화하는게 좋은 방식인가요?

예를 들면 A 에서 A.getBList().getC.Name() 이렇게 할 때 A에서 B에 대한 쿼리는 Batch Size 를 통해서 줄일 수 있어도 getC 를 통해서 또 쿼리가 나가는데 ....

어떻게 보면 걍 B 의 리포지토리에서 @Query("select b from B join fetch C where b.a,id=:id) 이런 식으로 하는게 더 나아보이기도 하고요.. 어떤 식으로 하는 것이 더 효율적이라고 생각하시는게 궁금합니다!!!

답변 1

0

안녕하세요. dionisos198님, 공식 서포터즈 y2gcoder입니다.

 

저희는 이번에 A:C, C:B 가 각각 1:N, N:1로 되어있는 관계에서 A 입장에서 호출을 해야할 때를 가정하고 각종 최적화 방법을 배웠습니다.

여기서 A를 기준으로 연관된 엔티티들을 가져와야 할 때 컬렉션 조회를 최적화하는 방법에 대해서 배웠습니다.

그래서 정리를 보시면

기본적으론

엔티티 기준으로 조회한다 를 전제로 해서

컬렉션 최적화에는 페치 조인과 batch size를 통한 최적화를 학습했습니다.

컬렉션 쪽에 페이징이 필요없다면 fetch join을 쓰셔도 됩니다. (다만 A에 연관된 컬렉션이 C만 있는게 아니라면 어떤 것을 페치조인할 지 고민해봐야 합니다)

컬렉션 쪽에 페이징 처리를 해줘야 한다면 batch size를 해주셔야 합니다.

보통 이 안에서 저는 많이 해결하는 것 같습니다.

다만 여기서 성능적으로 더 끌어올리고 싶다면 DTO 조회, 이것도 안되면 JdbcTemplate 등을 이용해 네이티브 쿼리로 조회하는 것을 권해드리고 있습니다.

 

저는 실무에서도 위와 같은 원칙을 세우고 조회 쿼리를 작성하고 있습니다.

말씀해주신 중간 테이블인 C에서 조회하는 방법도 요구사항에 따라 사용하실 수 있습니다 :)

 

감사합니다.

dionisos198님의 프로필 이미지
dionisos198

작성한 질문수

질문하기