[Spring Batch] 스프링 배치 내부 흐름
스프링 배치는 대용량 데이터를 효율적으로 처리하기 위해 설계된 프레임워크이다.
1. Chunk 단위로 나눠서 작업
데이터를 일정량의 Chunk 단위로 묶어서 처리한다.
각 Chunk는 여러 Item으로 구성되고 배치 작업은 Item을 하나씩 읽고 처리한 후 모든 Item이 처리되면 결과를 갱신한다.
대량의 데이터를 한 번에 처리할 때 발생할 수 있는 메모리 부하를 줄이고 로직 수행 중 오류가 발생한 경우 유연하게 복구할 수 있다.
2. 예외처리
스프링 배치는 Job을 여러 Step으로 구성하는 방식으로 사용한다.
Step은 독립적인 작업 단위로, 특정 Step에서 예외가 발생했을 때 그 Step에 대해서만 예외를 처리할 수 있어 유연하다.
3. 트랜잭션
각 Chunk 처리 과정에서 트랜잭션을 시작하고 처리가 완료된 후 커밋한다.
개발자가 별도로 트랜잭션을 구현하지 않아도 프레임워크 수준에서 자동으로 처리해준다.
Job은 배치 처리의 전체적인 단위로 하나의 배치 작업 과정을 의미하고, 여러 개의 Step으로 구성된다.
Instance : 논리적 실행 단위로 매개변수로 Instance를 구분한다
Execution : 인스턴스의 실제 실행으로 여러 번 실행될 수 있다 (실패 후 재실행 등..)
Parameter : 실행 시 제공되는 매개변수로 인스턴스를 구분할 때 사용한다
Context : 실행되는 동안 상태 정보나 데이터를 키-값 형태로 저장해 배치 작업의 여러 단계 간 상태를 공유한다
Repository : 실행에 대한 정보(Context)를 데이터베이스에 저장해 배치 작업을 재시작 할 때 사용한다
Listener : before / after 메서드로 배치 작업의 실행 전후 커스텀 로직을 추가한다
Step은 Tasklet Step과 Chunk Oriented Step으로 구분된다.
Tasklet Step
배치에서 가장 기본적인 구현체로 단일 작업을 수행할 때 사용된다.
간단한 작업 / 배치 작업 전후 필요한 준비 작업을 수행할 때 Tasklet Step으로 구현한다.
Chunk Oriented Step
데이터를 일정한 Chunk 단위로 나눠 처리한다.
ItemReader로 데이터를 읽고, ItemProcessor로 데이터를 처리한 후 ItemWriter로 데이터를 저장한다.
@Component
public class FirstItemReader implements ItemReader<Integer> {
// sample data
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int i = 0;
@Override
public Integer read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
System.out.println("Inside Item Reader");
Integer item;
if(i < list.size()) {
item = list.get(i);
i++;
return item;
}
return null;
}
}
@Component
public class FirstItemProcessor implements ItemProcessor<Integer, Long> {
@Override
public Long process(Integer item) throws Exception {
System.out.println("Inside Item Processor");
return Long.valueOf(item + 20);
}
}
@Component
public class FirstItemWriter implements ItemWriter<Long> {
@Override
public void write(List<? extends Long> list) throws Exception {
System.out.println("Inside Item Writer");
list.stream().forEach(System.out::println);
}
}
@Autowired
private FirstItemReader firstItemReader;
@Autowired
private FirstItemProcessor firstItemProcessor;
@Autowired
private FirstItemWriter firstItemWriter;
@Bean
public Job secondJob() {
return jobBuilderFactory.get("Second Job")
.incrementer(new RunIdIncrementer())
.start(firstChunkStep())
.next(secondStep())
.build();
}
private Step firstChunkStep() {
return stepBuilderFactory.get("First Chunk Step")
.<Integer, Long>chunk(3)
.reader(firstItemReader)
.processor(firstItemProcessor)
.writer(firstItemWriter)
.build();
}
Reader로 DataSource에서 읽어온 데이터를 Processor에서 비즈니스 로직을 수행하고 Writer가 데이터를 최종적으로 저장하는 흐름이다.
Step을 구성할 때 명시하는 chunk로 한 번에 몇 개의 데이터를 한 덩어리로 가져올지 설정할 수 있다.
역할과 책임을 명확하게 분리하는 구성으로 개발과 유지보수성을 높인다.
예시에서는 직접 read / write / process 메서드를 오버라이드해서 로직을 구현했는데
스프링 배치는 자주 사용되는 케이스에 대한 각 클래스의 구현체를 기본적으로 제공해 오버라이드 하지 않고 편하게 사용할 수 있게 도와준다.
@Bean
public FlatFileItemReader<Person> reader() {
FlatFileItemReader<Person> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("sample.csv"));
reader.setLineMapper(new DefaultLineMapper<Person>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[] { "firstName", "lastName" });
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
setTargetType(Person.class);
}});
}});
return reader;
}
csv 파일에서 데이터를 읽어오고 각 라인을 특정 객체로 매핑하는 예시이다.
csv 말고도 Jdbc / JPA 등 여러 데이터소스로부터 데이터를 읽어오고 쓸 수 있는 구현체를 제공한다.
스프링 배치를 사용해 비즈니스 로직을 구현할 때 Job과 Step을 어떻게 설계하는지가 매우 중요하다.
Job은 전체적인 배치 처리 작업의 큰 단위로 설정하고, Step은 그 작업을 구성하는 단위로 서로서로 연결될 수 있도록 유기적으로 설계해야 한다.
데이터 로딩 -> 작업 디렉토리에 로딩한 데이터 반영 -> 데이터 전처리 -> 운영 데이터베이스에 적용
하나의 Job을 위와 같은 방식으로 구성하듯.. 비즈니스 로직을 제대로 이해하고 가독성과 유지보수성을 고려한 Step을 설계하자.
'Spring > Spring Batch' 카테고리의 다른 글
[Spring Batch] Chunk 아키텍처 (0) | 2024.08.24 |
---|---|
[Spring Batch] Flow 아키텍처 (2) | 2024.07.21 |
[Spring Batch] Job / Step 아키텍처 (0) | 2024.07.07 |
[Spring Batch] 배치 도메인 이해 (0) | 2024.06.30 |
[Spring Batch] ItemReader / ItemWriter (1) | 2024.02.27 |
댓글
이 글 공유하기
다른 글
-
[Spring Batch] Flow 아키텍처
[Spring Batch] Flow 아키텍처
2024.07.21 -
[Spring Batch] Job / Step 아키텍처
[Spring Batch] Job / Step 아키텍처
2024.07.07 -
[Spring Batch] 배치 도메인 이해
[Spring Batch] 배치 도메인 이해
2024.06.30 -
[Spring Batch] ItemReader / ItemWriter
[Spring Batch] ItemReader / ItemWriter
2024.02.27