2F(IT)/Spring Boot

Spring Batch 개념 및 예제

백화점장 2025. 3. 28. 21:11
반응형
※ 실제 프로젝트를 진행하며 얻은 지식을 정리한 내용입니다.
※ 이론적인 내용보단 실무에서 사용하는 방식 위주로 작성하였습니다.
※ 잘못된 내용이 있다면 댓글로 지적 부탁드리겠습니다.

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 내에서 실행되는 개별 작업 단위입니다. ChunkTasklet 방식으로 나누어 집니다.

        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 실패 시 알림 발송


 

반응형