04. Project 구성
- -
이번 포스트에서는 앞으로 진행할 과정을 위한 프로젝트를 구성해보자.
Project 구성
진행될 배치 시나리오
프로젝트 의존성
Spring Batch 를 사용하기 위해서 spring-boot-starter-batch와 spring-boot-starter-batch-jdbc가 필요하다. 추가로 mysql, mybatis, webmvc에 대한 의존성도 추가해주자.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
application.properties
먼저 사용할 DB에 대한 설정이 필요하다. 일반적으로 Datasource에 대한 설정을 할 때는 다음과 같은 속성을 사용한다.
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/sakila?serverTimezone=UTC
spring.datasource.username=quietjun
spring.datasource.password=quietjun
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
하지만 우리는 data source인 sakila, target인 quietjun_live, batch 정보를 저장하기 위한 quietjun_batch 3개의 datasource에 연결해야 한다. 각각의 datasource를 구분하기 위해 속성에 다음과 같은 구분자들을 삽입한다.
# Batch 메타데이터 구성을 위한 설정 확인
spring.datasource.batch.jdbc-url=jdbc:mysql://localhost:3306/quietjun_batch?serverTimezone=UTC
spring.datasource.batch.username=quietjun
spring.datasource.batch.password=quietjun
spring.datasource.batch.driver-class-name=com.mysql.cj.jdbc.Driver
# 읽기 용 DataSource 설정
spring.datasource.sakila.jdbc-url=jdbc:mysql://localhost:3306/sakila?serverTimezone=UTC
spring.datasource.sakila.username=quietjun
spring.datasource.sakila.password=quietjun
spring.datasource.sakila.driver-class-name=com.mysql.cj.jdbc.Driver
# 쓰기용 DataSource 설정
spring.datasource.quietjun.jdbc-url=jdbc:mysql://localhost:3306/quietjun?serverTimezone=UTC
spring.datasource.quietjun.username=quietjun
spring.datasource.quietjun.password=quietjun
spring.datasource.quietjun.driver-class-name=com.mysql.cj.jdbc.Driver
추가로 spring batch를 위해 다음 설정을 추가한다.
# Batch 메타데이터 테이블 생성을 위한 script 자동 실행(초기화를 의미하지는 않음)
spring.batch.jdbc.initialize-schema=always
# 자동 실행 방지 (수동/스케줄로만 실행)
spring.batch.job.enabled=false
spring.batch.jdbc.initialize-schema는 Batch 메타데이터 테이블을 생성하기 위한 script를 자동으로 실행하는 옵션을 결정한다. 만약 always가 선언된 경우는 primary datasource를 초기화 하면서 필요한 테이블들이 없을 경우 자동으로 생성한다.
이때 생성되는 테이블 구조는 다음과 같다.

