※ 실제 프로젝트를 진행하며 얻은 지식을 정리한 내용입니다.
※ 이론적인 내용보단 실무에서 사용하는 방식 위주로 작성하였습니다.
※ 잘못된 내용이 있다면 댓글로 지적 부탁드리겠습니다.
1. Spring Batch란?
1) 대량 데이터 처리
1-1. 데이터의 읽기, 처리, 쓰기 작업을 효율적으로 관리하며, 트랜잭션, 오류 처리 등 다양한 기능을 제공합니다.
2) 자동화된 배치 작업 관리
2-1. Spring Batch는 배치 작업을 관리하는 Job과 이를 구성하는 개별 작업 단위인 Step을 제공합니다.
2-2. 배치 작업을 보다 체계적으로 분할하고 관리할 수 있으며, 각 작업 단위에 대해 독립적으로 트랜잭션을 적용할 수 있습니다.
2-3. 배치 작업의 실행 상태를 추적하고 히스토리를 관리할 수 있는 기능도 제공합니다.
2. Spring Batch 공통 용어
1) Job : 배치 작업의 단위로, 여러 개의 Step으로 구성됩니다.
2) Step : Job 내에서 실행되는 개별 작업 단위입니다. Chunk와 Tasklet 방식으로 나누어 집니다.
2-1. Chunk : ItemReader → ItemProcessor → ItemWriter로 구성됩니다.
2-2. Tasklet : 하나의 Step에서 하나의 Tasklet을 실행합니다.
3) JobLauncher : Job을 실행시키는 역할을 합니다.
4) JobRepository : Job 실행 결과(상태, 히스토리 등)를 저장하고 관리합니다.
5) Listener : 작업 전후에 실행되는 작업으로, 실행 상태를 감지하고 처리합니다.
3. Spring Batch 개발 패턴
1) Chunk
1-1. 특징 : 데이터 읽기, 처리, 쓰기 과정이 분명하며, 반복 처리되는 대량 데이터를 효율적으로 다룰 수 있습니다.
1-2. 관련 용어
- Chunk : 데이터를 묶어서 처리하는 단위입니다. ex) 한번에 10개의 데이터를 읽고 처리하고 저장
- ItemReader : 데이터를 읽는 역할입니다. ex) 파일, DB, API 등 에서 데이터를 읽어옴
- ItemProcessor : 데이터를 처리하는 역할입니다. ex) 이름 변환, 필터링 등
- ItemWriter : 처리된 데이터를 저장하는 역할입니다. ex) 파일이나 DB에 저장
- Commit Interval : Chunck의 크기를 정합니다. ex) 한번에 10개 처리 : Commit Interval = 10
1-3. 실행순서
1) JobLauncher가 Job을 시작
2) Job은 Step을 순서대로 실행
3) Step은 ItemReader → ItemProcessor → ItemWriter로 동작하며 데이터 처리
4) JobRepository 실행 상태와 결과를 기록
2) Tasklet
1-1. 특징 : 단순하거나 단일작업 시 적합, 특정한 작업(Task)을 정의하여 실행, 파일 삭제, 디렉토리생성, 상태초기화 등
1-2. 관련 용어 :
- Tasklet : 단일 작업(Task)를 정의하는 인터페이스, execute() 메서드를 구현(실행될 로직을 작성, ex) DB 업데이트 등)
- RepeatStatus : Tasklet 작업의 반복 여부를 결정하는 반환 값
- RepeatStatus.FINISHED : 작업완료
- RepeatStatus.CONTINUABLE : 작업반복
- 하단 testA001Tasklet.java 파일 참고
- StepContribution : step의 실행 상태와 통계를 관리, ex) 처리된 항목 수, 읽은 데이터 개수 등
- ChunckContext : 실행 중인 Step의 컨텍스트 정보를 제공, ex) 파라미터, 실행 상태 등
1-3. 실행순서
1) JobLauncher가 Job을 시작
2) Job은 Step을 순서대로 실행
3) Tasklet 실행
4) 상태 반환(FINISHED 또는 CONTINUABLE)
5) Step 종료 → Job 종료
4. 예제 소스
1) Chunk 예제소스
1-1. (작성예정)
2) Tasklet 예제소스
2-1. testA001Tasklet.java
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
(로직)
return RepeatStatus.FINISHIED;
}
2-2. testA001Beans.java
- 변수 및 의존성
/* Job Name */
private final static String JOB_NM = "testA001";
/* Step Name */
private final static String STEP_NM = "testA001Step";
/* 배치 Status 리스너 */
@Autowired
private BatStatusListener batchStatusListener;
/* 알림 발송 리스너 */
@Autowired
private SendAlarmListener sendAlarmListener;
// JOB Bean 생성
@Bean
public Job testA001(
JobRepository jobRepository,
PlatformTransactionManager platformTransactionManager,
Tasklet testA001Tasklet
) {
return new JobBuilder(JOB_NM, jobRepository)
.start(
new StepBuilder(STEP_NM, jobRepository)
.tasklet(testA001Tasklet, platformTransactionManager)
.build()
)
.listener(batchStatusListener)
.listener(sendAlarmListener)
.build();
}
// Step Bean 생성
@Bean
public Step testA001Step(
JobRepository jobRepository,
PlatformTransactionManager platformTransactionManager,
Tasklet testA001Tasklet
) {
return new StepBuilder(STEP_NM, jobRepository)
.tasklet(testA001Tasklet, platformTransactionManager)
.build();
}
3) 소스 설명
3-1) testA001Beans.java
- 스프링컨테이너가 Bean파일을 읽어 들임(Job, Step, Tasklet생성) [Spring Context 초기화]
- JobBuilder()는 Job 이름과 실행 정보를 관리할 JobRepository를 설정
- start()는 Job Builder에서 첫 번째 Step을 지정하는 메서드, start(Step step) 형태로 사용
- StepBuilder를 사용해 Step을 생성하고 Job의 첫번째 단계로 연결
3-2) Job실행(공통 작업 실행(ex) 이력테이블에 데이터 INSERT 등)
3-3) Step실행, Step에 연결된실행하면 Tasklet이 호출됨
3-4) Tasklet의 execute() 메서드 호출, 작업성공 시 Step종료
3-5) Job종료, JobRepository에 기록
- PlatformTransactionManager는 트랙잭션을 관리하는 역할
- 트랜잭션을 설정하여 실패 시 롤백하고, 데이터 정합성을 유지하기 위해서입니다
- listner() : BatStatusListener → Job 시작/종료 시 상태 로깅, SendAlarmListener → Job 실패 시 알림 발송
'2F(IT) > Spring Boot' 카테고리의 다른 글
| ResponseEntity란? (0) | 2025.03.02 |
|---|---|
| Spring Boot 어노테이션 - 컨트롤러 데이터 및 화면 호출 (0) | 2025.02.17 |
| Spring Boot 어노테이션(annotation) 기본 (5) | 2025.01.02 |
| JPA구조, Mybatis 구조의 차이 (3) | 2025.01.01 |
| STS Navigator 설정(Project Explorer) (6) | 2024.12.27 |