아래 글은 한국 스프링 사용자 모임(KSUG)에서 진행된 스프링 배치 스터디 내용을 정리한 게시글입니다.
DEVOCEAN에 연재 중인 KIDO님의 글을 참고하여 실습한 내용을 기록했습니다.
원본: [SpringBatch 연재 08] CompositeItemProcessor 으로 여러단계에 걸쳐 데이터 Transform하기
CompositeItemProcessor 란?
- Spring Batch에서 제공하는 ItemProcessor 인터페이스를 구현하는 클래스입니다.
- 여러 개의 ItemProcessor를 하나의 Processor로 연결하여 여러 단계의 처리를 수행할 수 있도록 합니다.
- ItemProcessor는 필수가 아니지만, Reader와 Writer와는 별도의 단계로 동작하여 비즈니스 로직을 분리하는 데 도움을 줍니다.
주요 구성 요소
- Delegates: 처리를 수행할 ItemProcessor 리스트입니다.
- TransactionAttribute: 트랜잭션 속성을 설정합니다.
장점
- 단계별 처리
- 여러 단계로 나누어 처리를 수행하여 코드를 명확하고 이해하기 쉽게 만듭니다.
- 재사용 가능성
- 각 단계별 Processor를 재사용하여 다른 Job에서 활용할 수 있습니다.
- 유연성
- 다양한 ItemProcessor를 조합하여 원하는 처리 과정을 구현할 수 있습니다.
단점
- 설정 복잡성
- 여러 개의 Processor를 설정하고 관리해야 하기 때문에 설정이 복잡할 수 있습니다.
- 성능 저하
- 여러 단계의 처리 과정을 거치므로 성능이 저하될 수 있습니다.
실습하기
이름, 성별을 소문자로 변환하는 LowerCaseItemProcessor와 현재 나이에 20살을 더하는 After20YearsItemProcessor를 작성 해보겠습니다.
/**
* 이름, 성별을 소문자로 변경하는 ItemProcessor
*/
public class LowerCaseItemProcessor implements ItemProcessor<Customer, Customer> {
@Override
public Customer process(Customer item) throws Exception {
item.setName(item.getName().toLowerCase());
item.setGender(item.getGender().toLowerCase());
return item;
}
}
/**
* 나이에 20년을 더하는 ItemProcessor
*/
public class After20YearsItemProcessor implements ItemProcessor<Customer, Customer> {
@Override
public Customer process(Customer item) throws Exception {
item.setAge(item.getAge() + 20);
return item;
}
}
CompositeItemProcess 구현하기
- MyBatisItemReader에서 사용했던 코드를 이용해서 실습 해보겠습니다.
@Bean
public CompositeItemProcessor<Customer, Customer> compositeItemProcessor() {
return new CompositeItemProcessorBuilder<Customer, Customer>()
// ItemProcessor가 수행할 순서대로 배열을 만들어 전달
.delegates(List.of(
new LowerCaseItemProcessor(),
new After20YearsItemProcessor()
))
.build();
}
실행하는 StepBuilder 내 Processor 부분을 compositeItemProcessor 로 바꾸고 실행합니다.
사용한 데이터
mysql> select * from customer;
+----+---------+------+--------+
| id | name | age | gender |
+----+---------+------+--------+
| 11 | Alice | 30 | F |
| 12 | Bob | 45 | M |
| 13 | Charlie | 25 | M |
| 14 | Diana | 29 | F |
| 15 | Evan | 35 | M |
| 16 | Fiona | 40 | F |
| 17 | George | 55 | M |
| 18 | Hannah | 32 | F |
| 19 | Alice | 30 | F |
| 20 | Bob | 45 | M |
| 21 | Charlie | 25 | M |
| 22 | Diana | 29 | F |
| 23 | Evan | 35 | M |
| 24 | Fiona | 40 | F |
| 25 | George | 55 | M |
| 26 | Hannah | 32 | F |
+----+---------+------+--------+
16 rows in set (0.01 sec)
결과
alice 50 f
bob 65 m
charlie 45 m
diana 49 f
evan 55 m
fiona 60 f
george 75 m
hannah 52 f
alice 50 f
bob 65 m
charlie 45 m
diana 49 f
evan 55 m
fiona 60 f
george 75 m
hannah 52 f
'알아두면 좋은 개발 지식 > Spring Batch 스터디' 카테고리의 다른 글
[10회차] 스프링배치 플로우 컨트롤 하기 (3) | 2024.12.16 |
---|---|
[9회차] 입맛에 맞는 배치 처리를 위한 Custom ItemReader/ItemWriter 구현방법 알아보기 (9) | 2024.12.14 |
[7회차] Spring Batch 스터디: 후기 및 추가 학습 내용 (4) | 2024.11.20 |
[7회차] MyBatisPagingItemReader로 DB내용을 읽고, MyBatisItemWriter로 DB에 쓰기 (3) | 2024.11.16 |
[6회차] Spring Batch 스터디: 후기 및 추가 학습 내용 (2) | 2024.11.16 |