Querydsl은 정적으로 유형이 지정된 SQL과 유사한 쿼리를 생성할 수 있는 프레임워크이다.
[공식 문서]
gradle
플러그인을 이용해서 Querydsl
을 설정할 수 있다.
대표적인 것은 ewerk
에서 제공하는 플러그인인데, 업데이트가 잘 안된다. github에 들어가서 보면 커밋 주기가 오래된 것을 볼 수 있다. [ewerk/querydsl-plugins]
원한다면 위 플러그인을 사용해도 되고, 아니면 build.gradle
에 디펜던시를 추가해서 설정하는 것도 가능하다.
dependencies {
...(기존 코드)...
// queryDSL 설정
implementation "com.querydsl:querydsl-jpa"
implementation "com.querydsl:querydsl-core"
implementation "com.querydsl:querydsl-collections"
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정
annotationProcessor "jakarta.annotation:jakarta.annotation-api" // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드
annotationProcessor "jakarta.persistence:jakarta.persistence-api" // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드
}
// Querydsl 설정부
def generated = 'src/main/generated'
// querydsl QClass 파일 생성 위치를 지정
tasks.withType(JavaCompile) {
options.getGeneratedSourceOutputDirectory().set(file(generated))
}
// java source set 에 querydsl QClass 위치 추가
sourceSets {
main.java.srcDirs += [ generated ]
}
// gradle clean 시에 QClass 디렉토리 삭제
clean {
delete file(generated)
}
implementation "com.querydsl:querydsl-jpa"
implementation "com.querydsl:querydsl-core"
implementation "com.querydsl:querydsl-collections"
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
build.gradle
에 적은 모든 dependencies
가 필요한 것은 아니다. 첫 번째, 두 번째에 있는 querydsl-jpa
, querydsl-core
, querydsl-apt
정도가 중요하다고 볼 수 있고, querydsl-collections
도 있으면 좋다.
querydsl-apt
에 있는 ${dependencyManagement.importedProperties
은 gradle
에 있는 문법을 사용해서 버전이 자동으로 들어가게끔 한 것이다.
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
// 에러메시지
java.lang.NoClassDefFoundError (javax.annotation.Generated)
java.lang.NoClassDefFoundError (javax.annotation.Entity)
이 코드를 넣지 않은 상태에서 Querydsl을 실행하면 에러가 날 수 있다. 이 에러에 대응할 수 있는 코드가 annotation
, persistence
이다.
미리 넣어주었다.
여기까지만 작성해도
querydsl
의 기본 동작은 된다.
이 아래부터는인텔리제이 IDE
를 사용할때 빌드하다가 생길 수 있는 불편함을 해소하기 위한 코드이다.
def generated = 'src/main/generated'
문자열 타입으로 generated
라는 변수를 만들어주었다. 그리고 파일 경로를 만들어주었다.
Querydsl
은 자동으로 클래스를 만드는 기능을 가지고 있다. 그것을 Qclass
라고 한다. (보통 클래스 이름 앞에 Q
를 붙여서 만들어지기 때문)
이 파일들은 기본적으로 build directory
안에 들어가게 된다. 그래서 우리 눈에 보이지 않는다.
위 코드는 해당 파일들을 우리 눈에 보이게 꺼내오기 위해 경로를 설정해 준 것이다.
왜냐하면 인텔리제이를 사용할 때 발생할 수 있는 잠재적인 문제를 피하기 위함이다.
만약 기본값으로 Qclass
를 생성하면 빌드 디렉토리에 들어가는데, gradle build
할 때 스캔하는 영역과 ide
가 스캔할 때 인텔리제이가 스캔하는 영역이 중복스캔이 일어날 수 있다.
그래서 이런 문제를 해결하기 위해 Qclass
의 생성 폴더 위치를 강제로 변경한 것이다.
tasks.withType(JavaCompile) {
options.getGeneratedSourceOutputDirectory().set(file(generated))
}
자바 컴파일할 때 소스 아웃풋 디렉토리를 바꾸는 코드이다.
sourceSets {
main.java.srcDirs += [ generated ]
}
추가한 새로운 디렉토리를 sourceSet에 등록한다.
Gradle에서는 하나의 Source 디렉터리만 지원을 하는데, 하나 이상의 Source 디렉터리를 Gradle에서 처리를 하기 위해서 SourceSets에 Source 디렉터리를 등록해 주면 된다.
clean {
delete file(generated)
}
gradle clean
할 때 생성한 파일 디렉토리를 삭제하도록 하는 코드이다.
gradle refresh
를 하면 디펜던시들이 설정된다.
그리고 build
를 해주면 디렉토리가 생성된 것을 확인할 수 있다.
Querydsl
로 인해 생성되는 Qclass
파일들은 git
에 올라가면 안된다.
매번 제외하기는 번거로우니, .gitignore
에 추가해준다.
기존에는 gitignore.io에 가서 코드를 만들었으나, querydsl
에 대한 정보는 없으므로 .gitignore
파일에 직접 코드를 작성해주면 된다.
build.gradle
에 만들었던 디렉토리 경로를 .gitignore
에 추가해주면 된다.
이때 경로 맨 앞에 API
설계할 때 root path
로 설정한 /
를 추가해주자.