4회차는 Spring Batch의 FlatFileItemReader/Writer에 대해 공부했습니다.
스터디 진행 전 교안을 공부하며 정리한 내용은 이곳에서 볼 수 있습니다.
스터디가 진행 되는 시간에 나눴던 얘기들을 조금 정리해 보겠습니다.
- Spring Batch 5는 Job이 여러개가 존재한다면 실행시에 어떤 Job을 실행할 것인지 명시 해주어야 합니다.
기능 | Spring Batch 4.x 이하 | Spring Batch 5.x |
여러 Job 등록 시 실행 방식 | 첫 번째 등록된 Job이 자동 실행 | 명시적으로 실행할 Job을 지정해야 함 |
실행 시 Job 이름 명시 여부 | 선택 사항(지정 안 해도 기본 실행 가능) | 필수(여러 Job 등록 시 반드시 지정) |
Strictness 강화 | 자동 실행으로 유연성 제공 | 명확성, 일관성을 위한 엄격한 제약 추가 |
참고(24.11.08. 추가)
배치 작업
- 배치 작업은 일반적으로 한 번 실행되는 작업으로, 객체처럼 모듈로 나누어 조립하는 방식으로 관리할 수 있습니다.
- 여러 Job을 동시에 실행해야 하는 경우, 아래의 방법을 주로 사용하고 있다고 합니다.
- 에어플로우(Airflow) 같은 툴을 사용해 각 Job을 독립적인 어플리케이션으로 구현하고 순차적으로 연결해 실행
- 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에서 직접 테스트를 해볼 수 있고, 파일 형식으로 관리한다는 게 신기했습니다. 프로젝트에 바로 적용해 봐야겠습니다.
주요 포인트
- JobScope 활용
- 동적인 정보 처리를 위해 사용
- Spring Batch에서 @JobScope는 Job 실행 시점에만 빈을 생성하고 관리하도록 하여 필요할 때만 빈을 동적으로 로딩할 수 있게 합니다. @JobScope를 사용하면 Job 실행 중에만 필요한 빈이 등록되고, Job이 종료되면 빈이 소멸되므로 메모리를 효율적으로 사용할 수 있습니다.(빈의 라이프사이클 관리) 이를 통해 웹에서 요청을 할 때 동적으로 처리할 수 있도록 구현했습니다.
- 실행 시 주의사항
- 동일한 Job을 두 번째 실행할 때 에러 발생
- 현재 시간을 파라미터로 활용하거나 JobId를 설정 하여 Job을 구분해야 실행이 가능 했음
- 동일한 Job을 두 번째 실행할 때 에러 발생
❗주의사항❗
Spring Batch는 가능하면 컨트롤러로 구현하지 않는 것을 권장합니다.
배치 작업은 장시간 실행되며 메모리 사용량이 많아질 수 있기 때문에, 배포 타이밍 조정이 어려워 신중한 설계가 필요합니다.
2. 두 번째 발표: 실습 문제(통계청 데이터 처리) — 조XX님
주요 내용
- 소수점 처리가 필요하다면 BigDecimal 이 필수
이번 주 실습 문제는 경기종합지수를 활용해 통계를 내는 것이었는데, '경기종합지수' 자체에 대한 이해가 부족해서 문제의 접근 방향을 잘 잡지 못했습니다. 조XX님 덕분에 풀이 방식에 대한 감을 잡을 수 있었어요.
코드 설명의 세부적인 부분은 이해가 어려워 기록하지 못했습니다 ㅜㅜ
소스 코드를 찾아서 보충 공부하도록 하겠습니다.
3. 세 번째 발표: 그 외 구현 팁 — 김XX님
- FlatFileItemReaderBuilder 동작 방식
- LineTokenizer가 null일 경우 우선순위 기반 적용
- Tokenizer 우선순위
- 명시적으로 설정한 LineTokenizer: 사용자 정의 토크나이저 포함
- FixedLengthTokenizer 등
- DelimitedLineTokenizer (기본값)
- 명시적으로 설정한 LineTokenizer: 사용자 정의 토크나이저 포함
- 불변성 보장을 위한 Record 클래스 활용
- JDK 17+와 Spring Batch 5에서는 FlatFileItemReaderBuilder가 isRecord() 메서드를 사용해 객체가 Record 타입인지 자동으로 감지합니다.
- Record 타입일 경우 RecordFieldSetMapper가 자동 설정되어 불변성을 보장하는 Record 클래스에 쉽게 매핑할 수 있습니다.
- 원본 데이터 불변성을 보장해주므로 Reader에 사용하면 좋을 것 같습니다.
- 참고
스터디 때마다 딥다이브 하시는 분들이 많아서 대단하다고 느낍니다.
덕분에 많은 것을 배울 수 있어서 좋았습니다. 👍
'알아두면 좋은 개발 지식 > Spring Batch 스터디' 카테고리의 다른 글
[5회차] Spring Batch 스터디: 후기 및 추가 학습 내용 (1) | 2024.11.05 |
---|---|
[5회차] JdbcPagingItemReader로 DB내용을 읽고, JdbcBatchItemWriter로 DB에 쓰기 (1) | 2024.11.02 |
[4회차] FlatFileItemReader로 단순 파일 읽고, FlatFileItemWriter로 파일에 쓰기 (1) | 2024.10.26 |
[3회차] Spring Batch 스터디: 후기 및 추가 학습 내용 (4) | 2024.10.22 |
[3회차] SpringBatch ChunkModel과 TaskletModel (0) | 2024.10.17 |