• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

QDSL로 복잡한 쿼리를 어느정도 커버 가능한가요?

20.07.02 23:47 작성 조회수 2.29k

2

안녕하세요~

좋은 강의 감사합니다. SPRING DATA JPA 강좌 부터 듣고 있는데 JPA의 장점은 명확하게 알 것 같습니다.

간단하거나 조회조건이 단순할 경우에는 보다 쉽고 강력하게 느껴지는데요.

쿼리가 복잡할 경우 QDSL을 적극 권유 하시는데 QDSL이 커버 가능한 범위가 어디까지일까요?

일단 말로만 접했을 경우에는 기존에 정의한 ENTITY 클래스로 무언가 프로그래밍 방식으로 처리 한다고 생각했는데

별도의 컴파일 과정이 중간에 들어가는것 같습니다.

그리고 그 컴파일후 결과가 앞에 Q라는 접두어가 붙는데 약간의 혼란스러움이 느껴지네요.

그래서 그런지 실제 통계 또는 여러 테이블을 조인 하거나 조건처리가 많은 동적 쿼리같은 경우에는 오히려

MYBATIS처럼 네이티브쿼리 사용하는것이 결과에 대한 확인과 빠른 대응이 이루어 질 것 같은데요.

그부분에 대해서는 어떠한 생각인지 의견을 듣고 싶습니다.

개인적으로는 JAVA와 QUERY는 성격이 다르기 때문에 분리해야 한다는 생각이 강한 개발자인데요. 

그래도 JPA의 장점을 알기에 학습을 하고 있는데 학습 하면 할수록 무언가를 결정하기가 어렵네요 ㅎㅎ.

현재 MYBATIS냐 JPA냐 결정해야 하는 상황이라서 질문드려 보았습니다.

답변 1

답변을 작성해보세요.

7

안녕하세요. techsupport2님 좋은 질문입니다^^

저도 SQL을 오래 사용했던 개발자여서 JAVA와 QUERY의 성격이 다르다고 말씀해주신 부분에 공감이 많이 되고, 그래서 저도 과거에 고민을 많이 했습니다.

실무에서 JPA를 사용하면 가장 골치가 동적 쿼리 문제 입니다. MyBatis는 동적 쿼리를 작성하는데 매우 유용한 기술이지요.

JPA로 동적쿼리를 해결하는 좋은 솔루션이 바로 Querydsl 입니다.

Querydsl은 동적쿼리 문제를 자바 코드로 작성할 수 있기 때문에 자바 코드로 할 수 있는, 공통 로직 추출(메서드 추출) 같은 부분이 매우 유연하고, 편리합니다. 그리고 코드 자동완성의 도움도 받을 수 있고, 컴파일 시점에 쿼리 문법 오류도 잡아줍니다.

모양도 JPQL(SQL)과 거의 유사하게 생겨서 개발자들이 금방 적응할 수 있습니다.

그럼 어디까지 지원하는가가 궁금하실 건데요. JPQL로 가능한 부분은 Querydsl로 모두 가능하다고 생각하시면 됩니다. Querydsl은 결국 JPQL이 지원하는 문법까지만 지원합니다.

결국 JPA를 사용하려면 JPQL을 잘 이해하고 한계가 어디까지 인지 알고 사용해야 합니다.

그러면 모든 것을 JPA와 Querydsl로 할 수 있는가? 라고 하면 그렇지 않습니다. 그래서 JPA도 네이티브 쿼리를 열어둔 것이지요. 저도 실무에서 95% 정도는 JPA와 Querydsl로 해결을 하는데 나머지 5% 특히 정말 복잡한 통계성 쿼리는 네이티브 쿼리를 사용합니다. 하이버네이트를 처음 만든 개빈 킹도 100% 모든 쿼리를 다 지원하는게 목표가 아니다라고 했습니다. 현실적으로도 불가능하지요.

그래서 저도 메인을 JPA와 Querydsl로 사용하고, 꼭 필요한 경우에는 SpringJdbcTemplate으로 네이티브 쿼리를 사용합니다. 물론 JdbcTemplate대신에 MyBatis를 사용하셔도 됩니다. 스프링은 JPA와 MyBatis를 함께 사용하도록 지원합니다.

관련해서 jpa mybatis 혼용으로 구글에 검색해보시면 예제 코드들을 찾으실 수 있습니다.

도움이 되셨길 바래요^^

석재현님의 프로필

석재현

2022.07.18

감사합니다! 실무에서 JPA랑 MyBatis중 뭘 써야 고민했는데 덕분에 조금 해결된것 같습니다