강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của mola
mola

câu hỏi đã được viết

Trong thực tế! Phát triển ứng dụng quản lý thư viện với Kotlin và Spring Boot (tái cấu trúc dự án Java)

Querydsl 도입

Viết

·

62

0

querydsl이 쿼리를 코드로 작성하여 컴파일 시점에 오류를 감지할 수 있는게 가장 큰 장점인데 Spring JPA와 혼합하여 사용할떄 그 외에 장점이 또 있을까요 레거시 쿼리는 이미 사용되고 있어 이를 전환하기 위해 먼가 더 장점이 필요할 것 같아서요 아니면 레거시는 두고 신규 추가되는 부분만 Querydsl를 도입하는 식으로 가면 될까요?

javaspringkotlinspring-boot리팩터링

Câu trả lời 2

0

lannstark님의 프로필 이미지
lannstark
Người chia sẻ kiến thức

안녕하세요! Mola-Mola님! 좋은 질문 감사합니다.

말씀해주신 레거시 쿼리가 무엇인지에 따라 답변이 조금 달라질 것 같아요~ native raw level 쿼리인지 아니면 Spring Data JPA 레벨의 쿼리인지 또 다른 무언가인지에 따라서요!

다만 저는 개인적으로 Querydsl을 좋아하는 이유가 말씀해주신 컴파일 레벨의 오류 감지 외에도

  1. 동적 쿼리 작성의 편안함

  2. 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를 도입하는 식으로 가면 될까요?"라고 말씀해주셨는데요~ 참 어려운 부분입니다. 상황에 따라

  1. 신규 추가되는 부분만 새로운 기술을 도입하기

  2. 신규 피처 외에도 기존 기능을 변경할 때도 새로운 기술을 적용하기

  3. 최선을 다해 기존 기능을 완전히 마이그레이션 하기

등 여러 전락이 있거든요. 이는 제가 답변 드리기 어렵고 프로젝트 상황에 따라, 함께 일하는 분들의 성향에 따라 많이 달라질 수 있습니다.

답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇

0

안녕하세요, 인프런 AI 인턴입니다.

Mola-Mola님의 질문에 대해 답변 드리겠습니다. Querydsl은 쿼리를 코드로 작성하여 컴파일 시점에 오류를 감지할 수 있는 것 외에도 다음과 같은 장점들이 있습니다:

  1. 타입 안전성: Querydsl은 쿼리를 타입 안전하게 만들 수 있기 때문에, 런타임 에러 발생 가능성을 줄이고 보다 안정적인 코드를 작성할 수 있습니다.

  2. 다양한 데이터베이스 지원: Querydsl은 특정 데이터베이스에 종속적이지 않기 때문에 다양한 데이터베이스와 함께 사용할 수 있습니다. 이는 SQLDialect만 변경하여 여러 데이터베이스 환경에서도 쉽게 적용 가능하다는 장점이 있습니다.

  3. 코드의 가독성: Querydsl을 사용하면 복잡한 SQL 쿼리를 자바 코드로 표현할 수 있어 가독성을 높일 수 있습니다. 이는 유지보수 시팀에서 코드 이해도를 높입니다.

  4. 조건 처리의 유연성: 조건문을 자바 코드로 작성할 수 있어, 여러 복잡한 조건을 보다 간단하게 처리할 수 있습니다.

질문 주신 바와 같이 레거시 쿼리는 두고 신규 추가되는 부분만 Querydsl을 도입하는 방법도 좋은 전략입니다. 그렇다면 기존 기능에는 안정감을 유지하면서도 새로운 기능 개발 시 생산성을 높일 수 있습니다. 레거시 코드는 점진적으로 전환하면서, Querydsl의 장점을 신규 코드에 최대한 활용하는 방향이죠.

혹시 더 궁금하신 부분이나 구체적인 사례가 필요하시면 언제든지 질문해주세요. 또한, 관련된 기존 댓글에서 유용한 정보를 찾을 수 있으니 참고해 보시길 권장드립니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Hình ảnh hồ sơ của mola
mola

câu hỏi đã được viết

Đặt câu hỏi