티스토리 뷰

지난 글 중에 Gradle Multi Module에 관한 글을 올린 적이 있다

이 글은 지난 글에서 이어지는 내용으로 QueryDSL을 사용하는 멀티 모듈 세팅을 계획하고 있다면 참고할만하다

 

 

멀티 모듈 세팅에 정답은 없는 것 같다 나는 아래와 같은 형태로 나누어 봤다

module-api -> Controller

module-common -> Entity, Repository

module-service -> Service, DTO

 

프로젝트 작성자가 편한 방식으로 구성하면 되는데 한 가지 주의할 점이 있다

바로 모듈 간의 관계성을 조심해야 하는데 기껏 멀티 모듈을 구성했는데 모듈 간의 관계가 깔끔하게 정립되지 않고

실타래처럼 엉켜있다면 그건 멀티 모듈로 구성한 의미가 없다

따라서 핵심은 모듈 간의 관계에 주의하고 각 모듈에서 필요하지 않은 dependencies가 들어가지 않도록 관리해주어야 한다

지금 진행 중인 프로젝트는 전체적인 세팅은 얼추 갖춰졌고 코드를 작성하며 배포가 가능할 때쯤

모듈에서 필요하지 않은 dependencies를 걷어낼 관리를 할 계획이다

 

여기까지 간략한 멀티 모듈 구성에 대한 설명이었고 이번 글에서 말하고 싶은 것은 QueryDSL setting에 관해서다

Springboot와 Gradle이 버전 업을 하며 QueryDSL 세팅 방법이 약간 달라졌다

아래 블로그에 아주 상세히 나와있으니 자세한 설명을 보려면 참고하면 좋다

 

[gradle] 그레이들 Annotation processor 와 Querydsl - I'm honeymon(JiHeon Kim).

이 글에서 다룰 예정인 ‘Querydsl’과 ‘Annotation processor’ 에 관한 내용도, 스프링 부트를 버전업하는 과정에서 겪게 된다. 사내 개발기기 교체주기가 되어 새로운 맥북을 받고 스프링 부트 버전

honeymon.io

 

이 방법은 plugin을 이용하는 방법으로 2018.7월 이후 업데이트가 없다고 한다

최신 부트와 그레들을 이용한다면 제대로 동작하지 않을 수 있다

compileQuerydsl task를 통해 Q-file을 만들 수 있고 만들어진 객체로 querydsl을 사용하면 된다

 

 

 

아래 사진이 새롭게 바뀐 annotation-processor 방식의 세팅 방법이다

주석은 이 세팅 방법을 외우지는 않더라도 동작 방식을 이해하기 위해 남겨놨다

이 역시 자세한 설명은 위 블로그를 참고하도록 하자

 

annotation 방식을 이용할 때 한 가지 주의할 점이 있다

블로그를 참조해 제대로 세팅을 한 것 같은데도 Q-file이 생성되지 않아 구글을 또 헤맸다

Preferences -> Gradle 검색 시 아래와 같은 화면이 뜨게 되는데

인프런 김영한 님의 강의를 보면 대체로 속도를 위해 Build를 Gradle로 하지 말고 Intellij를 이용하라고 하셔서

습관적으로 프로젝트 생성 후 빌드를 인텔리제이를 통해 하도록 바꿔놨는데 이것이 문제였다

 

Build 할 때 Gradle이 annotationProcessor로 선언되어 있는 라이브러리의 annotation-processor를

찾아서 빌드해야 하는데 인텔리제이를 이용하면 찾을 수가 없으니 생성물이 나오질 않은 것이었다

Build 할 때만 Gradle의 힘을 빌리면 되니 test는 빠른 속도를 위해 인텔리제이로 하도록 두었다

 

 

plugin 방식의 세팅이 안 된다면 참고해보세요

'module-common' 은 자신의 모듈 또는 루트 프로젝트 이름을 넣으시면 됩니다

configure('module-common') {
    apply plugin: "io.spring.dependency-management"

    dependencies {
        implementation "com.querydsl:querydsl-core"
        implementation "com.querydsl:querydsl-jpa"

        annotationProcessor("com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa")
        // querydsl JPAAnnotationProcessor 사용 지정
        annotationProcessor("jakarta.persistence:jakarta.persistence-api")
        // java.lang.NoClassDefFoundError(javax.annotation.Entity) 발생 대응
        annotationProcessor("jakarta.annotation:jakarta.annotation-api")
        // java.lang.NoClassDefFoundError (javax.annotation.Generated) 발생 대응
    }

    // clean 태스크와 cleanGeneatedDir 태스크 중 취향에 따라서 선택하세요.
    /** clean 태스크 실행시 QClass 삭제 */
	//    clean {
	//        delete file('src/main/generated') // 인텔리제이 Annotation processor 생성물 생성위치
	//    }

    /**
     * 인텔리제이 Annotation processor 에 생성되는 'src/main/generated' 디렉터리 삭제
     */
    task cleanGeneatedDir(type: Delete) { // 인텔리제이 annotation processor 가 생성한 Q클래스가 clean 태스크로 삭제되는 게 불편하다면 둘 중에 하나를 선택
        delete file('src/main/generated')
    }
}
댓글
링크
글 보관함
«   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
Total
Today
Yesterday