Spring Batch, 이제 MongoDB와 함께!
기존 Spring Batch의 SQL 데이터베이스 종속성을 제거하고 MongoDB 지원을 공식화하여 유연성 확보
Spring Boot 4.1의 `spring-boot-starter-batch-data-mongodb` 자동 설정을 통해 제로 컨피그(Zero-config) 경험 제공
ETL 작업 예제를 통해 MongoDB에 JobRepository를 저장하고 PostgreSQL에 데이터를 쓰는 방식 시연
GraalVM 네이티브 이미지 지원으로 메모리 사용량 감소 및 시작 시간 단축 효과 확인
Spring Batch JobRepository의 MongoDB 전환 배경
과거 Spring Batch는 SQL 데이터베이스(SQL Database) 기반의 JobRepository를 사용하여 작업 상태를 기록했으나, 이는 MongoDB와 같은 NoSQL 환경 사용자에게 별도의 관계형 데이터베이스(Relational Database) 운영 부담을 야기했다.
Spring Boot 4.1에서는 `spring-boot-starter-batch-data-mongodb` 자동 설정을 통해 이 문제를 해결하며, MongoDB를 데이터 격리 아키텍처(Data Isolation Architecture)의 일부로 자연스럽게 통합할 수 있게 되었다.
이 전환은 개발 편의성 증대와 함께, 각 데이터 저장소의 장점을 활용하는 유연한 아키텍처 설계를 가능하게 한다.
MongoDB 기반 Spring Batch ETL 작업 구성
본 예제는 MongoDB를 JobRepository로 활용하고 PostgreSQL을 데이터 대상 테이블로 사용하는 ETL(Extraction, Transformation, Load) 작업을 보여준다.
`docker-compose.yaml`을 통해 MongoDB(복제본 세트 구성 필수)와 PostgreSQL을 실행하고, `application.properties`에서 두 데이터베이스 연결 정보를 설정한다. 특히, `spring.batch.data.mongodb.schema.initialize=true` 속성은 MongoDB에 필요한 컬렉션을 자동으로 생성하며, `BatchJdbcAutoConfiguration.class` 제외를 통해 JDBC 기반 리포지토리 대신 MongoDB 사용을 명시한다.
Job은 `reset` (테이블 초기화)과 `files-to-db` (CSV 파일 읽어 DB 쓰기) 두 단계로 구성되며, `JdbcBatchItemWriter`는 `ON CONFLICT DO NOTHING` 옵션으로 재실행 시 중복 삽입 오류를 방지한다.
GraalVM 네이티브 이미지 적용 및 성능 이점
GraalVM 네이티브 이미지 기술을 활용하여 Spring Batch 애플리케이션의 메모리 사용량 절감과 시작 시간 단축 효과를 얻을 수 있다.
이를 위해 `RuntimeHintsRegistrar`를 구현하여 필요한 클래스와 리소스(`customers.csv` 포함)를 GraalVM에 명시적으로 등록해야 한다. 특히, Spring Batch 코어 관련 클래스들과 MongoDB 스키마 파일들이 포함된다.
실제 테스트 결과, JVM 대비 시작 시간이 약 1/10 수준으로 감소하고 메모리 사용량은 약 150MB로 줄어드는 것을 확인했다. 이는 장기 실행 배치 작업에는 큰 영향이 없을 수 있으나, 빠른 시작 시간과 리소스 효율성 측면에서 이점을 제공한다.
Spring Boot 4.1의 지연 데이터소스 연결(Lazy DataSource Connections)
Spring Boot 4.1은 지연 데이터소스 연결(Lazy DataSource Connections) 기능을 도입하여, 기본적으로 트랜잭션 시작 시점에 데이터베이스 연결을 초기화하는 대신 실제 사용 시점에 연결을 생성하도록 개선했다.
`spring.datasource.connection-fetch=lazy` 설정을 통해 활성화되며, 이는 불필요한 연결 생성으로 인한 초기 비용을 절감하는 데 기여한다.
이 기능은 특정 워크로드에서는 큰 변화를 가져오지 않을 수 있지만, 리소스 사용 최적화 관점에서 주목할 만한 개선 사항이다.
Spring Batch의 Fault Tolerance 및 재시도 메커니즘
Spring Batch는 청크 기반 처리 시 Fault Tolerance를 지원하며, `faultTolerant()` 설정과 함께 `retryLimit` 및 `retry()`를 사용하여 특정 예외 발생 시 자동 재시도 로직을 구현할 수 있다.
예제에서는 `IllegalArgumentException` 발생 시 최대 10회까지 재시도하도록 설정하여, 일시적인 문제로 인한 청크 실패를 방지하고 작업 안정성을 높인다.
이러한 메커니즘은 복잡한 로직 없이도 견고한 배치 처리 파이프라인 구축을 가능하게 하며, 모든 상태 정보는 MongoDB에 기록되어 추적성을 보장한다.