ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • spring jpa querydsl multiple datasource
    카테고리 없음 2023. 4. 20. 09:52
    몇일전에 Spring 멀티 데이터 소스를 설정하다가 계속 에러가 났다. 근데 집에서 해보니까 한방에 되는 일이 있었는데 회사에서 그대로 했는데도 불구 하고 계속 에러를 내뱉었다. expected single matching bean but found 2 xxxentityManagerFactory, xxxentityManagerFactory 이런 에러가 발생하였다. 일단 에러를 보면 두개의 엔티티 매니저 팩토리가 있다고 그러는거 같았다. 계속 원인을 찾다가 querydsl 쪽에 문제가 있다고 판단 되었음을 확인 할 수 있었다. QueryDslRepositorySupport 클래스를 보면 아래와 같은 setter 메소드가 있다.
    ...
    
    @Repository
    public abstract class QueryDslRepositorySupport {
        @PersistenceContext
        public void setEntityManager(EntityManager entityManager) {
            Assert.notNull(entityManager);
            this.querydsl = new Querydsl(entityManager, builder);
            this.entityManager = entityManager;
        }
    }
    ...
    
    EntityManager 주입할때 두개가 존재해서 그런거 같다. 그래서 어떻게 해야될까 고민을 시작하였다. 딱히 구글링해서 나오지 않아서 (필자의 검색능력 부족일 수도) QueryDslRepositorySupport 버리고 새로운 QueryDslRepositorySupport을 만들어상속받아서 사용했다. JPA를 정확하게 몰라서 그런거일지도 모른다 ㅜㅜ
    @Repository
    public abstract class CmsQueryDslRepositorySupport {
        private EntityManager entityManager;
    
        ...
    
        @PersistenceContext(unitName = "cms")
        public void setEntityManager(EntityManager entityManager) {
    
            Assert.notNull(entityManager);
            this.querydsl = new Querydsl(entityManager, builder);
            this.entityManager = entityManager;
        }
    
        ...
    
    }
    
    이렇게 커스텀하게 만들어서 사용했다. PersistenceContext에 해당 unitName 을 지정해주니 잘 돌아간다.
    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder, DataSource dataSource) {
    
        Map<String, String> props = new HashMap<>();
        props.put("hibernate.show_sql", "true");
        props.put("hibernate.hbm2ddl.auto", "validate");
        return builder.dataSource(dataSource)
                .properties(props)
                .packages("me.wonwoo.domain")
                .persistenceUnit("cms")
                .build();
    }
    
    위와 같이 persistenceUnit 에 unitName 동일한 값을 넣어 주면 된다.
    public class AccountInquiryRepositoryImpl extends CmsQueryDslRepositorySupport implements CustomAccountInquiryRepository {
    
        ...
    
        ...
    }
    
    이렇게 QueryDslRepositorySupport클래스를 상속받지 않고 필자가 만든 커스텀한 CmsQueryDslRepositorySupport 을 상속 받아 사용 했다. 데이터소스가 늘어 날때바다 계속 만들어줘야 하는 단점이 있다. 그렇다고 데이터소스가 10개 100개씩 있는건 아니니까 만들어줘도 괜찮긴 하지만 .. 그래도 영... 이 방법 말고 더 좋은 방법을 없을까? 너무 구시대적 발상이군.. 일단 해결은 했으나 영 찝찝..

    댓글

Designed by Tistory.