[2회차] Spring Batch 스터디: 후기 및 추가 학습 내용

아래 글은 한국 스프링 사용자 모임(KSUG)에서 진행된 스프링 배치 스터디 내용을 정리한 게시글입니다.
DEVOCEAN에 연재 중인 KIDO님의 글을 메인 교안으로 진행되는 스터디입니다. [메인 교안 바로 가기]

2회차 공부하며 정리한 내용 바로가기: https://yeseul-dev.tistory.com/42

 

오늘은 Spring Batch 스터디 2회차가 있었습니다.

 

이번 스터디에서는 배치 처리의 기본 흐름과 핵심 개념들에 대해 다뤘습니다.
Spring Batch를 처음 접할 때 놓치기 쉬운 부분들을 함께 논의하면서 더 명확히 이해할 수 있었습니다.

 

1. Spring Boot Application 시작 흐름

스프링 부트 애플리케이션은 @SpringBootApplication 어노테이션으로 시작됩니다.

SpringApplication.run 메서드를 통해 애플리케이션이 실행되면, 스프링 컨텍스트가 생성되고 설정된 Bean들이 등록됩니다.

 

2. Spring Batch의 구성 요소

Spring Batch의 핵심은 JobStep입니다.

각각의 Job은 여러 Step으로 구성되며, 스프링 배치 내에서 일회성으로 실행되고 종료되는 구조입니다.

 

만약 Step 내에서 반복 작업이 필요하다면 RepeatStatus를 사용하여 설정 해줄 수 있습니다.

  • RepeatStatus.FINISHED는 작업이 완료되었음을 나타내고, 해당 Step이 종료됩니다.
  • RepeatStatus.CONTINUABLE는 작업이 완료되지 않았으므로 반복되어야 함을 나타냅니다.

 

3. 스프링 배치의 특징

스프링 배치의 가장 큰 특징은 일회성 처리 후 종료된다는 점입니다.

일반적인 웹 애플리케이션과 달리, 등록 되어있는 배치 작업(JobExecution)이 완료되면 애플리케이션이 자동으로 종료됩니다.

 

4. Chunk 기반 처리와 직렬화

Spring Batch는 청크(chunk) 단위로 데이터를 처리합니다. 데이터를 특정 크기만큼 읽고 처리한 후에 쓰기를 반복하는 구조입니다. 이때, ChunkContext가 사용됩니다.

 

Context는 배치 처리 중 상태 정보를 관리하며, 처리 중 에러가 발생할 경우 어느 시점에서부터 재시작할지를 기록하는 데 사용됩니다. 이때, 컨텍스트텍스트로 직렬화되어 DB에 저장되며, 이 정보를 기반으로 배치를 재시작할 수 있습니다.

 

직렬화는 메모리 상의 객체를 DB나 파일로 저장할 수 있도록 포맷팅해주는 과정입니다. 예를 들어 객체를 그냥 출력하면 주소 값이 출력되지만, String.toString()으로 출력하면 string 값으로 출력이 됩니다. 이 방법이 직렬화 중 하나라고 할 수 있습니다.

 

Spring Batch에서는 컨텍스트 정보를 주로 텍스트 형식으로 저장하는데,

그 이유는 크게 Spring Batch의 경우 가독성, 신뢰성, 호환성을 중시하기 때문입니다.

  1. 가독성 및 디버깅: 바이너리 파일은 사람이 읽을 수 없기 때문에 텍스트 기반 파일에 비해 디버깅과 문제 해결이 매우 어렵습니다. 텍스트 파일은 단순한 편집기에서 열어볼 수 있어 쉽게 수정하거나 오류를 파악할 수 있지만, 바이너리는 전문적인 도구가 필요합니다.
  2. 성능보다 신뢰성 중시: 배치 시스템의 특성상 성능보다 데이터의 무결성과 신뢰성을 중시합니다. 배치 작업은 대량의 데이터를 다루기 때문에 작은 오류가 전체 데이터에 큰 영향을 미칠 수 있기 때문입니다. Binary를 사용하면 조금의 성능 향상은 가져갈 수 있겠지만, 높은 성능 향상은 기대하기 힘들다고 합니다.
    • A little diddy about binary file formats 에 따르면 숫자를 이진법으로 표현하면 이상적으로 3배를 절약할 수 있습니다. 그러나 이는 표현하는 숫자가 크다는 것을 전제로 합니다. 그렇기 때문에 이진수는 큰 숫자를 저장할 때 공간 효율이 좋지만, 작은 숫자나 일반적인 텍스트 데이터를 저장할 때는 ASCII(텍스트) 방식이 더 효율적일 수 있습니다.
  3. 호환성: 텍스트 형식은 시스템 간에 쉽게 이식이 가능합니다. 바이너리 형식은 특정 플랫폼에 종속될 수 있고, 직렬화된 객체가 다른 환경에서 읽히기 어려울 수 있습니다. 반면 텍스트 형식은 다양한 시스템과 데이터베이스 환경에서 호환성을 보장합니다.

 


2회차 스터디를 마무리하며

이번 스터디를 통해 스프링 배치의 기본적인 구조와 동작 원리에 대해 이해할 수 있었습니다.

특히 스프링 배치가 일반적인 웹 애플리케이션과는 다른 생명주기를 가지고 있다는 점이 인상적이었습니다.

 

다음 스터디부터는 KIDO님께서 실제 스프링 배치 애플리케이션을 가지고 과제를 준비해주신다고 하셔서 어떤 과제들이 있을지 엄청 기대 중입니다!


이 글은 제가 공부하면서 정리한 내용이라 혹시 잘못된 정보가 있을 수 있습니다.

만약 틀린 부분을 발견하셨다면 댓글로 알려주시면 감사하겠습니다 🙇‍♀️

 

읽어주셔서 감사합니다.