gradle 프로젝트에서 querydsl 설정하기
목차
일단 현재 저의 라이브러리 현황은 아래와 같습니다.
- gradle 4.6
- querydsl 4.2.1
- spring-data-jpa 1.11.13.RELEASE
- spring-data-mongodb 1.10.8.RELEASE
이 글을 보시는 분들이라면 spring-data-jpa, spring-data-mongodb, querydsl이 뭔진 다 아실테니 설명은 과감히 생략하겠습니다.
저희 프로젝트에서는 spring-data-jpa, spring-data-mongodb 둘 다 querydsl을 이용해 쿼리 해야할 필요가 있어서 설정을 해보았습니다.
gradle 설정 (build.gradle)
1 | buildscript { |
일단 필요한 의존성 설정은 저렇게 됩니다. querydsl 설정은 아래처럼 하게됩니다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28def generatedQueryDslDir = 'target/generated-sources/java'
sourceSets {
main {
java {
srcDir generatedQueryDslDir
}
}
}
querydsl {
jpa = true
springDataMongo = true
querydslDefault = true
querydslSourcesDir = generatedQueryDslDir
}
project.afterEvaluate {
project.tasks.compileQuerydsl.options.compilerArgs = [
"-proc:only",
"-processor", project.querydsl.processors() + ',lombok.launch.AnnotationProcessorHider$AnnotationProcessor'
// 직접 명시할 경우 아래처럼
// "-processor", 'com.querydsl.apt.jpa.JPAAnnotationProcessor,org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor,lombok.launch.AnnotationProcessorHider$AnnotationProcessor'
// 혹은 "-processor", 'com.querydsl.apt.jpa.JPAAnnotationProcessor,com.querydsl.apt.QuerydslAnnotationProcessor,lombok.launch.AnnotationProcessorHider$AnnotationProcessor'
]
}
(querydsl 블럭에 대한 정보는 https://github.com/ewerk/gradle-plugins/tree/master/querydsl-plugin 여길 참고해주세요.)
사실 저도 완벽하게 이해하고 사용한 것은 아닙니다만.. 여기저기 구글링 한 후 조합한 결과가 저것입니다.
21번 줄 project.querydsl.processors()
이렇게 하면 이 프로젝트에 등록된 AnnotationProcessors가 그냥 다 들어가기 때문에 명시를 따로 안해줘도 됩니다만 직접 지정해야할 필요성이 있을때엔 24번 줄 주석처럼 하면 됩니다.
참고로 lombok 사용 중이면 lombok.launch.AnnotationProcessorHider$AnnotationProcessor
이걸 꼭 넣어야합니다. 안쓰면 안해도 됩니다.
이렇게 하면 jpa entity 객체와 mongo document 객체에 대한 QClass가 위 코드의 1번 줄에서 명시한 패스에 생성됩니다.
빌드 실패 해결 삽질기
그런데, 저렇게 설정했는데 계속 빌드가 실패했습니다. 심지어 로그도 안남고요.
이 프로젝트는 maven으로 만들었던 다른 프로젝트의 일부를 그대로 가져와야 하는 작업이었는데요. 그때 복붙하다가 뭔가 잘못된게 있는것 같았습니다.
내부적으로 뭔가 충돌이 된것 같은데 알 수가 없어서 이것저것 코드를 몇 시간 살펴본 결과..
1 | // 요놈이 문제다. 요놈 제거하자. |
1번 줄의 @QueryProjection
이 있는 코드를 넣었더니 Jpa, Mongo 관련 AnnotationProcessor들이 내부적으로 뭐 충돌이 있는건지 뭔지 빌드가 안되었습니다. 그래서 저 부분을 찾아 전부 없애줬더니 해결은 되었습니다.
다만, 저걸 필요해서 넣었던건데 없애버렸으니 query 할 때 다른 방법을 찾아봐야 할 것 같네요.
마치며
결국 깊은 이해 없이 야매로 해결하긴 했습니다. 역시 CNP 개발 방법론(Copy & Paste)에 의거하여 작업할 땐 조심해야 합니다.
그리고 작업자들끼리 gradle 쓰자고 맞춘거였는데.. maven 쓸 땐 이런 문제가 없었는데 괜히 gradle 도입해서.. 영 찝찝하게 됐네요.