[Java/SpringBoot] 인텔리제이 + Gradle 프로젝트에 Querydsl 설정하기

minjung·2022년 11월 27일
0

💡Querydsl이란

Querydsl은 정적으로 유형이 지정된 SQL과 유사한 쿼리를 생성할 수 있는 프레임워크이다.
[공식 문서]


gradle 플러그인을 이용해서 Querydsl을 설정할 수 있다.
대표적인 것은 ewerk에서 제공하는 플러그인인데, 업데이트가 잘 안된다. github에 들어가서 보면 커밋 주기가 오래된 것을 볼 수 있다. [ewerk/querydsl-plugins]

원한다면 위 플러그인을 사용해도 되고, 아니면 build.gradle에 디펜던시를 추가해서 설정하는 것도 가능하다.


💡build.gradle에 Querydsl 설정

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)
}

각 코드 설명

  • jpa, core, collections, apt

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.importedPropertiesgradle에 있는 문법을 사용해서 버전이 자동으로 들어가게끔 한 것이다.


  • annotation, persistence

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를 사용할때 빌드하다가 생길 수 있는 불편함을 해소하기 위한 코드이다.


  • generated

def generated = 'src/main/generated'

문자열 타입으로 generated라는 변수를 만들어주었다. 그리고 파일 경로를 만들어주었다.

Querydsl은 자동으로 클래스를 만드는 기능을 가지고 있다. 그것을 Qclass라고 한다. (보통 클래스 이름 앞에 Q를 붙여서 만들어지기 때문)
이 파일들은 기본적으로 build directory 안에 들어가게 된다. 그래서 우리 눈에 보이지 않는다.
위 코드는 해당 파일들을 우리 눈에 보이게 꺼내오기 위해 경로를 설정해 준 것이다.

왜냐하면 인텔리제이를 사용할 때 발생할 수 있는 잠재적인 문제를 피하기 위함이다.
만약 기본값으로 Qclass를 생성하면 빌드 디렉토리에 들어가는데, gradle build할 때 스캔하는 영역과 ide가 스캔할 때 인텔리제이가 스캔하는 영역이 중복스캔이 일어날 수 있다.
그래서 이런 문제를 해결하기 위해 Qclass의 생성 폴더 위치를 강제로 변경한 것이다.


  • JavaCompile

tasks.withType(JavaCompile) {
    options.getGeneratedSourceOutputDirectory().set(file(generated))
}

자바 컴파일할 때 소스 아웃풋 디렉토리를 바꾸는 코드이다.


  • sourceSets

sourceSets {
    main.java.srcDirs += [ generated ]
}

추가한 새로운 디렉토리를 sourceSet에 등록한다.
Gradle에서는 하나의 Source 디렉터리만 지원을 하는데, 하나 이상의 Source 디렉터리를 Gradle에서 처리를 하기 위해서 SourceSets에 Source 디렉터리를 등록해 주면 된다.


  • clean

clean {
    delete file(generated)
}

gradle clean할 때 생성한 파일 디렉토리를 삭제하도록 하는 코드이다.


💡완료

gradle refresh

gradle refresh를 하면 디펜던시들이 설정된다.


gradle build

그리고 build를 해주면 디렉토리가 생성된 것을 확인할 수 있다.


💡추가설정 (gitignore)

Querydsl로 인해 생성되는 Qclass 파일들은 git에 올라가면 안된다.
매번 제외하기는 번거로우니, .gitignore에 추가해준다.
기존에는 gitignore.io에 가서 코드를 만들었으나, querydsl에 대한 정보는 없으므로 .gitignore파일에 직접 코드를 작성해주면 된다.

gitignore 파일 생성하기 (gitignore.io)

build.gradle에 만들었던 디렉토리 경로를 .gitignore에 추가해주면 된다.
이때 경로 맨 앞에 API 설계할 때 root path로 설정한 /를 추가해주자.

API 설계하기 (url, method, spec 문서화하기)


참고링크

Querydsl 공식문서
Gradle SourceSets | goateedev
SourceSets 공식문서

0개의 댓글