SpringBoot

[SpringBoot] Spring Batch 개념과 간단 예제 -1

Jeong Jeon
반응형

오늘은 정리를 해놓지 않은 Spring Batch에 대해 기록해 두려고 한다.

Scheduler와 함께 일련의 작업을 정해진 로직을 수행하기 위해 많이 사용하며, 대용량 데이터를 핸들링할때 주로 사용된다.

 

스프링 배치가 제공할 수 있는 상황들을 한번 알아보자.

  1. 로깅/추적
  2. 트랜잭션 관리
  3. 작업의 처리와 통계관리
  4. 작업의 실패 후 수동 or 예약 된 재시작

등등 고급스러운 작업을 도와주는 아이이다.

가장 좋은 기능이라고 생각되는것은 작업진행중에 일부 작업이 실패했을때 그 실패 시점을 기록해놓고 다음 재시작을 했을때 실패한 시점부터 다시 실행할 수 있는점..!

 

그렇다면 배치에 대해 간단한 용어부터 알아보도록 하자

 

[ 1. Job ]

Job : 배치처리 과정 객체.  배치 프로세스 상에서 전체 계층 최상단이다.

JobInstance : Job의 실행의 단위. Job 실행시 하나의 JobInstance가 생성된다. 예를 들어 10일~20일치 작업과 20~30일치 작업을 각각 실행시키면, 각각 Instance가 별도로 생성된다. 이때 10일~20일치 작업이 실패한뒤, 다시 해당 Job을 실행시키면 실패한 10일~20일치 작업만 실행된다.

JobParameters : JonInstance를 구별하게 도와주는 JobParameters 객체. 

JobInstacne에 매개변수로도 사용된다. (String, Double, Long, Date 4가지 형식만을 지원)

JobExecution : jobInstance의 실행 객체.  JobInstance 실행에 대한 상태,시작시간, 종료시간, 생성시간 등의 정보를 내포한다.

JobLauncher : 이름과 같이 Job을 실행하는 객체.

JobRepository : 모든 배치 처리 정보를 담고있는 매커니즘. Job이 실행시 JobRepository에 JobExecution과 StepExecution을 생성하고,  JobRepository에 Execution 정보들을 저장하고 조회하여 사용한다.

 

[ 2. Step ]

Step : Job의 순차적인 단계. Job은 최소 1개 이상의 Step이 필수.

StepExecution : Step의 실행 객체. 기본적으로는 이전 단계의 Step이 실패하게 되면 다음 단계가 실행되지 않는다. JobExecution에 저장되는 정보와 함께 read, write, commit, skip 의 각각의 횟수 정보들도 저장된다.

 

[ 3. Item ]

순서대로, Read -> Processor -> Writer로 진행된다고 보자.

ItemReader : Step에서 Item을 읽어오는 인터페이스. 데이터를 읽어놓는..? 아이라고 생각하면 쉽다.

ItemProcessor  : ItemReader에서 읽어놓은 데이터를 처리. 배치의 필수 요소가 아니다. Reader, Writer, Processor 처리를 분리하여 단지 역할만 나눠사용한다고 봐도 무방하다.

ItemWriter : 처리 된 Data를 Writer 할 때 사용. 데이터 가공 이후 Item을 Chunk로 처리한다. 원하는 인터페이스를 사용할수있는데, 예를들어 DB Insert/Update or HttpRequest 등도 상관없다. 

 

ExecutionContext : Job에서 데이터를 공유 할 수 있는 데이터 저장소. 기본적으로 Batch의 JobExecutionContext은 Commit 시점에 정보가 저장되지만, StepExecutionContext는 실행 중간에 저장이 된다. 우리는 Step간 Data 공유가 필요할때 ExecutionContext를 통해 데이터를 사용할 수 있다. 추가적으로 Job 실패시 ExecutionContext를 통한 마지막 실행 값을 재구성 할 수 있다.

 

 

배치를 사용할떄 주의해야 할 점도 있다.

  1. 기본적으로 배치는 기존 서비스와 배치간에 미칠 수 있는 영향을 최소화 해야한다. 쉽게 말해 서비스와는 별도로 백그라운드로 작업하여 기존 서비스는 잘 모르도록 설계하는것이 필요하다.
  2. 대용량 데이터를 컨트롤하기 좋기 때문에, 데이터 베이스 I/O, 네트워크 I/O, 파일 I/O 등의 시스템 리소스의 사용을 최소화하고 한번에 최대한 많은 데이터를 메모리 위에서 처리하도록 사용해야한다.
  3. 데이터 무결성을 위한 대비도 필요하다. (아직 제대로 고려해본적이없다....)

 

[ Spring Batch의 메타 Table ]

Spring Batch가 관리해주는 실행 결과 및 상태 등 작업에 대한 정보를 대신 저장해 주는데, 이때 사용되는 테이블이다.

필수로 넣어두고, 실패한 작업에 대한 정보도 포함하기 때문에 실패후 재시작시 해당 실패 작업만 진행할수있게 하는것이다.

 

 

Batch의 Job을 구성하는 Step , 그 Step을 구성하는 ItemReader, ItemProcessor, ItemWriter 외에도 Tasklet이라는 아이가 있다.

다음글에서 예제와 함께 알아보도록 하자.

 

오늘도 화이팅!

반응형