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

4회차는 Spring Batch의 FlatFileItemReader/Writer에 대해 공부했습니다.

 

스터디 진행 전 교안을 공부하며 정리한 내용은 이곳에서 볼 수 있습니다.

 

[4회차] FlatFileItemReader로 단순 파일 읽고, FlatFileItemWriter로 파일에 쓰기

아래 글은 한국 스프링 사용자 모임(KSUG)에서 진행된 스프링 배치 스터디 내용을 정리한 게시글입니다.DEVOCEAN에 연재 중인 KIDO님의 글을 참고하여 실습한 내용을 기록했습니다.  [SpringBatch 연재

yeseul-dev.tistory.com

 

스터디가 진행 되는 시간에 나눴던 얘기들을 조금 정리해 보겠습니다.

 

  • Spring Batch 5는 Job이 여러개가 존재한다면 실행시에 어떤 Job을 실행할 것인지 명시 해주어야 합니다.
기능 Spring Batch 4.x 이하 Spring Batch 5.x
여러 Job 등록 시 실행 방식 첫 번째 등록된 Job이 자동 실행 명시적으로 실행할 Job을 지정해야 함
실행 시 Job 이름 명시 여부 선택 사항(지정 안 해도 기본 실행 가능) 필수(여러 Job 등록 시 반드시 지정)
Strictness 강화 자동 실행으로 유연성 제공 명확성, 일관성을 위한 엄격한 제약 추가

 


참고(24.11.08. 추가)

배치 작업

  • 배치 작업은 일반적으로 한 번 실행되는 작업으로, 객체처럼 모듈로 나누어 조립하는 방식으로 관리할 수 있습니다.
  • 여러 Job을 동시에 실행해야 하는 경우, 아래의 방법을 주로 사용하고 있다고 합니다.
    1. 에어플로우(Airflow) 같은 툴을 사용해 각 Job을 독립적인 어플리케이션으로 구현하고 순차적으로 연결해 실행
    2. Jenkins를 사용해 각 Job의 기동 조건을 설정하여 스케줄에 맞춰 실행

배치 스케줄링 도구

  • 과거에는 주로 Jenkins가 스케줄러 역할로 많이 사용되었습니다.
  • 최근에는 AWS Batch + Step Functions 조합이 많이 사용되며, EventBridge를 통해 스케줄에 따라 Step Functions를 실행하는 방식도 활용됩니다. Apache Airflow 역시 유용한 선택지입니다.

Spring Batch의 Job 실행

  • spring.batch.job.name은 동시에 하나의 Job만 실행하도록 제한합니다.
  • spring.batch.job.names는 여러 Job을 콤마로 나열해 동시에 여러 Job을 실행할 수 있지만, 순서가 보장되지 않습니다.

 


  • 실습을 진행할 때는 의도적으로 에러를 발생시켜 보자.
    • 에러 발생 시 BATCH_STEP_EXECUTION 테이블에 EXIT_CODE(FAILED)로 기록되는 것을 볼 수 있음

 

기본 내용 발표와 설명이 끝난 후, 세 분께서 추가 설명을 해주셨습니다.

 

이번 주차에는 실습 문제도 포함되어 있어, 이에 대한 설명도 함께 진행되었습니다.

 

1. 첫 번째 발표: Controller 이용해서 웹에서 배치 처리 가능하게 만들기 — 김XX님

주요 내용

  • DB의 테이블 메타 정보를 읽어와서 엑셀로 출력하는 배치 작업 구현
  • MyBatisCursorItemReader 활용 (JPA 대신 선택한 이유: 성능 최적화)
  • 웹 컨트롤러를 통한 동적 파라미터 처리
  • 데이터베이스별 쿼리를 enum으로 관리하여 유연한 DB 지원
  • meta.http 파일의 사용
    • http 파일은 HTTP 요청을 정의하고 테스트할 수 있도록 도와주는 파일 형식입니다. intellij에서 직접 테스트를 해볼 수 있고, 파일 형식으로 관리한다는 게 신기했습니다. 프로젝트에 바로 적용해 봐야겠습니다.

주요 포인트

  1. JobScope 활용
    • 동적인 정보 처리를 위해 사용
    • Spring Batch에서 @JobScope는 Job 실행 시점에만 빈을 생성하고 관리하도록 하여 필요할 때만 빈을 동적으로 로딩할 수 있게 합니다. @JobScope를 사용하면 Job 실행 중에만 필요한 빈이 등록되고, Job이 종료되면 빈이 소멸되므로 메모리를 효율적으로 사용할 수 있습니다.(빈의 라이프사이클 관리) 이를 통해 웹에서 요청을 할 때 동적으로 처리할 수 있도록 구현했습니다.
  2. 실행 시 주의사항
    • 동일한 Job을 두 번째 실행할 때 에러 발생
      • 현재 시간을 파라미터로 활용하거나 JobId를 설정 하여 Job을 구분해야 실행이 가능 했음

 

❗주의사항❗
Spring Batch는 가능하면 컨트롤러로 구현하지 않는 것을 권장합니다.
배치 작업은 장시간 실행되며 메모리 사용량이 많아질 수 있기 때문에, 배포 타이밍 조정이 어려워 신중한 설계가 필요합니다.

 

 

2. 두 번째 발표: 실습 문제(통계청 데이터 처리) — 조XX님

주요 내용

  • 소수점 처리가 필요하다면 BigDecimal 이 필수

이번 주 실습 문제는 경기종합지수를 활용해 통계를 내는 것이었는데, '경기종합지수' 자체에 대한 이해가 부족해서 문제의 접근 방향을 잘 잡지 못했습니다. 조XX님 덕분에 풀이 방식에 대한 감을 잡을 수 있었어요.

 

코드 설명의 세부적인 부분은 이해가 어려워 기록하지 못했습니다 ㅜㅜ

소스 코드를 찾아서 보충 공부하도록 하겠습니다.

 

3. 세 번째 발표: 그 외 구현 팁 — 김XX님

  1. FlatFileItemReaderBuilder 동작 방식
    • LineTokenizer가 null일 경우 우선순위 기반 적용
    • Tokenizer 우선순위
      1. 명시적으로 설정한 LineTokenizer: 사용자 정의 토크나이저 포함
        1. FixedLengthTokenizer 등
      2. DelimitedLineTokenizer (기본값)
  2. 불변성 보장을 위한 Record 클래스 활용
    • JDK 17+와 Spring Batch 5에서는 FlatFileItemReaderBuilder가 isRecord() 메서드를 사용해 객체가 Record 타입인지 자동으로 감지합니다.
    • Record 타입일 경우 RecordFieldSetMapper가 자동 설정되어 불변성을 보장하는 Record 클래스에 쉽게 매핑할 수 있습니다.
    • 원본 데이터 불변성을 보장해주므로 Reader에 사용하면 좋을 것 같습니다.
    • 참고

스터디 때마다 딥다이브 하시는 분들이 많아서 대단하다고 느낍니다.

덕분에 많은 것을 배울 수 있어서 좋았습니다. 👍