본문 바로가기
업무 기록/ETC

QueryDSL 란, 주요 메서드 및 장단점 기본 설명

by code2772 2024. 8. 13.

[ 목차 ]

    728x90
    반응형

    QueryDSL 란

    QueryDSL은 정적 타입을 이용해 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임워크입니다. 주로 JPA와 함께 사용되지만, MongoDB, SQL 등 다양한 저장소에도 사용할 수 있습니다. 

     

    QueryDSL을 사용하면 메서드들을 조합하여 복잡한 쿼리를 타입이 안전하고 가독성 높은 코드로 작성할 수 있습니다. 또한 동적 쿼리 생성이 용이하고 컴파일 시점에 오류를 잡을 수 있어 개발 생산성과 코드 안정성을 높일 수 있습니다. 다만, 러닝 커브가 있고 복잡한 쿼리의 경우 성능 최적화에 주의가 필요할 수 있습니다.

     

     

    주요 메서드

     

    1. selectFrom() 기능: 조회할 엔티티를 지정합니다. 사용 예:

    queryFactory.selectFrom(qCallback)

     

      장점:

    • 간결한 문법으로 SELECT와 FROM을 동시에 지정할 수 있습니다.
    • 타입 안전성을 제공합니다.

    단점:

    • 복잡한 조회(예: 여러 테이블 조인)에는 적합하지 않을 수 있습니다.

     

     

    2. where() 기능: 쿼리의 WHERE 절을 정의합니다. 사용 예

    .where(callback.mgwid.eq(mgwid))

     

    장점:

    • 메서드 체이닝을 통해 복잡한 조건을 명확하게 표현할 수 있습니다.
    • 동적 쿼리 생성이 용이합니다.

    단점:

    • 매우 복잡한 조건의 경우 가독성이 떨어질 수 있습니다 

     

     

    3. and(), or() 기능: 여러 조건을 결합합니다. 사용 예:

    .and(callback.callback.`in`(batch.map { it.callback }))

     

    장점:

    • SQL의 AND, OR 연산을 직관적으로 표현할 수 있습니다.
    • 조건을 논리적으로 그룹화할 수 있습니다.

    단점:

    • 과도한 사용 시 코드가 복잡해질 수 있습니다.

     

     

    4. fetch() 기능: 쿼리를 실행하고 결과를 리스트로 반환합니다. 사용 예:

    .fetch()

     

    장점:

    • 간단한 메서드 호출로 쿼리 실행과 결과 반환을 동시에 할 수 있습니다.
    • 리스트 형태로 결과를 받아 처리하기 쉽습니다.

    단점:

    • 대량의 데이터를 조회할 때 메모리 사용량이 증가할 수 있습니다.

     

     

    5. fetchCount() 기능: 조회 결과의 총 개수를 반환합니다. 사용 예:

    val total = query.fetchCount()

     

    장점:

    • 페이징 처리 시 전체 결과 수를 쉽게 얻을 수 있습니다.
    • 별도의 COUNT 쿼리 없이 결과 수를 얻을 수 있습니다.

    단점:

    • 대량의 데이터에 대해 수행 시 성능 저하가 발생할 수 있습니다.

     

     

    6. offset(), limit() 기능: 페이징 처리를 위해 결과의 시작점과 개수를 지정합니다. 사용 예:

    val total = query.fetchCount()

     

    장점:

    • 간단한 메서드 호출로 페이징을 구현할 수 있습니다.
    • Spring Data의 Pageable 객체와 잘 통합됩니다.

    단점:

    • 대량의 데이터에 대한 오프셋 페이징은 성능 이슈가 있을 수 있습니다.

     

     

    7. orderBy() 기능: 결과의 정렬 순서를 지정합니다. 사용 예:

    .orderBy(qCallback.regDate.desc())

     

    장점:

    • 메서드 체이닝을 통해 여러 정렬 조건을 쉽게 추가할 수 있습니다.
    • asc(), desc() 메서드로 정렬 방향을 명확히 지정할 수 있습니다.

    단점:

    • 복잡한 정렬 로직의 경우 가독성이 떨어질 수 있습니다.

     

    8. BooleanBuilder 기능: 동적으로 WHERE 조건을 구성할 수 있게 해줍니다. 사용 예:

    val predicate = BooleanBuilder() catcode?.takeIf 
    { it.isNotBlank() }?.let { predicate.and(qCallback.catcode.containsIgnoreCase(it)) }

     

    장점:

    • 조건에 따라 동적으로 쿼리를 구성할 수 있습니다.
    • 복잡한 조건문을 깔끔하게 처리할 수 있습니다.

    단점:

    • 과도한 사용 시 코드의 복잡성이 증가할 수 있습니다.

     

    반응형