본문 바로가기
프로그래밍/Spring

Springboot 3.0 Maven, QueryDSL설정 자료.

by Mr-후 2023. 4. 28.
반응형

오늘, 책을 보며 따라하기 중, QueryDSL설정 부분이 제대로 되지 않아 몇 시간 휭~ 하고 날렸다. 덕분에 시간은 아주 잘 갔고 즐거운 금요일이 되긴했지만 참 요상한 일이었다. 

 

알고 보니, 스프링부트의 버전에 따른 QueryDSL설정의 방법이 달라진 것 같다. 검색 자료들의 대부분이 같은 오류를 내뱉지만 해결은 수월했다. gradle프로젝트에서는 다양한 해결책이 검색 결과로 많았지만, maven 설정에 대한 자료는 많지 않았다. 

아마도 그만큼 메이븐을 이제는 많이 사용하지 않는것인가? 

하여튼, 누군가도 나와 똑같은 현상을 겪었고 해결했다는 내용을 올렸지만 그대로 따라 했을 때 나는 되지 않았다. 

차이점을 찾기 위해 이런 저런 버전들을 계속 바꿔가면서 시도를 했는데... 3시간만에 감잡고 원인을 해결할 수 있었다. 

이제 내맘같지않다! 

책의 설정대로 옮겨 백문이 불여일타 ~ 라는 마음으로 적었지만 빌드가 되지 않으니 짜증이~ 짜증이 ~ ^^; 

[INFO] 
[INFO] --- apt-maven-plugin:1.1.3:process (default) @ shop ---
[ERROR] execute error
java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: javax/persistence/Entity
    at java.util.concurrent.FutureTask.report (FutureTask.java:122)

오류는 대략 이렇게 떨어졌다. 

[ERROR] execute error
java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: javax/persistence/Entity

 

캬 ..이게 뭐냐? 검색했더니 QueryDSL설정과 관련된 오류라고 쭈욱 나온다. 

내가 추가한 의존성과 플러그인 소스는 다음과 같다. 

<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.0</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

    

<dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>5.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>5.0.0</version>
    </dependency>
        
        
        <plugin>
        <groupId>com.mysema.maven</groupId>
        <artifactId>apt-maven-plugin</artifactId>
        <version>1.1.3</version>
        <executions>
            <execution>
                <goals>
                    <goal>process</goal>
                </goals>
                <configuration>
                    <outputDirectory>target/generated-sources/java</outputDirectory>
                    <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                </configuration>
            </execution>
        </executions>
    </plugin>

 

쫌 많이 검색을 했는데, 결국 찾은 건, 스프링부트의 버전이 3.0.0으로 설정되어 있으니, 2.x는 모르겠지만 

querydsl-apt와 querydsl-jpa부분에 추가해줘야할 항목이 있다는 것이다. 그것은

<classifier>jakarta</classifier>

 

이렇게까지만 하고 적용했을 때 target/generated-sources/java 아래 Q도메인 파일이 만들어지는 것 까지 확인을 했다. 

저 위의 버전들은 모두 5.0.0 으로 해야하고 4.3.1이나 다른 버전을 사용한다면 다른 오류를 만나게 된다. 

[ERROR] Failed to execute goal com.mysema.maven:apt-maven-plugin:1.1.3:process (default) on project shop: java.lang.RuntimeException: java.lang.NoClassDefFoundError: com/mysema/codegen/model/Type: com.mysema.codegen.model.Type -> [Help 1]

 

어쩌면 저렇게 핑퐁쳐가면서 버전을 하나 하나 맞춰가야 하는 것 때문에 영원히 맴돌수있을지도 모르겠다. 

다시, 버전을 5.0.0으로 변경하고 컴파일하니, 이젠 아래와 같은 오류가 나타났다. 

 

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project shop: Compilation failure: Compilation failure: 

 

이것 역시 찾아보니, 메이븐 버전이 맞지 않다고 한다. 뭔소리인가? 하고 로컬 메이븐 버전을 확인해밨다. 

 ~ % mvn -version 
-> Apache Maven 3.8.7 (b89d5959fcde851dcb1c8946a785a163f14e1e29) 

그런데 이것도 뭔가 이상하다. 상관없을 것 같은데? 라는 의구심이 들었다. 

 

문구에 Failed to execute goal 이야기가 있어, 플러그인의 아래 내용을 주석으로 막고 컴파일을 했더니, 언제 그랬냐는 듯, 깔끔하게 컴파일이 완료되었고, Q도메인 파일이 만들어졌다. 따라서 JPAQeury를 이용한 queryDSL을 사용할 수 있게 되었다. 

참 어려운 설정이다. 

<goals>
   <goal>process</goal>
</goals>

 

반응형