Spring Batch 5.1 변경 사항
가상 스레드 지원
Spring Batch 5.1의 주요 주제 중 하나는 JDK 21 LTS를 수용하는 것이며, 특히 Project Loom의 가상 스레드 지원에 초점을 맞추고 있습니다. 이번 릴리스에서는 가상 스레드를 프레임워크의 모든 영역에서 사용할 수 있으며, 가상 스레드를 사용하여 동시에 스텝을 실행하거나 여러 스텝을 병렬로 실행할 수 있습니다.
Spring Batch의 잘 설계된 관심사 분리 덕분에, 스레드는 직접 관리되지 않습니다. 스레드 관리는 대신 Spring Framework의 TaskExecutor 구현체에 위임됩니다. 이 인터페이스 기반의 접근 방식 덕분에 TaskExecutor 구현체 간을 투명하고 유연하게 전환할 수 있습니다.
Spring Framework 6.1에서는 가상 스레드를 기반으로 한 새로운 TaskExecutor 구현체인 VirtualThreadTaskExecutor가 도입되었습니다. 이 TaskExecutor는 Spring Batch에서 TaskExecutor가 필요한 모든 곳에서 사용할 수 있습니다.
JpaItemWriter에서 메모리 관리 개선
JpaItemWriter를 사용할 때, 청크 크기가 충분히 크면 JPA 영속성 컨텍스트가 빠르게 커질 수 있습니다. 이를 적절한 시점에 정리하지 않으면 OutOfMemoryError와 같은 오류가 발생할 수 있습니다.
이번 릴리스에서는 clearPersistenceContext라는 새로운 옵션이 JpaItemWriter에 도입되어, 각 청크의 아이템을 기록한 후 영속성 컨텍스트를 정리할 수 있게 되었습니다. 이 옵션은 대량의 데이터와 큰 청크 크기를 처리하는 청크 지향 스텝의 메모리 관리를 개선합니다.
새로운 동기화 데코레이터(Item Readers 및 Writers) 도입
Spring Batch 5.0 이전 버전까지는 SynchronizedItemStreamReader와 SynchronizedItemStreamWriter라는 두 가지 데코레이터를 제공하여, 멀티스레드 스텝에서 쓰레드 안전하지 않은 ItemStreamReader의 read 메서드와 ItemStreamWriter의 write 메서드에 대한 동기화 처리를 할 수 있었습니다. 이러한 데코레이터는 비동기적인 아이템 스트림을 사용하는 경우에 유용했습니다.
그러나 이러한 데코레이터는 ItemStream 구현체에서만 동작했으며, ItemStream이 아닌 경우에는 사용할 수 없었습니다. 예를 들어, ListItemReader#read나 KafkaItemWriter#write와 같은 경우에는 이 데코레이터로 동기화를 처리할 수 없었습니다.
이를 해결하기 위해, 이번 릴리스에서는 비-ItemStream에 대한 새로운 동기화 데코레이터가 도입되었습니다. 이 새로운 기능 덕분에 Spring Batch에서 제공하는 모든 아이템 리더와 라이터에 대해 별도의 커스텀 데코레이터를 작성할 필요 없이 동기화를 처리할 수 있게 되었습니다.
MongoCursorItemReader 도입
Spring Batch 5.0까지는 MongoItemReader가 MongoDB의 skip 연산을 기반으로 한 페이지네이션(pagination) 방식을 사용했습니다. 이 방식은 소규모 또는 중간 크기의 데이터 세트에서는 잘 동작하지만, 대규모 데이터 세트에서는 성능이 저하되는 문제가 있었습니다.
이번 릴리스에서는 MongoCursorItemReader라는 새로운 커서 기반 아이템 리더가 도입되었습니다. 이 구현체는 페이지네이션 대신 커서(cursor) 를 사용하여 MongoDB에서 데이터를 읽어오며, 이를 통해 대규모 컬렉션에서의 성능을 크게 향상시켰습니다.
또한, 다른 커서나 페이지네이션 리더들과의 일관성을 유지하기 위해 기존의 MongoItemReader는 MongoPagingItemReader로 이름이 변경되었습니다.
MongoItemWriter에서의 대량 삽입 지원
Spring Batch 5.0까지는 MongoItemWriter가 두 가지 작업을 지원했습니다: upsert(삽입 또는 업데이트)와 delete(삭제). upsert 작업은 삽입과 업데이트 모두를 잘 처리하지만, 타깃 컬렉션에 새로운 항목임이 확실한 데이터에 대해서는 성능이 저하되는 문제가 있었습니다.
이번 릴리스에서는 JpaItemWriter의 persist와 merge 작업과 유사하게, 새로운 작업인 insert가 MongoItemWriter에 추가되었습니다. 이 새로운 삽입 작업은 이미 컬렉션에 존재하는지를 확인하기 위한 추가 조회 없이, 신규 항목에 대해 더 나은 성능을 제공합니다. 결과적으로 대량 삽입 작업에서 upsert보다 성능이 향상됩니다.
Redis를 위한 새로운 Item Reader와 Writer
Spring Batch 5.1에서는 Redis를 다루기 위한 새로운 RedisItemReader와 RedisItemWriter가 추가되었습니다.
RedisItemReader는 Spring Data Redis를 기반으로 하며,ScanOptions을 사용해 Redis의 키셋을 스캔하여 데이터를 읽을 수 있도록 구성할 수 있습니다. 이를 통해 Redis에서 데이터를 손쉽게 읽어 들일 수 있습니다.RedisItemWriter는 Spring Data Redis의RedisTemplate을 사용해 Redis에 데이터를 기록할 수 있도록 구성할 수 있습니다. 이 새로운 Writer를 사용하면 Redis에 데이터를 효율적으로 쓸 수 있습니다.
이를 통해 Redis와 통합된 배치 작업이 더욱 간단하고 유연하게 처리될 수 있습니다.
JobRegistryBeanPostProcessor의 자동 구성
Spring Batch 5.1에서는 JobRegistryBeanPostProcessor의 자동 구성이 추가되어 JobOperator 설정 과정이 더 간소화되었습니다. 이전에는 JobOperator를 사용하려면 JobRegistry에 배치 작업(Job)을 수동으로 등록하거나, 이를 자동으로 처리하기 위해 JobRegistryBeanPostProcessor 빈을 애플리케이션 컨텍스트에 명시적으로 추가해야 했습니다.
이제는 기본적으로 @EnableBatchProcessing 애너테이션을 사용하거나 DefaultBatchConfiguration을 확장하면, JobRegistryBeanPostProcessor 빈이 자동으로 등록됩니다. 이를 통해 JobOperator 사용 시 별도의 빈 등록 과정이 필요 없어지고, 설정이 간편해졌습니다. 이 기능은 JobRegistry와 JobOperator의 통합을 더욱 쉽게 만들어 사용자 경험을 개선합니다.
Job 흐름을 Decider로 시작하는 기능
Spring Batch 5.1부터 JobBuilder API에서 JobExecutionDecider로 배치 작업(Job)의 흐름을 시작할 수 있는 새로운 기능이 추가되었습니다.
이전 버전(5.0까지)에서는 XML 설정 방식에서만 <decision> 요소를 사용하여 작업 흐름을 Decider로 시작할 수 있었고, Java API에서는 이와 같은 흐름 정의가 불가능했습니다. 그러나 이번 릴리스에서는 JobBuilder API에 JobExecutionDecider로 작업 흐름을 시작할 수 있는 옵션이 추가되어, Java 설정 방식에서도 동일한 흐름 제어가 가능해졌습니다.
이로 인해 XML 설정 방식과 Java API 설정 방식 간의 일관성이 향상되었고, 사용자들이 더 유연하게 작업 흐름을 설계할 수 있게 되었습니다.
사용자 정의 JobKeyGenerator 제공 기능
Spring Batch 5.1에서는 JobKeyGenerator를 사용자 정의로 제공할 수 있는 기능이 추가되었습니다. 기본적으로 Spring Batch는 JobKeyGenerator를 통해 작업 인스턴스를 식별하는데, 이는 식별용 작업 파라미터로부터 MD5 해시를 계산하여 이루어집니다. 대부분의 경우 이 기본 식별 방식을 그대로 사용하는 것이 적합하지만, 커스텀 로직이 필요할 때는 이를 사용자 정의할 수 있는 인터페이스가 제공됩니다.
이전 버전(5.0까지)에서는 커스텀 키 생성기를 제공하려면 JobRepository와 JobExplorer를 직접 커스터마이징해야 했습니다. 하지만 이번 릴리스에서는 JobRepository와 JobExplorer의 팩토리 빈을 통해 직접 커스텀 JobKeyGenerator를 설정할 수 있게 되어, 더욱 쉽게 커스터마이징이 가능해졌습니다.
이 기능은 고유한 작업 키 생성 규칙이 필요할 때 유용하며, Spring Batch의 유연성을 높이는 중요한 개선점입니다.
'Backend > Spring Batch' 카테고리의 다른 글
| [Spring Batch 5] Meta 테이블 (0) | 2024.10.13 |
|---|