자바칩
[Issue] JPAQueryFactory 객체 생성자 컴파일 에러 해결 방법 본문
728x90
이슈
Spring Boot 3.x 이상에서는 무조건 jakarta를 사용하지만, QueryDSL 라이브러리 내 JPAQueryFactory에서는 생성자 매개변수인 EntityManager를 javax로 사용한다.
라이브러리와 타입을 정확히 맞춰주기 위해 EntityManager 매개변수 타입을 강제로 javax로 import를 할 시에는 아래와 같은 에러가 발생한다.
Specified field type [interface javax.persistence.EntityManager] is incompatible with resource type [jakarta.persistence.EntityManager]
즉, 아래처럼 EntityManager를 javax로 강제 사용할 시 발생하는 에러이다.
import javax.persistence.EntityManager;
@Configuration
public class QuerydslConfig {
// EntityManager를 빈으로 주입할 때 사용하는 어노테이션
@PersistenceContext
private EntityManager entityManager;
// JPAQueryFactory를 Bean으로 등록해서 프로젝트 전역에서 사용할 수 있도록 함
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
해결 방법
이것을 해결하느라 하루가 걸렸다.
QueryDSL 의존성을 추가할 때, 정확히 아래처럼만 하면 된다.
querydsl-jpa와 querydsl-apt 끝에 버전(5.0.0)과 jakarta를 반드시 명시하여야 JPAQueryFactory의 생성자를 컴파일 에러 없이 사용 가능하다.
javax를 일부러 사용 가능하도록 추가해보고 별 짓을 다해봤는데 너무 허무하다.....
// QueryDSL 의존성 추가
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta'
// java.lang.NoClassDefFoundError(javax.annotation.Entity) 발생 대응
annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
// java.lang.NoClassDefFoundError(javax.annotation.Generated) 발생 대응
annotationProcessor 'jakarta.annotation:jakarta.annotation-api'
// Spring Boot 3.x에서 Jakarta 기반 JPA
implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0'
'프로젝트' 카테고리의 다른 글
[Issue] Locust를 사용하여 부하 테스트 진행 후 성능 최적화 (1) | 2024.09.15 |
---|---|
[프로젝트] 공연 예매 연습 웹 사이트: ERD (0) | 2024.05.29 |