본문 바로가기

JAVA/JPA

[Spring] Querydsl 설정하기

 
사전 작업 :  [Spring] JPA Sample 
 
 
파일명 : build.gradle
 
최상단에 다음의 buildScript 추가
 
// queryDsl 
buildscript {
    ext{
        querydslPluginVersion = '1.0.10'
    }
    repositories {
        maven { url "https//plugins.gradle.org/m2/"}
    }
    dependencies {
        classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:${querydslPluginVersion}")
    }
}
 
이 후 각자 설정에 맞는 위치에 밑줄 친 내용 추가
 
configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
    compileOnly {
        extendsFrom annotationProcessor
    }
 
    // querydsl
    querydsl.extendsFrom compileClasspath
}
 
dependencies {
        ...
 
    // querydsl
    implementation("com.querydsl:querydsl-jpa") // querydsl
    implementation("com.querydsl:querydsl-apt") // querydsl
}
 
// querydsl
// Plugin 적용
apply plugin: "com.ewerk.gradle.plugins.querydsl" 
 
// QClass 생성 위치
def querydslSrcDir = 'src/main/generated' 
 
querydsl {
    library = "com.querydsl:querydsl-apt"
    jpa = true
    querydslSourcesDir = querydslSrcDir
}
 
 
sourceSets {
    main {
        java {
            srcDirs = ['src/main/java', querydslSrcDir]
        }
    }
}
 
 
compileQuerydsl{
    options.annotationProcessorPath = configurations.querydsl
}
 
 
  1. Java Config 설정
 
@Configuration
public class QuerydslConfig {
 
 
    @PersistenceContext
    private EntityManager entityManager;
 
 
    @Bean
    public JPAQueryFactory jpaQueryFactory() {
        return new JPAQueryFactory(entityManager);
    }
}
 
  1. BootRun 실행시켜보기 
정상적으로 어플리케이션이 실행이 되는 지 확인해봅니다.
이 단계에서는 querydsl에 대한 테스트를 하는 것은 아니고 설정내용이 제대로 적용되어서 어플리케이션 동작에 문제가 없는 지 확인하는 단계입니다.
 
querydsl 을 사용할 수 있게 되었다면 다음과 같은 디렉토리 구조가 생성되었을 것입니다 .
 
main/ 
    generated/
    ...
        testsample/
            QTestSample.java
 
설정에 의해서 querydsl에 필요한 파일들은 위와 같이 generated 위치에 생성됩니다.
 
  1. Repository 적용하기
우리는 JpaRepository를 상속받은 repository 클래스가 있습니다. 
JPA사용할 때 querydsl도 같이 사용할 것이고 이에 따라서 repository도 service에서 하나만 가져다가 쓰고 싶습니다.
 
그렇게 하기 위한 작업을 다음의 과정에서 진행할 것인데, 그 전에 하나의 repository 에서 어떻게 JpaRepository의 기능과 querydsl에서 정의한 메소드를 사용할 수 있는지에 대한 전체적인 그림을 보겠습니다. 
 
해당 작업을 위한 디렉토리구조는 다음과 같습니다.
 
 
com/ 
    domain/
        testsample/
                TestSampleRepositoryCustom
        TestSampleRepositoryImpl
 
파일명 : 
 
public interface TestSampleRepositoryCustom {
    List<TestSample> findByName(String name);
}
 
파일명 : 
 
@RequiredArgsConstructor
public class TestSampleRepositoryImpl implements TestSampleRepositoryCustom {
 
    private final JPAQueryFactory jpaQueryFactory;
 
    @Override
    public List<TestSample> findByName(String name) {
        return jpaQueryFactory.selectFrom(testSample)
                .where(testSample.name.eq(name))
                .fetch();
    }
}
 
추가적으로 JpaRepository를 상속받았던 TestSampleRepository에 내용을 추가합니다.
 
@Repository
public interface TestSampleRepository extends JpaRepository<TestSample, String>, TestSampleRepositoryCustom {
}
 
이제 Service에서 위의 TestSampleRepository 를 의존성 주입 받은 뒤 TestSampleRepositoryImpl에서 구현했던 findByName 기능을 사용할 수 있습니다.
 
  1. 정상작동 확인 테스트케이스 
 
단순하게 제대로 진행이 되는지만 확인하고 마무리 짓기 위해서 다음의 코드를 테스트케이스에 추가합니다.
 
@Test
public void querydslTest() {
    System.out.println(testSampleRepository.findByName("test_name"));
}
 
  1. 주의사항 
 
단 위에서 generated라는 디렉토리에 관해서는 자동생성되는 파일의 디렉토리이니 .gitignore에 추가해주시면 됩니다. 
 
파일명 : .gitignore 
/src/main/generated/
 
 
참고 자료 :