QueryDsl 설정하기(spring 3.0 이상)

전홍영·2023년 6월 23일

JPA

목록 보기
2/6

QueryDsl이란

QueryDsl은 Java에서 관계형 데이터베이스를 쿼리하기 위한 유형 안전하고 유창한 API를 제공하는 프레임워크이다. SQL과 매우 유사한 유창한 구문을 사용하여 복잡한 데이터베이스 쿼리를 보다 쉽게 작성하고 구성할 수 있다.

예를 들어 다음과 같은 쿼리문을 Java코드로 표현할 수 있다.

SELET *
FROM USER
WHERE AGE = 18
ORDERBY NAME ASC

List<User> users = queryFactory
    .selectFrom(qUser)
    .where(qUser.age.gt(18))
    .orderBy(qUser.name.asc())
    .fetch();

이렇듯 QueryDSL을 이용하면 SQL문을 따로 짤필요 없이 코드로만으로도 복잡한 로직을 수행할 수 있고, 가독성도 좋아 개발자가 이해하기 쉬운 코드를 작성할 수 있다.

QueryDsl 설정하기

Gradle

그럼 이제 QueryDsl을 설정해 보자. 먼저 build.gradle에 라이브러리를 추가해준다.

dependencies {
	//spring-data-jpa
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

	//QueryDSL 
    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"
}

스프링 2.X버전때에는 여러가지 다른 설정이 있는걸로 아는데 나는 3.X 버전을 사용하기 때문에 위와 같은 라이브러리를 추가해주었다. QueryDsl 5.0버전 이상부터는 querydsl-jpa와 querydsl-apt를 명시해주어야 한다. jpa는 말 그대로 querydsl jpa 라이브러리이고 apt는 엔티티 클래스를 쿼리 타입(Q) 클래스로 생성할 때 필요한 라이브러리이다. annotationProcessor은 Q 파일을 찾지 못해서 발생하는 오류에 대응하기 위한 코드 이다.

Configuration

queryDsl할 때 JPAQuery를 생성해주는 JPAQueryFactory가 필요한데 이를 생성하기 위해서는 EntityManager가 필요하다. 그래서 queryDsl을 사용할 곳에서 사용할 때마다 EntityManager를 가져와서 JPAQueryFactory를 생성하여 사용해되 되지만 나는 Config 파일을 만들어서 Spring Context에 빈으로 등록하여 사용하기 위해서 Configuration 파일을 작성하였다.

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QueryDslConfig {
    @PersistenceContext // ntityManager를 빈으로 주입할 때 사용하는 어노테이션
    private EntityManager entityManager;

    @Bean
    public JPAQueryFactory jpaQueryFactory() {
        return new JPAQueryFactory(entityManager);
    }
}

이렇게 작성하면 나중에 querydsl을 사용할 때 JPAQueryFactory만 선언하여 사용하면 된다.

@RequiredArgsConstructor
public class QueryDslTest{
	private final JPAQueryFactory queryFactory;
    
    private QUser quser = QUser;
    
    public List<User> findAllUser() {
          List<User> users = queryFactory
                            .selectFrom(qUser)
                            .where(qUser.age.gt(18))
                            .orderBy(qUser.name.asc())
                            .fetch();
    }
}

후기

아직 QueryDsl를 많이 써보지는 않았지만 JPA만으로는 내가 원하는 로직을 짜지 못해 JQuery를 사용했었는데 QueryDsl를 이용해서 로직을 작성하면 훨씬 간단하고 내가 따로 SQL문을 짜지 않아서 굉장히 편리하였다. QueryDsl를 사용하기 위해서는 사실 SQL을 잘알아야 하는데 SQL 공부의 필요성도 느꼈다. 또한 QueryDsl은 매우 규모가 큰 기술이기 때문에 알아야 할 것도 많고 기능도 많아 또다른 곳에서 사용할 때 자세히 알아봐야 겠다.

참고
https://haenny.tistory.com/424
https://www.inflearn.com/course/querydsl-%EC%8B%A4%EC%A0%84/community?type=question

profile
Don't watch the clock; do what it does. Keep going.

0개의 댓글