목차

  1. gradle 설정 (build.gradle)
  2. 빌드 실패 해결 삽질기
  3. 마치며

일단 현재 저의 라이브러리 현황은 아래와 같습니다.

  • 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
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
buildscript {
ext {
// ... 그냥 버전정보 전역으로 쓰려고 ..
springDataJpaVersion = '1.11.13.RELEASE'
springDataMongoDbVersion = '1.10.8.RELEASE'
queryDslVersion = '4.2.1'
queryDslPluginVersion = '1.0.9'
// ...
}

dependencies {
// ...
classpath "gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:${queryDslPluginVersion}"
// ...
}
}

dependencies {
// ...
compile "org.springframework.data:spring-data-jpa:${springDataJpaVersion}"
compile "org.springframework.data:spring-data-mongodb:${springDataMongoDbVersion}"
compile "com.querydsl:querydsl-jpa:${queryDslVersion}"
compile "com.querydsl:querydsl-mongodb:${queryDslVersion}"
compileOnly "com.querydsl:querydsl-apt:${queryDslVersion}"
// ...
}

일단 필요한 의존성 설정은 저렇게 됩니다. 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
28
def 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
2
3
4
5
@QueryProjection // 요놈이 문제다. 요놈 제거하자.
public Option(OptionType type, List<OptionCombination> combinations) {
this.type = type;
this.combinations = combinations;
}

1번 줄의 @QueryProjection이 있는 코드를 넣었더니 Jpa, Mongo 관련 AnnotationProcessor들이 내부적으로 뭐 충돌이 있는건지 뭔지 빌드가 안되었습니다. 그래서 저 부분을 찾아 전부 없애줬더니 해결은 되었습니다.

다만, 저걸 필요해서 넣었던건데 없애버렸으니 query 할 때 다른 방법을 찾아봐야 할 것 같네요.

마치며

결국 깊은 이해 없이 야매로 해결하긴 했습니다. 역시 CNP 개발 방법론(Copy & Paste)에 의거하여 작업할 땐 조심해야 합니다.

그리고 작업자들끼리 gradle 쓰자고 맞춘거였는데.. maven 쓸 땐 이런 문제가 없었는데 괜히 gradle 도입해서.. 영 찝찝하게 됐네요.