-
[SpringBoot] QueryDSL 사용법 + 환경설정Spring(Java) 2024. 1. 31. 15:00
Querydsl
Querydsl 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임워크
배경
- HQL 쿼리를 더 안전하게 실행하기 위한 목적으로 만들어졌다.
- HQL 쿼리를 작성하다보면 String 연결을 이용하고, 읽기 어려운 코드가 만들어진다.
- String을 이용해 도메인 타입과 프로퍼티를 참조하다보면 오타 등으로 잘못된 참조를 할 수 있다.
장점
- Querydsl이 제공하는 Fluent API를 이용 가능
- IDE의 코드 자동완성 기능 사용 가능
- 문법적으로 잘못된 쿼리를 허용하지 않음
- 도메인 타입과 프로퍼티를 안전하게 참조 가능
- 도메인 타입의 리팩토링을 더 잘 할 수 있음
환경설정
QueryDSLConfig.java
@Configuration @RequiredArgsConstructor public class QueryDSLConfig { private final EntityManager entityManager; @Bean public JPAQueryFactory jpaQueryFactory() { return new JPAQueryFactory(entityManager); } }
build.gradle
plugins { id 'java' id 'org.springframework.boot' version '3.1.7' id 'io.spring.dependency-management' version '1.1.4' } group = 'com.develop' version = '0.1' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-data-redis-reactive' // implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.mysql:mysql-connector-j' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.projectreactor:reactor-test' testImplementation 'org.springframework.security:spring-security-test' // Swagger implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0' // Query DSL implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" // AWS implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' } tasks.named('bootBuildImage') { builder = 'paketobuildpacks/builder-jammy-base:latest' } tasks.named('test') { useJUnitPlatform() } jar{ enabled = false }
사용법
Querydsl을 이용해서 쿼리를 작성하려면, 변수와 Query 구현체를 생성해야 한다.
아래는 예시 도메인이다.
@Entity public class Customer { private String firstName; private String lastName; public String getFirstName(){ return firstName; } public String getLastName(){ return lastName; } public void setFirstName(String fn){ firstName = fn; } public void setLastName(String ln) { lastName = ln; } }
Querydsl에서 해당 도메인이 있는 동일한 패키지에 Q클래스명 이름을 가진 쿼리 타입을 생성한다.
예시에서는 QCustomer라는 쿼리타입이 생성될 것이다.
QCustomer은 기본 인스턴스 변수를 갖고 있으며, 정적 필드로 접근할 수 있다.
QCustomer customer = QCustomer.customer;
물론 아래처럼 변수를 직접 정의할 수도 있다.
QCustomer customer = new QCustomer("myCustomer");
JPA와 Hibernate API를 모두 지원하므로, 사용하는 API에 따라 다른 인스턴스를 사용한다.
// where entityManager is a JPA EntityManager JPAQuery query = new JPAQuery(entityManager);
// where session is a Hibernate session HibernateQuery query = new HibernateQuery(session);
QCustomer customer = QCustomer.customer; JPAQuery query = new JPAQuery(entityManager); Customer bob = query.from(customer) .where(customer.firstName.eq("Bob")) .uniqueResult(customer);
위에서 예시로 들었던 도메인타입의 객체 중 firstName == Bob인 Customer를 조회하고 싶다면 위의 쿼리를 사용하면 된다. 추가로 다른 용법이 궁금하면 출처의 문서에서 2.1.6 이하 내용을 참고하면 된다.
출처
Querydsl - 레퍼런스 문서 : http://querydsl.com/static/querydsl/4.0.1/reference/ko-KR/html_single/
'Spring(Java)' 카테고리의 다른 글
Spring과 Spring Boot의 차이점 (0) 2024.08.29 [Spring] Builder 패턴의 장점과 사용방법 (0) 2024.02.08 [Spring Boot] Error 정리 (0) 2024.01.31 [Spring] 용어정리(Updated 240131) (0) 2024.01.31 Spring MVC (0) 2023.11.03