JAVA/Spring Boot
[QueryDSL] QuerySyntaxException: {Entity} is not mapped (feat. Multi Datasource)
남기루
2023. 11. 10. 15:53
반응형
오류
QueryDSL적용중 QuerySyntaxException: {Entity} is not mapped 오류 발생
원인을 찾기 위해 이것 저것 찾아보고 별걸 다 해보다가 포기..
다음날 맑은 정신으로 보니 바로 보이는 문제점..
원인
결론부터 말하면 Multi Datasource구성 때문이였다
- 쿼리를 만들 때 사용하는 JPAQueryFactory에서 EntityManager를 사용하는데 이때 기본으로 primary Datasource의 EntityManager를 사용한다.
primary EntityManager에서 secondary의 entity 조회하는 요청을 받다보니 발생하던 오류였던것- gradle 설정부터 property 설정 repositoryImpl 다시 구현 등등.. 해봐도 해결이 안됨
- secondary Datasource를 먼저 queryDSL로 변경하다보니 본인이 뭘 잘못 설정한게 아닐까 하는 생각으로 다른곳에서 원인을 찾고 있었다.
해결 방법
- Multi Datasource 구성에서는 datasource별로 다른 EntityManager를 사용하기 때문에
각 datasource의 EntityManager로 JPAQueryFactory를 빈으로 등록
- RepositoryImpl.java에서도 올바른 JPAQueryFactory를 가져다가 사용
QueryDslConfig.java
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Configuration
public class QueryDslConfig {
@PersistenceContext(unitName = "firstEntityManager")
private EntityManager firstEntityManager;
@PersistenceContext(unitName = "secondaryEntityManager")
private EntityManager secondaryEntityManager;
@Primary
@Bean
public JPAQueryFactory firstJpaQueryFactory() {
return new JPAQueryFactory(firstEntityManager);
}
@Bean("secondaryJpaQueryFactory")
@Qualifier("secondaryJpaQueryFactory")
public JPAQueryFactory secondaryJpaQueryFactory() {
return new JPAQueryFactory(thirdEntityManager);
}
}
??RepositoryImpl.java
@Repository
public class ??RepositoryImpl implements ??Repository {
private final JPAQueryFactory secondaryJpaQueryFactory;
public ??RepositoryImpl(@Qualifier("secondaryJpaQueryFactory") JPAQueryFactory secondaryJpaQueryFactory) {
this.secondaryJpaQueryFactory = secondaryJpaQueryFactory;
}
...
}
build.gradle 설정
plugins {
...
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
...
dependencies {
...
implementation "com.querydsl:querydsl-jpa"
...
}
...
/*
* queryDSL 설정 추가
*/
// queryDSL에서 사용할 경로 설정
def queryDlsDir = "$buildDir/generated/querydsl"
// queryDSL 설정 블록
// QueryDSL 설정 블록에서는 JPA 사용 여부와 QueryDSL 소스 코드를 생성할 디렉토리를 지정
// - jpa = true: JPA 엔터티를 기반으로 QueryDSL 클래스를 생성할 것임을 나타냄
// - querydslSourcesDir = querydslDir: QueryDSL 소스 코드를 저장할 디렉토리를 설정.
querydsl {
jpa = true
querydslSourcesDir = queryDlsDir
}
// SourceSet 설정: 소스셋에 QueryDSL 디렉토리를 추가하여 빌드 시 해당 디렉토리의 소스 코드가 컴파일되도록 함
sourceSets {
main.java.srcDir queryDlsDir
}
// configurations 설정
// - compileOnly 구성에 annotationProcessor를 추가하여 annotation processor를 컴파일 시에만 사용하도록 설정
// - querydsl.extendsFrom compileClasspath: QueryDSL이 컴파일될 때 compileClasspath를 상속하도록 설정
// 이는 QueryDSL이 프로젝트 내의 다른 클래스 및 의존성을 참조할 수 있게
configurations {
querydsl.extendsFrom compileClasspath
}
// compileQuerydsl 설정
// - QueryDSL을 컴파일할 때 필요한 옵션을 설정
// 여기서는 annotationProcessorPath를 설정하여 QueryDSL의 annotation processor를 사용하도록
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
반응형