작성
·
17
0
querydsl이 쿼리를 코드로 작성하여 컴파일 시점에 오류를 감지할 수 있는게 가장 큰 장점인데 Spring JPA와 혼합하여 사용할떄 그 외에 장점이 또 있을까요 레거시 쿼리는 이미 사용되고 있어 이를 전환하기 위해 먼가 더 장점이 필요할 것 같아서요 아니면 레거시는 두고 신규 추가되는 부분만 Querydsl를 도입하는 식으로 가면 될까요?
답변 2
0
안녕하세요! Mola-Mola님! ☺ 좋은 질문 감사합니다.
말씀해주신 레거시 쿼리가 무엇인지에 따라 답변이 조금 달라질 것 같아요~ native raw level 쿼리인지 아니면 Spring Data JPA 레벨의 쿼리인지 또 다른 무언가인지에 따라서요!
다만 저는 개인적으로 Querydsl을 좋아하는 이유가 말씀해주신 컴파일 레벨의 오류 감지 외에도
동적 쿼리 작성의 편안함
query의 중복 제거 원활함
도 있는데요!
동적 쿼리란, https://jojoldu.tistory.com/394 에서도 확인할 수 있는 것처럼 하나의 API 에서 N개의 변수를 사용자 선택에 따라 조합하는 경우를 의미합니다. 만약 raw level SQL을 직접 사용한다면, 상황에 맞는 쿼리를 모두 작성해주거나 꽤 높은 확률로 오류 위험성이 높은 문자열 연산을 사용해야 하죠. 반면 Querydsl은 매우 용이한 동적 쿼리 작성을 도와줍니다.
또한 Query를 code-level에서 building 하는 방식이기에 중복 제거도 매우 원할합니다.
예를 들어 A + B + C 테이블이 조인된 상황에서 where c1 = ? 만 쓰는 쿼리가 있고, where 조건 없이 group by 만 덧붙이는 경우가 있다고 할 때 "A + B + C 테이블이 조인된 상황" 자체를 baseQuery로 한 번만 선언한 후 각 쿼리의 변화되는 부분만 JPAQuery에 이어 붙일 수 있죠
이를 활용하면 코틀린의 확장 함수를 적용해 레고 블록을 조립하듯 타입 안전하게 쿼리를 작성할 수 있게 됩니다. 아주 간단한 예시로 아래와 같은 확장 함수를 선언해두면 Querydsl 기반 쿼리 어디든 paging(pageable)만 덧붙여 페이징 쿼리를 만들어 낼 수 있죠.
fun <T> JPAQuery<T>.paging(pageable: Pageable): JPAQuery<T> {
return this.limit(pageable.pageSize.toLong())
.offset(pageable.offset)
}
fun <T> JPAQuery<T>.paging(page: Int, size: Int): JPAQuery<T> {
val pageable = Pageable.ofSize(size).withPage(page)
return this.limit(pageable.pageSize.toLong())
.offset(pageable.offset)
}
아주 작은 예시이고 활용법은 매우 무궁무진 합니다. ☺
추가적으로 "레거시는 두고 신규 추가되는 부분만 Querydsl를 도입하는 식으로 가면 될까요?"라고 말씀해주셨는데요~ 참 어려운 부분입니다. 상황에 따라
신규 추가되는 부분만 새로운 기술을 도입하기
신규 피처 외에도 기존 기능을 변경할 때도 새로운 기술을 적용하기
최선을 다해 기존 기능을 완전히 마이그레이션 하기
등 여러 전락이 있거든요. 이는 제가 답변 드리기 어렵고 프로젝트 상황에 따라, 함께 일하는 분들의 성향에 따라 많이 달라질 수 있습니다.
답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇
0
안녕하세요, 인프런 AI 인턴입니다.
Mola-Mola님의 질문에 대해 답변 드리겠습니다. Querydsl은 쿼리를 코드로 작성하여 컴파일 시점에 오류를 감지할 수 있는 것 외에도 다음과 같은 장점들이 있습니다:
타입 안전성: Querydsl은 쿼리를 타입 안전하게 만들 수 있기 때문에, 런타임 에러 발생 가능성을 줄이고 보다 안정적인 코드를 작성할 수 있습니다.
다양한 데이터베이스 지원: Querydsl은 특정 데이터베이스에 종속적이지 않기 때문에 다양한 데이터베이스와 함께 사용할 수 있습니다. 이는 SQLDialect만 변경하여 여러 데이터베이스 환경에서도 쉽게 적용 가능하다는 장점이 있습니다.
코드의 가독성: Querydsl을 사용하면 복잡한 SQL 쿼리를 자바 코드로 표현할 수 있어 가독성을 높일 수 있습니다. 이는 유지보수 시팀에서 코드 이해도를 높입니다.
조건 처리의 유연성: 조건문을 자바 코드로 작성할 수 있어, 여러 복잡한 조건을 보다 간단하게 처리할 수 있습니다.
질문 주신 바와 같이 레거시 쿼리는 두고 신규 추가되는 부분만 Querydsl을 도입하는 방법도 좋은 전략입니다. 그렇다면 기존 기능에는 안정감을 유지하면서도 새로운 기능 개발 시 생산성을 높일 수 있습니다. 레거시 코드는 점진적으로 전환하면서, Querydsl의 장점을 신규 코드에 최대한 활용하는 방향이죠.
혹시 더 궁금하신 부분이나 구체적인 사례가 필요하시면 언제든지 질문해주세요. 또한, 관련된 기존 댓글에서 유용한 정보를 찾을 수 있으니 참고해 보시길 권장드립니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.