'org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder' that could not be found.

skj4244·2024년 11월 20일

  배경

다중 DB를 사용하기 위해서 DB마다 DataSource를 설정하기 위한 Config를 작성한다.

그 Config 중 가장 기본적으로 사용될 DBConfig에서 @Primary를 사용해야하는데, 만약 어느 Config에서도 해당 어노테이션을 사용하지 않으면, Spring에서 어떤걸 사용할지 몰라 발생하는 에러.

에러 메세지는 아래와 같다.

'org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder' that could not be found.

  해결

해결 방법은 간단하다. 내가 사용한 Config 클래스 중 어느 하나라도 클래스의 각 메서드에 @Primary 어노테이션을 작성하면 된다.

필자 같은 경우는 회사에서 DB2 데이터베이스를 메인으로 사용하기에 아래와 같이 Db2Config.java 클래스를 작성하였다.

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = "com.josunhotel.catchTable.repository.db2", // DB2 관련 엔티티의 Repository 패키지
        entityManagerFactoryRef = "db2EntityManagerFactory",
        transactionManagerRef = "db2TransactionManager"
)
public class DB2Config {

    @Primary
    @Bean(name = "db2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource db2DataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "db2EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean db2EntityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("db2DataSource") DataSource dataSource) {

        Map<String, Object> jpaProperties = new HashMap<>();
        jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.DB2400Dialect"); // dialect 설정
        jpaProperties.put("hibernate.format_sql", "true"); // 쿼리 prettier
        jpaProperties.put("hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy"); // 필드 <-> 컬럼 매핑 시 네이밍 전략 설정

        return builder
                .dataSource(dataSource)
                .packages("com.josunhotel.catchTable.domain.db2") // DB2 관련 엔티티 패키지
                .persistenceUnit("db2PU")
                .properties(jpaProperties)
                .build();
    }

    @Primary
    @Bean(name = "db2TransactionManager")
    public PlatformTransactionManager db2TransactionManager(
            @Qualifier("db2EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}



  참고 문서

https://velog.io/@refoli_20/Spring-Boot-%EB%8B%A4%EC%A4%91-Database-%EA%B5%AC%EC%84%B1-JPA-PostgreSQL-MySQL

0개의 댓글