본문으로 건너뛰기
Advertisement

8.3 Java 설정 및 멀티 데이터베이스 구성

스프링 부트의 자동 설정(Auto Configuration)을 사용하지 않고 직접 자바 코드로 DataSource를 설정해야 하거나, 한 애플리케이션에서 두 개 이상의 데이터베이스에 접속해야 하는 경우의 설정 방법을 알아봅니다.

1. 자바 코드로 DataSource 직접 설정

특정 라이브러리와의 호환성이나 런타임에 동적으로 설정을 변경해야 할 때 자바 설정 클래스를 사용합니다.

@Configuration
public class DataSourceConfig {

@Bean
@ConfigurationProperties("spring.datasource.hikari") // yml의 설정을 바인딩
public DataSource dataSource() {
// DataSourceBuilder를 사용하여 직접 생성
return DataSourceBuilder.create()
.type(HikariDataSource.class)
.build();
}
}

2. 멀티 데이터베이스 (Multi DataSource) 설정

서로 다른 DB(예: MySQL과 PostgreSQL)를 동시에 사용하거나, 읽기 전용(Read-only)과 쓰기 전용(Master/Slave) DB를 분리할 때 사용합니다.

2.1 application.yml 설정

데이터 소스를 구분할 수 있도록 고유한 접두사(Prefix)를 정의합니다.

spring:
datasource:
# 메인 데이터베이스 (Primary)
main:
jdbc-url: jdbc:mysql://localhost:3306/main_db
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver

# 보조 데이터베이스 (Secondary)
sub:
jdbc-url: jdbc:postgresql://localhost:5432/sub_db
username: user
password: password
driver-class-name: org.postgresql.Driver

2.2 자바 설정 클래스 구현

두 개의 빈이 충돌하지 않도록 @Primary@Qualifier 를 적절히 사용해야 합니다.

@Configuration
public class MultiDataSourceConfig {

// Main DataSource
@Primary
@Bean(name = "mainDataSource")
@ConfigurationProperties("spring.datasource.main")
public DataSource mainDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}

// Sub DataSource
@Bean(name = "subDataSource")
@ConfigurationProperties("spring.datasource.sub")
public DataSource subDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}

// JdbcTemplate 사용 시 Qualifier 지정
@Bean
public JdbcTemplate mainJdbcTemplate(@Qualifier("mainDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}

@Bean
public JdbcTemplate subJdbcTemplate(@Qualifier("subDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}

3. 주의사항 및 실무 팁

  1. @Primary 필수: 빈 타입이 중복될 때 스프링이 어떤 것을 기본으로 주입할지 명시해야 에러가 발생하지 않습니다.
  2. ConfigurationProperties 주의: 스프링 부트 2.x 이상에서 Hikari 설정을 직접 바인딩할 때는 url 대신 jdbc-url 프로퍼티 명칭을 사용해야 하는 경우가 많습니다.
  3. 트랜잭션 관리자: 멀티 DB를 사용할 경우 트랜잭션 관리자(PlatformTransactionManager)도 각각 빈으로 등록하여 필요한 곳에 지정해서 사용해야 합니다. (@Transactional("mainTransactionManager"))
Advertisement