# https://docs.spring.io/spring-batch/reference/schema-appendix.html
Meta-Data Schema :: Spring Batch Reference
The Spring Batch Metadata tables closely match the domain objects that represent them in Java. For example, JobInstance, JobExecution, JobParameters, and StepExecution map to BATCH_JOB_INSTANCE, BATCH_JOB_EXECUTION, BATCH_JOB_EXECUTION_PARAMS, and BATCH_ST
docs.spring.io
참고로 sql은 [External Libararies > org.springframework.batch:spring-batch-core:버전 > org.springframework.batch.core]에 DB 종류별로 sql들이 작성되어있다.
필요한 DB Schema 구성
Datasource들과 연결할 database schema도 먼저 만들어두자. sakila는 mysql의 기본 database이므로 나머지 두 개만 생성하면 된다.
create database quietjun_batch;
create database quietjun;
기본 빈 구성
@EnableBatchProcessing
Spring Batch를 위해 필요한 infra, core 빈들을 등록하기 위해서는 @EnableBatchProcessing을 사용하는 것이 가장 편리하다. 이 애너테이션은 다음의 빈들을 자동으로 구성한다.
| 구분 | 빈 | 설명 |
| Infrastructure | JobRepository | DB 저장소 |
| JobExplorer | DB 조회 도구 | |
| TransactionManager | 트랜젝션 관리자 | |
| Core | JobLauncher | 실행기로 JobRepository를 주입받아서 동작 |
| JobRegistry | Job 등록/관리 | |
| Client(유틸리티) | JobOperator | Core와 Infrastructure를 묶어서 사용자가 다루기 쉽게 연결함 |
하지만 SpringBoot에서 Batch 작업을 진행하면 이미 활성화 되어있기 때문에 추가할 필요는 없다.(오히려 충돌이 발생할 수도 있다.)
DataSource 구성
사용하려는 DataSource가 여럿이고 필요한 기본 솏성(spring.datasource.jdbc-url 등)을 제공하지 않았기 때문에 DataSource를 직접 구성해줘야 한다.
먼저 Spring-Batch에서 사용할 DataSource를 구성해보자.
@Primary // Autowired 될 때 우선순위를 지정
@Bean
@ConfigurationProperties("spring.datasource.batch")
DataSource batchDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Primary
@Bean
PlatformTransactionManager batchTransactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
- @Primary: DataSource 타입의 빈이 여러개인 상황에서 그냥 @Autowired를 사용하면 타입 충돌이 발생한다. 이때 빈의 우선순위를 지정해주기 위해 @Primary를 사용한다. Spring-Batch에서 주입받아서 사용하기 위한 DataSource에 지정해준다.
- @ConfigurationProperties: datasource 접속에 필요한 속성이 등록된 prefix 지정
동일한 개념으로 sakila, quietjun_live 에 접속하기 위한 빈들도 구성해보자. sakila는 데이터 source로 readonly 이므로 TransactionManager를 따로 구성하지 않았다.
@Bean
@ConfigurationProperties(prefix = "spring.datasource.sakila")
DataSource sakilaDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.quietjun")
DataSource quietjunDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean
PlatformTransactionManager quietjunTransactionManager(@Qualifier("quietjunDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
MyBatis 설정
다음으로 MyBatis에서 필요한 설정을 해보자.
com.quietjun.batch.model.mapper에 두 개의 Mapper를 추가하자. 내용은 차차 매꿔보자.

관련 xml도 동일한 구조로 resource 아래에 추가한다.

xml은 일단 namespace만 연결해두자.
<!--/resources/mybatis/quietjun/quietjun-mapper.xml-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.quietjun.batch.model.mapper.QuietjunMapper">
</mapper>
<!--/resources/mybatis/sakila/sakila-mapper.xml-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.quietjun.batch.model.mapper.SakilaMapper">
</mapper>
최종적으로 이들을 사용하는 SqlSessionFactory Bean을 구성한다.
@Configuration
public class MyBatisConfig {
@Configuration
@MapperScan(basePackageClasses = QuietjunMapper.class,
sqlSessionFactoryRef = "quietjunSqlSessionFactory")
static class QuietjunLiveMyBatisConfig {} // 중첩 빈은 static class로 선언해야 함
@Configuration
@MapperScan(basePackageClasses = SakilaMpper.class,
sqlSessionFactoryRef = "sakilaSqlSessionFactory")
static class SakilaMyBatisConfig {}
@Bean
SqlSessionFactory quietjunSqlSessionFactory(@Qualifier("quietjunDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:mybatis/quietjun/*.xml"));
sessionFactory.setTypeAliasesPackage("com.quietjun.batch.model.dto");
return sessionFactory.getObject();
}
@Bean
SqlSessionFactory sakilaSqlSessionFactory(@Qualifier("sakilaDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:mybatis/sakila/*.xml"));
sessionFactory.setTypeAliasesPackage("com.quietjun.batch.model.dto");
return sessionFactory.getObject();
}
}
@MapperScan은 Type에 선언하는 애너테이션이어서 @Bean에는 선언할 수 없고 @Configuration이 선언된 클래스에서 선언해야 한다. 또한 inner class 형태로 bean을 선언할 때는 static class로 하는 것이 권장된다.
동작 확인
index.html
마지막으로 index.html을 생성 후 잘 동작하는지 확인해보자.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Hello Batch</h1>
</body>
</html>
batch meta database 구성 확인
애플리케이션을 실행시킨 후 spring.batch.jdbc.initialize-schema=always 설정에 의해 quietjun_batch database가 잘 구성되어있는지 확인해보자.

'Spring Batch' 카테고리의 다른 글
| 06. Backup Batch - 2 (0) | 2026.01.06 |
|---|---|
| 05. Backup Batch - 1 (0) | 2026.01.05 |
| 03. SpringBatch 핵심 개념 (0) | 2026.01.03 |
| 02. Spring Batch 계층 구조 (0) | 2026.01.02 |
| 01. Batch와 Spring Batch (0) | 2026.01.01 |
소중한 공감 감사합니다