티스토리 뷰

지금까지는 JPA를 사용하면서 JPA에 Native Query를 사용하거나 jpa method를 조합해서 사용했었다.

아지만 n:m으로 매팽되는 데이터를 사용하게 되었고, 이를 Native Query를 이용해서 해결할 수 있으나 QueryDsl을 써서 해보자는 의견이 나와 QueryDsl을 쓰게 되었다. (아직은 QueryDsl이 뭔지 잘은 모르겠다. jpa의 함수들이 실제 돌아가는게 QueryDsl 기능들을 그 속에 넣어놔서 라고는 하지만...)

 

여하튼 QueryDsl을 쓰게 되었는데 다른 사람들은 IntelliJ, 나 혼자 Eclipse를 사용하게 되었다.

혼자 Eclipse를 쓰는 나, 다른 사람이 작성해놓은 QueryDsl 코드를 pull 받자마자 Q* 클래스들을 못 찾겠다는 에러를 내면서 실행도 되지 않으며 빌드도 되지 않는다.

 

 

위와 같은 에러만 계속 나오고 빌드를 하면 build.gradle에 설정해놓은대로 generated 폴더 아래에 Q 클래스들이 생겨야했다.

하지만 위 에러만 나고 빌드는 안 되니... 정말 이래서 다들 인텔리J, 인텔리J 하는구나 싶었다.

 

 

build.gradle 수정

여러 블로그 및 공식 문서를 뒤져서 해봤지만 결국 제대로 된 것은 찾지 못했고 내 상황에 안 맞거나 부분 적으로 잘못되어 있는 것들이 있었다. 그래서 이 글에 딱 해결할 수 있는 방법을 정리해보려 한다.

 

우선 기존 build.gradle은 인텔리에서는 제대로 돌아가지만 이클립스에서는 제대로 돌아가지 않도록 설정되어 있을 수 있다.

build.gradle 설정한 것 중 querydsl용 설정들을 적어보면 아래와 같다.

//querydsl 추가
buildscript {
   dependencies {
      classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.10")
   }
}

plugins {
	...
	// Querydsl
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

...

apply plugin: "com.ewerk.gradle.plugins.querydsl"

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

...

dependencies {
	...
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	...

	// querydsl
	implementation 'com.querydsl:querydsl-jpa'
	implementation 'com.querydsl:querydsl-apt'
}

...

// querydsl 설정
def querydslDir = "src/main/generated/queryDsl"

querydsl {
	library = "com.querydsl:querydsl-apt"
	jpa = true
	querydslSourcesDir = querydslDir
}

sourceSets {
	main.java.srcDirs = ['src/main/java', querydslDir]
}

compileQuerydsl {
	options.annotationProcessorPath = configurations.querydsl
}

configurations {
	querydsl.extendsFrom compileClasspath
}

 

위의 코드 중에서 querydsl 설정 방법을 찾아보면 나오는 설명들이 있고 추후 querydsl 설정에 대해 제대로 공부하고 정리하고 싶은 마음이 있으니 위를 적을 때 주의할 코드만 짚어보겠다.

 

 

바로 querydsl을 위한 Q 클래스들이 생성될 경로이다. 아래와 같이 딱 명시된 경로로 작성하라는 곳도 있지만,

def querydslDir = "src/main/generated/queryDsl"

 

아래와 같이 $buildDir이라는 변수를 사용해서 'src/main'을 잡게 작성하라는 곳도 있다. 하지만, 아래처럼 $buildDir로 작성을 할 경우 생각했던 것처럼 'src/main/generated/querydsl' 아래에 Q 클래스들이 생성되지 않을 수도 있다.

따라서 만일 $buildDir로 작성하고 build를 했을 때 Q 클래스가 생기지 않는다면 'src/main/...' 처럼 아예 경로를 명시해주면 에러가 발생하지 않는다.

def querydslDir = "$buildDir/generated/queryDsl"

 

 

build해서 Q 클래스 생성 후 build path 설정

스프링부트 애플리케이션을 build 하는 방법은 많이들 아시다시피 Window > Show View > Other... 에서 Gradle Build 창을 켜서 build를 더블클릭해서 손쉽게 할 수 있다.

 

하지만 나는 이미 인텔리 J에서 Q 클래스를 사용한 코드를 넘겨 받았고, 당연히 Q 클래스를 찾을 수 없다는 에러가 뜨고, 에러가 있어서 gradle build 창에서는 build를 할 수 없었다.

그래서 cmd 창을 열어 에러가 나든 말든 명령어로 build를 시키기로 결심했다.

 

cmd 창을 열어 'cd ${프로젝트 경로}' 명령어를 쳐서 해당 프로젝트 경로로 이동한다. 그리고 아래 명령어를 쳐서 build를 한다.

gradlew build

 

그러면 build가 시작되고 중간에 Q 클래스를 찾을 수 없기에 많은 에러 로그를 남기고 build를 마칠 것이다.

build를 한 후에 설정해놓은 Q 클래스 생성 경로를 찾아 들어가 보면 설정 해놓은대로 'src/main/generated/queryDsl'이 생성되고 그 안에 Q 클래스들이 생성된 것을 확인할 수 있다.

 

Q 클래스들이 생성된 것을 확인했다면 해당 프로젝트를 다시 이클립스로 연다. 만일 이미 이클립스로 연 상태라면 다시 닫았다가 열길 추천한다. 그래야 build Path 설정에서 만들어진 queryDsl 폴더를 찾지 못하는 상황이 없어진다.

 

프로젝트를 이클립스로 다시 열었다면 프로젝트에 마우스 우클릭을 해서 build Path > Configure Build Path 창을 연다.

 

Configure Build Path 창을 열어 Java Build Path > Source 탭에서 Add Folder... 를 클릭한다.

 

Source Folder를 선택하는 창에서 아까 build를 해서 생성된 Q 클래스가 있는 폴더를 선택한다.

만일 'src/main/generated'로만 설정했다면 generated에만 체크하면 되지만, queryDsl과 같은 하위 폴더를 생성하고 그 안에 Q 클래스를 생성했다면 그 하위 폴더(queryDsl)을 선택해준다.

 

위의 build Path 설정을 모두 마치면 아래와 같이 프로젝트에 Q 클래스가 있는 'src/main/generated/queryDsl' 폴더가 import 된 것을 볼 수 있다.

 

그러면 더 이상 오류가 발생하지 않고 다른 클래스들처럼 Q 클래스를 import해 사용할 수 있다.

 

하지만, 만일 위 build Path 설정을 할 때 Q 클래스가 들어 있는 하위 클래스가 아니라 generated 까지만 했다면 해당 폴더 안에 있는 Q 클래스들의 package가 다 달라져서 그걸 일일이 변경해줘야 한다.

그러므로 꼭 Q 클래스가 생성된 하위 폴더로 build path의 source를 추가해야 한다.

 

 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 29 30 31
글 보관함