[8회차] CompositeItemProcessor 으로 여러단계에 걸쳐 데이터 Transform하기

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

 

원본: [SpringBatch 연재 08] CompositeItemProcessor 으로 여러단계에 걸쳐 데이터 Transform하기

 

[SpringBatch 연재 08] CompositeItemProcessor 으로 여러단계에 걸쳐 데이터 Transform하기

 

devocean.sk.com

 

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