728x90
Task 기반 배치 vs Chunk 기반 배치
- 배치를 처리할 수 있는 방법은 크게 2가지
- Tasklet을 사용한 Taks 기반 처리
- 배치 처리 과정이 비교적 쉬운 경우 쉽게 사용
- 대량 처리를 하는 경우 더 복잡
- 하나의 큰 덩어리를 여러 덩어리로 나누어 처리하기 부적합
- Chunk를 사용한 chunk(덩어리) 기반 처리
- ItemReader, ItemProcessor, ItemWriter의 관계 이해 필요
- 대량 처리를 하는 경우 Tasklet 보다 비교적 쉽게 구현
- ex) 10,000개의 데이터 중 1,000개씩 10개의 덩어리로 수행
- 이를 Tasklet으로 처리하면 10,000개를 한번에 처리하거나 혹은 수동으로 1,000개씩 분할하여 처리
Chunk 기반 처리 흐름
- reader에서 null을 return 할 때까지 Step은 반복
- <INPUT, OUTPUT> chunk(int)
- reader에서 INPUT을 return
- processor에서 INPUT을 받아 processing 후 OUTPUT을 return
- INPUT, OUTPUT은 같은 타입일 수도 있음.
- write에서 List<OUTPUT>을 받아 write 함.
JobParameters 이해
- 배치 실행에 필요한 값을 parameter를 통해 외부에서 주입
- JobParameters는 외부에서 주입된 parameter를 관리하는 객체
- parameter를 JobParameters와 Spring EL(Expression Language)로 접근
- String parameter = jobParameters.getString(key, defaultValue);
- @Value("#{jobParameters[key]}")
@JobScope vs @StepScope
- @xxxScope는 어떤 시점에 bean을 생성/소멸 시킬 지 bean의 lifecycle을 설정함.
- @JobScope는 job 실행 시점에 생성/소멸
- Step에 선언한다.
- @StepScope는 step 실행 시점에 생성/소멸
- Tasklet, Chunk(ItemReader, ItemProcessor, ItemWriter)에 선언
- Spring의 @Scope과 같은 개념
- @Scope("job") == @JobScope
- @Scope("step") == @StepScope
- Job과 Step 라이프사이클에 의해 생성되기 때문에 Thread safe하게 작동한다.
- @Value("#{jobParameters[key]}")를 사용하기 위해
ItemReader
- 배치 대상 데이터를 읽기 위한 설정
- 파일, DB, 네트워크 등에서 읽기 위함.
- (Chunk 기반) Step에서 ItemReader는 필수
- 기본 제공되는 ItemReader 구현체
- ex) file, jdbc, jpa, hibernate, kafka, etc..
- ItemReader 구현체가 없으면 직접 개발
- ItemStream은 ExecutionContext로 read, write 정보를 저장
- CustomItemReader
CSV 파일 데이터 읽기
- FlatFileItemReader 클래스로 파일에 저장된 데이터를 읽어 객체에 매핑
JDBC 데이터 읽기 - Cursor
- Cursor 기반 조회
- 배치 처리가 완료될 때 까지 DB Connection이 연결됌
- DB Connection 빈도가 낮아 성능이 좋은 반면, 긴 Connection 유지 시간이 필요하다.
- 하나의 Connection에서 처리되기 때문에, Thread Safe하지 않음
- 모든 결과를 메모리에 할당하기 때문에, 더 많은 메모리를 사용
- Paging 기반 조회
- 페이징 단위로 DB Connection을 연결
- DB Connection 빈도가 높아 비교적 성능이 낮은 반면, 짧은 Connection 유지 시간 필요
- 매번 Connection을 하기 때문에 Thread Safe
- 페이징 단위의 결과만 메모리에 할당하기 때문에, 비교정 더 적은 메모리를 사용한다.
ItemWriter
- ItemWriter는 마지막으로 배치 처리 대상 데이터를 어떻게 처리하는지를 결정
- (Chunk 기반) Step에서 ItemWriter는 필수
- 사용용도 ex) ItemReader에서 읽은 데이터를 DB에 저장, API로 서버에 요청, 파일에 데이터를 write etc…
- 항상 write를 하지 않음.
- 데이터를 최종적으로 마무리하는 것이 ItemWriter
CSV 파일 데이터 쓰기
- FlatFileItemWriter는 데이터가 매핑된 객체를 파일로 write 한다.
JDBC 데이터 쓰기
- JdbBatchItemWriter는 jdbc를 사용해 DB에 write
- JdbcBatchItemWriter는 bulk insert/update/delete처리
- 단건 처리가 아니기 때문에 비교적 높은 성능
JPA 데이터 쓰기
- JpaItemWriter는 JPA Entity 기반으로 데이터를 DB에 write
- Entity를 하나씩 EntityManager.persist 또는 EntityManager.merge로 insert (bulk로 업데이트하기에는 좋지 않아 보임)
ItemProcessor
- ItemReader에서 읽은 데이터를 가공 또는 Filtering
- Step의 ItemProcessor는 optional
- ItemProcessor는 필수는 아니지만, 책임 분리를 분리하기 위해 사용
- ItemProcessor는 I(input)를 O(output)로 변환하거나
- ItemWriter의 실행 여부를 판단할 수 있도록 filtering 역할을 한다.
- ItemWriter는 not null만 처리
728x90
'Spring Framework Module > Spring Batch' 카테고리의 다른 글
[Spring Batch] JobExecutionListener, StepExecutionListener (0) | 2023.04.20 |
---|---|
[Spring Batch] 구조 (0) | 2023.02.18 |