2024.03.20 - [Spring/Batch Programming] - Spring Batch 3 - Items(Writer)
이전까지 Item 삼총사의 Reader와 Writer에 대해 학습했다. 이제 마지막으로 Processor를 보겠다.
주 기능
- 읽은 데이터를 쓰기 데이터로 가공 (비즈니스 로직이 수행됨)
- 필터링
- 입력 유효성 검증 (유효하지 않을 경우 배치 작업 종료)
예전에 순수 Java로 직접 만들때와 같이 제네릭으로 Reader에서 I 를 읽고, Writer로 O을 전달하는 형식이 나타난다.
비즈니스 로직은 너무나 다양하기 때문에 규격화 할수없고, 커스터마이징해서 사용할 수 밖에없다.
이에 따라 Processor는 Writer, Reader와 비교했을때, 오버라이딩해서 상황에 맞게끔 직접 로직을 짜는 특징이있다.
다양한 로직중에서도 몇가지는 규격화된 로직을 제공한다.
실습
@Bean
public Step step(
JobRepository jobRepository,
PlatformTransactionManager transactionManager,
ItemReader<User> jpaCursorItemReader
){
return new StepBuilder("step", jobRepository)
.<User, String>chunk(2, transactionManager)
.reader(jpaCursorItemReader)
.processor(user -> {
if(user.getName().equals("민수")) return null;
return "%s의 나이는 %s입니다. 사는 곳은 %s, 전화번호는 %s입니다.".formatted(
user.getName(), user.getAge(), user.getRegion(), user.getTelephone()
);
})
.writer(System.out::println)
.build();
}
Bean Validation
꼮 Batch가 아니더라도 스프링으로 개발을 해본 경험이 있는 사람이라면 익숙한 것들이다.
위의 어노테이션을 사용하기 위해선 어떻게 해야할까?
@Bean
public BeanValidatingItemProcessor<User> beanValidatingItemProcessor(){
return new BeanValidatingItemProcessor<>();
}
간단하게 Bean으로 등록해주기만 하면 된다. 그러면 자동으로 검증을 해준다.
ItemProcessor에서 핵심은 비즈니스 로직이라고 했다. 그렇다면 비즈니스 로직이 너무 길어지고 다양한 관심사가 있다면 어떻게 해야할까?
순차적으로 관심사에 대해 하나씩 수행된다.
실제 CompositeItemProcessor 구현 클래스 이다.
필드를 보면 delegates라는 ItemProcessor형의 리스트를 가지고 있다.
실제로 구현된 부분을 보면 delegates에서 하나씩 프로세서를 순회하는 것을 볼 수 있다.
실습
private static ItemProcessor<User, User> processor1() {
return user -> {
user.setName(user.getName() + user.getName());
return user;
};
}
private static ItemProcessor<User, User> processor2() {
return user -> {
user.setAge(user.getAge() + user.getAge());
return user;
};
}
private static ItemProcessor<User, User> processor3() {
return user -> {
user.setRegion(user.getRegion() + user.getRegion());
return user;
};
}
processor 3개를 작성
@Bean
public Step step(
JobRepository jobRepository,
PlatformTransactionManager transactionManager,
ItemReader<User> jpaCursorItemReader
){
List<ItemProcessor<User, User>> list = Arrays.asList(processor1(), processor2(), processor3());
return new StepBuilder("step", jobRepository)
.<User, User>chunk(2, transactionManager)
.reader(jpaCursorItemReader)
.processor(new CompositeItemProcessor<>(list))
.writer(System.out::println)
.build();
}
Step에 CompositeItemProcessor 등록
전부 잘 반영된 것을 확인할 수있다.
'Spring > Batch Programming' 카테고리의 다른 글
Spring Batch 확장 (0) | 2024.03.25 |
---|---|
Spring Batch 3 - Items(Writer) (0) | 2024.03.20 |
Spring Batch 3 - Items(Reader) (0) | 2024.03.20 |
Spring Batch Step (0) | 2024.03.13 |
Spring Batch Job (0) | 2024.03.13 |