상세 컨텐츠

본문 제목

[JPA] Querydsl - multi datasource 연동 관련 이슈

SPRING

by jeonghojin 2022. 11. 4. 16:20

본문

 

 

JPA Querydsl 을 사용시 database 마다 datasource를 각각 생성해주게 된다.

이 경우, querydsl 설정 등 여러가지 설정들이 개별적으로 설정된다.

 

Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available: expected single matching bean but found 2:
이하 생략
 Description:
    Parameter 0 of constructor in com.invitation.module.rds.repository.invitation.InvitationConfigurationRepositoryImpl required a single bean, but 2 were found:
     - invitationJpaQueryFactory: defined by method 'invitationJpaQueryFactory' in class path resource [com/invitation/module/rds/config/database/QueryDslConfiguration.class]
     - privacyJpaQueryFactory: defined by method 'privacyJpaQueryFactory' in class path resource [com/invitation/module/rds/config/database/QueryDslConfiguration.class]

 

 

DatabaseConfiguration.java

 

 

Datasource가 여러 개일 경우 @Primary 어노테이션을 추가해주어야 한다.

* @Primary 어노테이션은 여러 개의 중복되는 Bean 들 중에서 어떤 Bean을 먼저 적용할지 우선순위를 정해준다.

* Datasource가 여러 개일 경우에는 EntityManagerFactory, EntityManager 등 각 DB 마다 다르게 연결되어야 하므로 메인이 되는 DB Configuration에는 @Primary 어노테이션을 추가해주어야 한다.

 

@Qualifier 어노테이션은 Primary와 다르게 우선순위가 아닌, 스프링 컨테이너가 여러 개의 Bean을 찾았을 때 추가정보를 제공한다.

 

  1. 컨테이너에 올리고 싶은 Bean에는 @Primary
  2. 여러개 Bean들 중 무언가를 특정하고 싶은 경우, @qualifier("{name}")

 

 


QueryDslConfiguration.java

- DatabaseConfiguration.java 에서 EntityManagerFactory 빈 생성시 QueryDslConfiguration.java에서 설정했던 EntityManager의 UnitName을  PersistenceUnitName을 지정해주어야 한다.

 

QuerydslRepositorySupport 를 상속받아 생성자에 JpaQueryFactory를 주입시켜 해결.

 

 


 

참고

더보기

관련글 더보기