Spring Boot JPA + QueryDSL 설정

u-nij·2022년 11월 22일
0

JPA를 사용하면 엔티티 중심으로 개발하게 되며, 검색을 할 때에도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 모든 DB 데이터를 객체로 변환해 검색하는 것은 불가능하며, 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하게 된다.

QueryDSL이란?

정적 타입을 이용해 SQL과 같은 쿼리를 생성할 수 있도록 도와주는 프레임워크이다. 문자가 아닌 자바 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 오류를 쉽게 확인할수 있다. 또한, Query를 자동 완성해주며, 동적 쿼리 작성을 편리하게 할 수 있다. 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다는 장점도 있다.

JPQL

JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. JPQL은 엔티티 객체를 대상으로 쿼리하며, SQL은 데이터베이스 테이블을 대상으로 쿼리한다.

List<Member> result = em.createQuery(
        "select m From Member m where m.username like '%kim%'", // 테이블이 아닌 엔티티 Member
        Member.class
).getResultList();

QueryDSL

쿼리 작성이 단순하고 쉽다.

PAFactoryQuery query = new JPAQueryFactory(em);
QMember m = QMember.member; 
List<Member> list = query.selectFrom(m)
                        .where(m.name.like("kim"))
                        .orderBy(m.id.desc())
                        .fetch();

QueryDSL 설정

개발환경

Spring Boot 2.6.5
java 11.0.9
IDE Intellij
Windows

Spring Boot 2.6 이상 버전에서는 Querydsl 5.0을 사용한다.

build.gradle

querydsl 플러그인 추가

// Querydsl 버전 plugins 위에 추가
buildscript {
    ext {
        queryDslVersion = "5.0.0"
    }
}

plugins {
    id 'org.springframework.boot' version '2.6.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" // querydsl 플러그인 추가
}

querydsl dependency 추가

dependencies {
	// ...
    implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
    implementation "com.querydsl:querydsl-apt:${queryDslVersion}"
}

querydsl 추가 설정

// querydsl에서 사용할 경로 설정(현재 지정한 부분은 .gitignore에 포함됨)
def querydslDir = "$buildDir/generated/querydsl"

// JPA 사용 여부 및 사용할 경로 설정
querydsl {
    jpa = true
    querydslSourcesDir = querydslDir
}

// build 시 사용할 sourceSet 추가 설정
sourceSets {
    main.java.srcDir querydslDir
}

// querydsl 컴파일 시 사용할 옵션 설정
compileQuerydsl{
    options.annotationProcessorPath = configurations.querydsl
}

// querydsl이 compileClassPath를 상속하도록 설정
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    querydsl.extendsFrom compileClasspath
}

나같은 경우 sourceSet 설정에 React와 관련된 설정을 미리 해두어서 햇갈렸는데, 설정 아래에 그대로 붙여 넣어줘도 문제가 없었다.

Build

Intellij 우측 gradle 탭에서 other -> compilQuerydsl을 누르거나 애플리케이션을 실행시켜 Build를 해주면, 위에서 지정한 querydslDir에 Q타입이 생기는 것을 확인할 수 있다.

JPAQueryFactory 등록

구글링을 해보면, 'JpaRepository<XXX, Long>, XXXRepositoryCustom'을 extends하는 XXXRepository를 생성하고, XXXRepositoryCustom을 생성한 후에, XXXRepositoryImpl을 생성하는 복잡한 방법이 있다. 이러한 방법 대신, @Bean으로 등록하면 간단하게 QueryDSL을 사용할 수 있다.

QuerydslConfig

import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.persistence.EntityManager;


@Configuration
@RequiredArgsConstructor
public class QuerydslConfig {

    private final EntityManager em;

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

이후 JPAQueryFactory을 선언하고 사용하면 된다.

참고

https://tecoble.techcourse.co.kr/post/2021-08-08-basic-querydsl/
https://dingdingmin-back-end-developer.tistory.com/entry/Spring-Data-JPA-7-Querydsl-%EC%82%AC%EC%9A%A9-gradle-7x

0개의 댓글