Spring Boot를 사용하여 애플리케이션을 개발하다 보면 하나의 데이터베이스만 사용하는 경우가 대부분입니다. 그러나 비즈니스가 확장되면서 데이터베이스를 분리해야 하거나, 서로 다른 데이터 소스를 사용해야 할 필요성이 생길 수 있습니다. 이럴 때 유용한 것이 바로 다중 DataSource(Multi DataSource) 설정입니다. 이번 블로그에서는 Spring Boot에서 다중 DataSource를 설정하는 방법과 이를 실제로 활용하는 사례, 그리고 다중 DataSource를 사용할 때의 장점과 주의사항에 대해 알아보겠습니다.
다중 DataSource 설정하기: 간단한 예시
Spring Boot에서 다중 DataSource를 설정하려면 각 DataSource를 명시적으로 구성하고, 각각의 트랜잭션 관리와 리포지토리를 설정해야 합니다. 아래는 간단한 예시입니다.
application.yml 설정
두 개의 데이터 소스를 설정하기 위해 application.yml 파일에 다음과 같이 작성합니다
spring:
datasource:
primary:
url: jdbc:mysql://localhost:3306/primarydb
username: root
password: secret
driver-class-name: com.mysql.cj.jdbc.Driver
secondary:
url: jdbc:mysql://localhost:3306/secondarydb
username: root
password: secret
driver-class-name: com.mysql.cj.jdbc.Driver
DataSource 설정 클래스 작성
각각의 데이터 소스를 설정하는 Java Configuration을 작성합니다
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
JPA 리포지토리 설정
다중 DataSource에 연결된 리포지토리를 설정하기 위해, 각각의 리포지토리와 관련된 엔티티 매니저를 설정합니다
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = "com.example.primary",
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager"
)
public class PrimaryDataSourceConfig {
@Primary
@Bean(name = "primaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.primary")
.persistenceUnit("primary")
.build();
}
@Primary
@Bean(name = "primaryTransactionManager")
public PlatformTransactionManager primaryTransactionManager(
@Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.secondary",
entityManagerFactoryRef = "secondaryEntityManagerFactory",
transactionManagerRef = "secondaryTransactionManager"
)
public class SecondaryDataSourceConfig {
@Bean(name = "secondaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.secondary")
.persistenceUnit("secondary")
.build();
}
@Bean(name = "secondaryTransactionManager")
public PlatformTransactionManager secondaryTransactionManager(
@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
다중 DataSource 사용 사례
- 비즈니스 데이터와 감사 로그 데이터 분리:
- 일반적인 비즈니스 로직 데이터와 감사 로그 데이터를 서로 다른 데이터베이스에 저장하여 성능을 최적화하고, 감사 로그 데이터의 무결성을 강화할 수 있습니다.
- 다양한 데이터베이스 기술 사용:
- 특정 데이터는 MySQL에, 다른 데이터는 NoSQL 데이터베이스(MongoDB 등)에 저장해야 하는 경우, 다중 DataSource를 통해 여러 데이터베이스를 효과적으로 관리할 수 있습니다.
- 멀티 테넌트 시스템:
- 각 테넌트(고객)마다 별도의 데이터베이스를 사용하는 멀티 테넌트 애플리케이션에서 유용합니다. 테넌트별로 데이터베이스를 분리하여 데이터 격리를 보장할 수 있습니다.
다중 DataSource의 장점
- 성능 최적화: 서로 다른 데이터베이스를 사용하여 특정 작업을 병렬 처리함으로써 애플리케이션 성능을 향상시킬 수 있습니다.
- 유지보수성 향상: 데이터베이스를 분리하여 각 데이터 소스에 대한 관리와 유지보수가 용이해집니다.
- 확장성: 새로운 데이터 소스 추가가 비교적 쉬워지며, 시스템이 확장될 때 유연하게 대응할 수 있습니다.
다중 DataSource 사용 시 주의사항
- 트랜잭션 관리: 여러 데이터 소스를 사용할 때는 트랜잭션 관리가 복잡해질 수 있습니다. 특히 분산 트랜잭션을 처리할 때는 신중한 설계가 필요합니다.
- 복잡성 증가: 다중 데이터 소스를 사용하면 설정과 관리가 복잡해지므로, 필요하지 않은 경우에는 단일 데이터 소스 사용을 고려해야 합니다.
- 일관성 유지: 다중 데이터 소스 간의 데이터 일관성을 유지하는 것은 까다로울 수 있습니다. 이 점을 고려한 설계가 필요합니다.
Spring Boot에서 다중 DataSource를 설정하는 것은 복잡한 비즈니스 요구사항을 처리할 수 있는 강력한 도구입니다. 데이터베이스를 분리함으로써 성능을 최적화하고, 확장성을 높일 수 있지만, 그만큼 관리와 설계에 신경을 써야 합니다. 다중 DataSource 설정을 제대로 활용하면 애플리케이션의 유연성과 성능을 극대화할 수 있습니다
'Spring' 카테고리의 다른 글
Spring Boot의 보안 강화: OAuth2와 JWT를 활용한 인증 및 권한 관리 (0) | 2024.09.02 |
---|---|
"프로메테우스와 스프링의 만남: 실시간 모니터링으로 애플리케이션의 상태를 한눈에 파악하기" (0) | 2024.08.30 |
AOP 완벽 가이드: 스프링에서 횡단 관심사를 마스터하는 방법 (0) | 2024.08.29 |
Spring Boot로 실시간 웹 애플리케이션 구현하기: WebSocket 도입 방법과 간단한 예제 (0) | 2024.08.28 |
Spring Security: 웹 애플리케이션 보안의 핵심과 다양한 활용 방법 (0) | 2024.08.28 |