자바칩

[Issue] JPAQueryFactory 객체 생성자 컴파일 에러 해결 방법 본문

프로젝트

[Issue] JPAQueryFactory 객체 생성자 컴파일 에러 해결 방법

아기제이 2024. 12. 18. 16:07
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'