-
[Spring boot] spring boot batch 기본 구조Spring 2022. 5. 4. 23:22
서비스를 만들던 도중 주기적으로 대용량 데이터를 업데이트 하거나 생성해야하는 일이 생겼다.
때문에 이 일을 쉽게 만들어 줄 시스템을 찾아 다녔고 스프링에서 제공하는 springbootbatch를 찾게 되었다.
spring boot batch란?
spring boot batch의 장점들은 다음과 같다.
- 자동화 : 매번 단순 반복 작업을 쉽고 빠르게 자동화 시켜준다.
- 대용량 처리 : 대용량 데이터를 가장 최적화된 성능을 보장한다.
- 견고성 : 예측하지 못한 상황이나 동작에 대한 예외처리도 정의할 수 있다.
- 재사용성 : 공통적인 작업을 단위별로 재사용할 수 있다.이와 같은 장점들이 있음에도 불구하고 spring boot batch를 사용하기 전에 배치처리 특성상 몇가지 고려사항이 있다.
- 단순화 : 복잡한 구조와 로직을 지양해야 한다.
- 무결성 : 정의한 단위수만큼 데이터를 불러와서 처리해야한다.
처리해야하는 데이터에 대한 예외적인 상황이 일어나지 않도록 데이터의 무결성이 보장되어야만 한다.
- 최적화 : 배치처리 시에 시스템에 입력과 출력의 사용을 최소화해야 한다.
최대한 적은 횟수로 데이터를 읽고, 처리하고, 저장하는 것이 좋다.spring boot batch의 구조
spring boot batch의 공통적으로 정의된 시나리오는 다음과 같다.
Read : 원하는 조건의 데이터 레코드를 DB에서 읽어온다.
Processing : 읽어온 데이터를 비즈니스 로직을 따라 처리한다.
Write : 처리된 데이터를 DB에 업데이트 or 저장합니다.해당 구조를 spring boot batch에서 제공하는 인터페이스 관계도를 나타내면 다음과 같다.
spring boot batch의 가장 작은 단위 step의 구조인 파란색으로 표시된 단계를 정의하면 다음과 같다.
ItemReader : 배치 데이터를 읽어오는 인터페이스. DB뿐 아니라 File, XML 등 다양한 타입에서 읽어올 수 있다.
ItemProcessor : 읽어온 데이터를 가공/처리한다.
ItemWriter : 처리한 데이터를 DB에 저장 or 업데이트 한다.각 인터페이스의 구조들은 다음과 같다.
ItemReader
public interface ItemReader<T> { T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException; }
ItemReader의 반환 타입은 제네릭 타입이므로 유저가 직접 타입을 명시할 수 있다.
ItemProcessor
public interface ItemProcessor<I, O> { O process(I item) throws Exception; }
ItemProcessor의 역할은 Read와 Writer 사이에서 데이터를 처리하는 일이다.
제네릭 타입 두개 중 전자는 Input의 타입을 의미하고, 후자는 Output의 타입을 의미한다.
ItemWriter
public interface ItemWriter<T> { void write(List<? extends T> items) throws Exception; }
ItemWriter의 반환 타입은 List의 제네릭 타입이다.
Proccesor에서 넘어온 데이터들을 한번에 처리할 수 있지만, 버그가 발생하거나 DB에 부하가 올 수 있다.
때문에 spring boot batch는 한 번의 트랜잭션 안에 처리되는 수를 정의할 수 있다. 그 역할을 하는 것이 chunk라는 단위이다.
지금껏 정의된 내용을 표현하자면 다음과 같다.
지금껏 spring boot batch의 가장 작은 단위의 구조에 대해 알아보았다.
다음은 전체적인 구조에 대해 노트할 것 같다.
'Spring' 카테고리의 다른 글
[Spring] Spring Data JPA의 save 함수 구조 (0) 2022.06.17 [Spring boot] spring boot batch 관계도 (0) 2022.05.10 [Spring] Swagger 2.9.2 Jwt 설정 통일하는 법 (0) 2022.03.31 [Spring] Swagger 2.9.2 NumberFormatException 해결법 (0) 2022.03.31 [Spring] Spring Security 로그인된 유저 뽑아오기 (1) 2022.03.14