스프링 배치는 스프링에서 기본적으로 제공하는 일괄처리를 위한 기능입니다.
- Job
하나의 배치 작업을 Job이라고 하며,
Job은 최소 하나 이상의 Step을 수행해야합니다.
- JobInstance
Job이 실행될 때 하나의 Job 실행 단위입니다.
매시간마다 동작하는 Job이 있다고 가정하면 한시간 전에 동작한 Job과 현재 동작하는 Job은 서로 다른 JobInstance입니다.
다만, 한시간 전의 Job이 실패했다면 동일한 JobInstance로 실행하게 됩니다.
- JobExecution
JobInstance에 대한 한번의 실행을 나타내는 객체입니다.
JobInstance와 달리 Job의 성공, 실패 여부와 관련 없이 다른 JobExecution이 생성됩니다.
실패 또한 Job이 한번 실행되었다고(JobInstance 실행) 판단하기 때문입니다.
- JobParameters
JobParameters는 Job이 실행될 때 필요한 파라미터들을 Map 타입으로 저장하는 객체입니다.
JobInstance와 JobParameters는 1:1 관계입니다.
- Step
Step = (Reader -> Processor -> Writer)
하나의 Step에서는 데이터를 읽고, 가공하고, 쓰는 작업을 수행합니다.
설정한 Chunk Size만큼 데이터를 처리하여 기존의 API 처리와는 다르게
실패하여도 해당 Chunk Size에 포함된 데이터가 아닐 경우 데이터 처리가 가능합니다.
xml로 구현한 스프링 배치의 경우 commit-interval로 설정합니다.
- StepExecution
Step 실행 정보를 담는 객체가 있습니다.
Step이 실행될 때 마다 StepExecution이 생성됩니다.
- JobRepository
배치 처리 정보를 담고 있습니다.
Job이 실행되었는지, 언제 끝났는지, 몇번 실행되었는지 메타데이터를 저장합니다.
설정에 따라 메모리에 올릴 수도 있고, DB에 저장할 수도 있습니다.
- JobLauncher
Job, JobParameters와 같이 배치를 실행하는 인터페이스입니다.
최근에 배치 실행 조건을 비동기식 API로 변경한 적이 있는데 API에서 Launcher를 호출하면 API로 동작시킬 수 있습니다.
- ItemReader
데이터를 읽는 기능을 수행합니다.
인터페이스로 읽어온 데이터를 반환하는 역할을 합니다.
Reader에서 읽은 데이터는 processor으로 넘겨줍니다.
스프링 배치가 제공하는 ItemReader를 사용하여 데이터를 읽어올 수 있습니다.
저는 DB 데이터를 처리하는 작업이 많아 주로 JdbcCursorItemReader, JdbcPagingItemReader을 사용했습니다.
Cursor의 경우 데이터를 병렬로 처리할 경우 중복으로 데이터를 읽어갈 수 있습니다.
Paging의 경우 데이터를 병렬로 처리할 수는 있지만 page.size와 chunk.size(commit-interval)의 값이 상이할 경우
데이터를 중복으로 읽어갈 수 있습니다.
그 외에도 다양한 Reader가 있습니다.
docs.spring.io/spring-batch/docs/current/api/org/springframework/batch/item/ItemReader.html
- ItemProcessor
reader에서 읽어온 데이터를 처리 후 다시 writer에 넘겨주는 역할을 합니다.
데이터를 읽어 변경사항 없이 처리한다면 processor를 굳이 사용하지 않아도 무관합니다.
보통 읽어온 데이터의 유효성 검사를 하거나, 필요한 데이터를 추출하거나 가공하는데 사용합니다.
docs.spring.io/spring-batch/docs/current/api/org/springframework/batch/item/ItemProcessor.html
- ItemWriter
processor 또는 reader에서넘겨받은 데이터를 리스트에 저장하다가 chunk.size(commit-interval)만큼 데이터가 적재되면 write를 수행합니다.
DB에 적재하는 작업으로 주로 사용하여 HibernateItemWriter, JdbcBatchItemWriter를 사용했습니다.
docs.spring.io/spring-batch/docs/current/api/org/springframework/batch/item/ItemWriter.html
'- Spring' 카테고리의 다른 글
[JPA] Embeddable, Embedded (0) | 2020.07.16 |
---|---|
[JUnit 5] @TestMethodOrder (0) | 2020.06.25 |
[Spring] 기본개념 및 어노테이션 (0) | 2020.06.21 |
[JUnit 5] Assertion (0) | 2020.06.18 |
[JUnit 5] 기본 (0) | 2020.06.17 |