강의

멘토링

로드맵

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

BackStart님의 프로필 이미지
BackStart

작성한 질문수

실전! 스프링 데이터 JPA

사용자 정의 리포지토리 구현

화면에 맞춰진 복잡한 정적 쿼리 관련 질문입니다!

작성

·

271

1

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

[질문 내용]
여기에 질문 내용을 남겨주세요.
 
안녕하십니까 강사님!
강사님의 강의와 영상을 통해 성장을 꿈꾸는 주니어 백엔드 개발자 입니다!

이번 회차와 쿼리 결과를 DTO로 받는 강의를 통해 궁금한 점이 생겼습니다.
 
만약 거래내역과 같이 특정 하나의 테이블이 아닌 관련된 여러 테이블의 값이 필요할 경우에는 단일 거래내역을 가져오기위해서는 적어도 3~4개에서 많으면 5~6개의 쿼리가 발생하게 됩니다.
 
ex1) A a = a_repo.findById({id});
B b = b_repo.findByA_Id({a.getId()});
....
 
// 연관관계가 맺어져 있다면
ex2) A a = a_repo.findById({id});
B b = a.getB();
...
 
위와 같은 방법으로 하여 전체 거래내역을 불러오기 위해서는 총
({전체 거래내역 갯수} * {하나의 거래내역을 가져오기 위한 쿼리 갯수})
개의 쿼리가 발생하게 됩니다.
 
그래서 강사님의 강의를 듣고 JPQL로 풀어보아야겠다 해서 시도를 했습니다.
그런데, JPQL로 하다보니 SELECT와 FROM절에서 서브쿼리를 지원하지 않는다는 것을 알게되었고 아주 많은 조인이 일어나는 쿼리에서 From절에서 데이터를 걸러내지 못하고 WHERE절에 서브쿼리를 많이 넣게 되는 것도 그렇게 좋은 방법이 아니라고 생각이 들어 이렇게 질문드립니다.
 
1) 위와 같이, 화면에 맞춰져 있고, 많은 조인이 필요한 경우(쿼리가 복잡한 경우)에는 어떠한 방법을 추천해주시나요? (Querydsl은 아직 도입하기에는 무리인 상황입니다ㅠㅠ)
 
2) 거래내역과 같이 여러 테이블의 필드값들이 필요한 경우에, 하나의 거래내역을 클라이언트에게 반환하기 위해서 몇 개의 쿼리가 넘어가야 각각의 쿼리메소드보다 JPQL로 사용하는게 낫겠다고 느끼시나요?
 
 
(사실, @NamedNativeQuery를 사용하여 단일 쿼리로 전체 결과를 반환하도록 리팩토링 하였고 성능 향상의 이점도 얻었지만, 더러워진 Entity 클래스와 유지보수에 대한 걱정이 있었는데 강사님 강의를 보고 조금 더 좋은 방향으로 고쳐야겠다는 생각이 들었습니다ㅠ)

퀴즈

Spring Data JPA 리포지토리의 사용자 정의 메서드를 구현하는 주된 이유는 무엇일까요?

단순한 CRUD 연산을 수행하기 위해서입니다.

Spring Data JPA만으로는 구현하기 어려운 복잡한 쿼리나 JDBC/MyBatis 사용 등 특정 기술이 필요할 때 사용합니다.

Spring Data JPA가 제공하는 기본 메서드를 오버라이드하기 위해서입니다.

모든 리포지토리 메서드를 수동으로 구현하기 위해서입니다.

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. BackStart님

다음 강의를 참고해주세요.

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

감사합니다.

BackStart님의 프로필 이미지
BackStart

작성한 질문수

질문하기