본문 바로가기
스프링/Batch

Spring Batch

by 공부 안하고 싶은 사람 2021. 6. 28.
반응형

조건

  • 대용량 데이터 - 배치 어플리케이션은 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야 합니다.
  • 자동화 - 배치 어플리케이션은 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 합니다.
  • 견고성 - 배치 어플리케이션은 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 합니다.
  • 신뢰성 - 배치 어플리케이션은 무엇이 잘못되었는지를 추적할 수 있어야 합니다. (로깅, 알림)
  • 성능 - 배치 어플리케이션은 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션을 방해하지 않도록 수행되어야합니다.

 

 

주의

  • 가능하면 단순화해서 복잡한 구조와 로직을 피해야합니다.
  • 데이터를 직접 사용하는 편이 빈번하게 일어나므로 데이터 무결성을 우지하는데 유효성 검사 등의 방어책이 있어야합니다.
  • 배치 처리 시스템 I/O 사용을 최소화해야합니다. 잦은 I/O로 데이터베이스 컨넥션과 네트워크 비용이 커지면 성능에 영향을 줄 수 있기 때문입니다. 따라서 가능하면 한번에 데이터를 조회하여 메모리에 저장해두고 처리를 한 다음. 그결과를 한번에 데이터베이스에 저장하는것이 좋습니다.
  • 일반적으로 같은 서비스에 사용되는 웹 API, 배치, 기타 프로젝트들을 서로 영향을 줍니다. 따라서 배치 처리가 진행되는 동안 다른 프로젝트 요소에 영향을 주는 경우가 없는지 주의를 기울여야합니다.
  • 스프링 부트는 배치 스케쥴러를 제공하지 않습니다. 따라서 배치 처리 기능만 제공하여 스케쥴링 기능은 스프링에서 제공하는 쿼치 프레임워크 등을 이용해야합니다. 리눅스 crontab 명령은 가장 간단히 사용 할 수 있지만 이는 추천하지 않습니다. crontab의 경우 각 서버마다 따로 스케쥴러를 관리해야 하며 무엇보다 클러스터링 기능이 제공되지 않습니다. 반면에 쿼츠 같은 스케쥴링은 프레임워크를 사용한다면 클러스터링뿐만 아니라 다양한 스케쥴링 기능, 실행 이력 관리 등 여러 이점을 얻을 수 있습니다.

 

 

 

시작하기

  • 의존성 추가
  • org.springframework.boot:spring-boot-starter-batch
  • @EnableBatchProcessing // 배치기능 활성화
    @SpringBootApplication
    public class BatchApplication {
        public static void main(String[] args) { SpringApplication.run(BatchApplication.class, args)};
    }
  • @Slf4j // log 사용을 위한 lombok 어노테이션
    @RequiredArgsConstructor // 생성자 DI를 위한 lombok 어노테이션
    @Configuration // Batch Job을 Config등록하여 사용
    public class SimpleJobConfiguration {
        private final JobBuilderFactory jobBuilderFactory;
        private final StepBuilderFactory stepBuilderFactory; 
    
        @Bean
        public Job simpleJob() {
            return jobBuilderFactory.get("simpleJob") // simpleJob 이란 이름의 Batch Job 생성
                    .start(simpleStep1()) // Job 안에는 여러 Step이 존재
                    .build();
        }
    
        @Bean
        public Step simpleStep1() {
            return stepBuilderFactory.get("simpleStep1")
                    .tasklet((contribution, chunkContext) -> { // Step안에서 단일로 수행될 커스텀 기능 명시
                        log.info(">>>>> This is Step1"); // 커스텀 로그만 추가
                        return RepeatStatus.FINISHED;
                    })
                    .build();
        }
    }

 

 

 

Job 안에는 아래처럼 여러 Step이 존재하고, Step 안에 Tasklet 혹은 Reader & Processor & Writer 묶음이 존재합니다.

  • Tasklet 하나와 Reader & Processor & Writer 한 묶음이 같은 레벨입니다.
    그래서 Reader & Processor가 끝나고 Tasklet으로 마무리 짓는 등으로 만들순 없다는걸 꼭 명심해주셔야 합니다.
  • Spring Batch의 메타 데이터는 다음과 같은 내용들을 담고 있습니다.
    • 이전에 실행한 Job이 어떤 것들이 있는지
    • 최근 실패한 Batch Parameter가 어떤것들이 있고, 성공한 Job은 어떤것들이 있는지
    • 다시 실행한다면 어디서 부터 시작하면 될지
    • 어떤 Job에 어떤 Step들이 있었고, Step들 중 성공한 Step과 실패한 Step들은 어떤것들이 있는지

 

 

참고 : https://jojoldu.tistory.com/325

728x90
반응형

'스프링 > Batch' 카테고리의 다른 글

@Scheduled 핸들러  (0) 2021.06.04

댓글