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)) }
장점:
- 조건에 따라 동적으로 쿼리를 구성할 수 있습니다.
- 복잡한 조건문을 깔끔하게 처리할 수 있습니다.
단점:
- 과도한 사용 시 코드의 복잡성이 증가할 수 있습니다.
반응형
'Kotlin' 카테고리의 다른 글
코틀린 디자인 패턴과 아키텍처 (0) | 2024.11.26 |
---|---|
코틀린(Kotlin)데이터 클래스와 sealed 클래스 (0) | 2024.11.25 |
Kotlin(코틀린) FLow 란? (24) | 2024.11.21 |
코틀린이란? (Kotlin) (1) | 2024.11.19 |
테스트 코드 작성 이유 및 방법 - SpringBoot, Kotlin (0) | 2024.08.09 |