프로젝트 스펙은 다음과 같았습니다.
- jdk 17
- spring boot 2.7.18
QueryDSL 의존성은 다음과 같이 추가했습니다.
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
이 상황에서 빌드를 수행하니 다음과 같은 에러가 발생했습니다.
Execution failed for task ':compileJava'. > java.lang.NoClassDefFoundError: jakarta/persistence/Entity
컴파일 작업을 수행 중에 jakarta/persistence/Entity 를 발견하지 못했다는 것입니다.
현재 jakarta.annotation-api 와 jakarta.persistence-api 의 버전은 다음과 같았습니다.
- jakarta.persistence-api : 2.2.3
- jakarta.annotation-api : 1.3.5
에러가 난 이유와 관련된 라이브러리는 jakarta.persistence-api 라고 하여 이 버전을 올려 보려고 했습니다.
메이븐 레파지토리에서 확인한 결과 다음과 같이 버전들이 나열되어 있었습니다.
보통 Usages가 가장 높은 버전을 선호하는데 이유는 다음과 같습니다.
- 안정성: Usages 수가 많은 버전은 다른 프로젝트에서 많이 사용되고 있다는 뜻이므로, 상대적으로 안정성이 높다고 볼 수 있습니다.
- 커뮤니티 검증: Usages가 많은 버전은 커뮤니티에서도 자주 사용되므로, 문제나 버그에 대한 해결 방법을 찾기가 쉽습니다.
- 호환성: 널리 쓰이는 버전은 다양한 환경에서 테스트되었기 때문에, 다른 라이브러리와의 호환성이 높을 가능성이 있습니다.
- 장기적인 유지보수: 많이 사용되는 버전은 보통 장기적인 유지보수가 더 잘 이루어질 가능성이 큽니다.
위와 같은 이유로 3.1.0 버전을 선택하여 재빌드를 해봤습니다.
하지만 이번에는 jakarta.persistence 패키지 자체를 인식하지 못하는 에러가 발생했습니다.
error: package javax.persistence does not exist import javax.persistence.Column
확인해보니 기존에 2.2.3은 어떤 라이브러리 의존성에 의해 계속 존재한 상태였고 3.1.0이 추가되어 라이브러리 충돌로 인해 패키지를 찾지 못하는 것으로 보여졌습니다.
다시 jakarta.persistence-api의 버전을 원복하고 다른 방법을 찾아보기로 했습니다.
위 블로그를 살펴보는 중 스프링 부트 3.0 미만은 jakarta를 뺀 상태에서 의존성 주입을 하라고 나와 있어서 밑에 처럼 수정 후 빌드했더니 성공했습니다.
implementation 'com.querydsl:querydsl-jpa:5.0.0'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jpa"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
'[개발] 프레임워크 > QueryDSL' 카테고리의 다른 글
[QueryDSL] LocalDateTime, LocalDate 파라미터 바인딩 시 'MM/dd/yyyy HH:mm:ss' 로 표시될 때 해결 방법 (1) | 2024.12.14 |
---|---|
[QueryDSL] projection으로 테이블 조인 결과 데이터 매핑하기 (0) | 2024.12.03 |