반응형

오류

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
}
반응형

+ Recent posts