• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

QClass가 생성되지만 import가 안되는 문제에 관하여

23.01.05 11:35 작성 조회수 3.88k

2

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.7'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.tony'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}


dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-validation'

    implementation 'com.querydsl:querydsl-core'
    implementation 'com.querydsl:querydsl-jpa'

    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
    annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
    annotationProcessor 'jakarta.annotation:jakarta.annotation-api'

    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

안녕하세요 호돌맨 선생님 질문이 있습니다.

위와 같은 build.gradle 로 했을시에 build/generated에 QPost.java 가 생성되는것을 확인했지만

실제 PostRepositoryImpl에서 import를 해올수 없었습니다.

구글링을 하며 여러 시도를 했었지만 다 실패해더라구요

하지만 운좋게 아래와 같은 설정( https://velog.io/@soyeon207/QueryDSL-Spring-Boot-%EC%97%90%EC%84%9C-QueryDSL-JPA-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0 )을 찾아서 import하는데 성공했습니다.

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.7'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.tony'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}


dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-validation'

    implementation 'com.querydsl:querydsl-core'
    implementation 'com.querydsl:querydsl-jpa'

    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
    annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
    annotationProcessor 'jakarta.annotation:jakarta.annotation-api'

    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

def querydslSrcDir = 'src/main/generated'
sourceSets {
    main {
        java {
            srcDirs += [ querydslSrcDir ]
        }
    }
}

compileJava {
    options.compilerArgs << '-Aquerydsl.generatedAnnotationClass=javax.annotation.Generated'
}

tasks.withType(JavaCompile) {
    options.generatedSourceOutputDirectory = file(querydslSrcDir)
}

clean {
    delete file(querydslSrcDir)
}


tasks.named('test') {
    useJUnitPlatform()
}

이 방식으로 하면 build/generated에는 프로젝트 폴더들만 생기고

src/main/generated에 Post.java 가 생겨서 PostRepostioryImpl에도 잘 import가 되는데
이렇게 해도 추후에 문제가 되는부분이 있을까요?

답변 1

답변을 작성해보세요.

1

안녕하세요. 호돌맨입니다.

왠지 그렇게 하면 안될것 같은 느낌이 듭니다.
다른 사람들은 잘 되는데 나만 문제가 발생하면 우선은 당장 되는 방법을 마련하기보다 그 차이점을 찾아내는게 도움이 될겁니다.

가능한 build/src/main/generated/...는 빌드로 생성될 파일이 들어가는 게 맞을것 같은데요. Post.java는 Entity 파일이기 때문에 들어가면 안될것 같습니다.
강의에서는 build/src/main/generated/annotationProcessor/java/main/패키지명/에 Q파일이 생성하도록 만들었습니다.
정확하게 어디에 위치 해 있는지 얘기 해주시면 좋을것 같습니다.

질문자님이 주신 before build.gradle를 통해 실행 해봤는데도 잘 되는거 봐서는 다른 문제일 가능성이 보입니다. Intellij에 설정이 어떻게 되어있는지 같이 알려주시고(페이징 처리 (QueryDSL) 6분 26초부터 시작) Github 소스를 첨부해주시면 테스트 해보도록 하겠습니다.

아래 링크에 강의자료가 있으니 어떤 차이가 있는지 확인 해보시는것도 좋을것 같습니다.

https://www.inflearn.com/course/%ED%98%B8%EB%8F%8C%EB%A7%A8-%EC%9A%94%EC%A0%88%EB%B3%B5%ED%86%B5-%EA%B0%9C%EB%B0%9C%EC%87%BC/unit/132489

감사합니다.

임도현님의 프로필

임도현

질문자

2023.01.06

https://github.com/kuuku123/hodol_blog

 

저는 2개의 branch에서 gradle clean -> build 순으로 했었을때

main branch가 잘되는 두번째 설정이고

original_gradle_build branch는 첫번째 설정입니다.

image

image

image잘되는 버전 (main) src/main/generated에 QPost.java가 생김

 

image잘안되는 버전입니다. (original_gradle_build) build/generated/에 QPost.java가 생김

 

 잘안되는 버전이 호돌맨님과 동일한 것인데 왜 build/generated 가 클래스패스로 인식을 못하는것일까욤..

 

 

1. src/main/generated 폴더 삭제

image

Q파일은 build/generated/annotationProcessor/... 에 들어가야합니다. src/generated를 삭제해주세요.

2. 빌드

image오른쪽 gradle에서 build->build를 따블클릭하여 빌드합니다.

해결될겁니다.

감사합니다.

임도현님의 프로필

임도현

질문자

2023.01.06

선생님 원인을 알았습니다~ 나이따~

image그냥 로컬 윈도우에서 오리지날 bulid.gradle로 빌드하니 빨간동그라미 build/generated가 저절로 추가되더라구요

wsl2환경이라 뭔가 자동으로 설정이 안되었나봅니다. 제가 수동으로 추가하니 잘되네요~

답변 감사합니다~

 

굳굳! 잘 해내셨습니다.

다음에도 문제가 생기면 root cause를 잘 분석해봅시다!

감사합니다.