woniper

누구나 아는 Spring Batch 기본 개념 본문

Spring

누구나 아는 Spring Batch 기본 개념

woniper1 2018. 4. 30. 19:00

Spring Batch를 사용해본 개발자라면 이 포스팅은 볼 필요 없다. Spring Batch의 기본 개념 (레퍼런스 문서에서는 domain이라고 표현한..)을 내 나름대로 정리하는 글이다. 이 글은 Spring Batch가 무엇인지, 왜 사용하는지 설명하지 않는다.

기본 개념

  • Job : Batch에서 실행 가능한 실행 단위.
  • JobLauncher : Job을 실행하는 책임이 있다. JobRepository를 통해 Job, Step, Item* 등을 생성하고 조립.
  • JobRepository : DB 또는 어딘가에 저장된 Job, Step 등을 조회(select) 또는 생성(insert), 수정(update).
  • Step : Job은 1개 이상의 Step을 포함(1:N)할 수 있고, 하나의 큰 실행 단위가 Job이라면 Step은 Job의 통제를 받으며 Job 안에서 실행 가능한 Job보다 작은 실행 단위.
  • ItemReader : 하나의 Step은 0~1개의 ItemReader를 포함하며, 데이터를 어디선가 (DB, file, memory 등) 조회하는 역할.
  • ItemProcessor : 하나의 Step은 0~1개의 ItemProcessor를 포함하며, ItemReader를 통해 조회한 데이터를 중간에서 가공하는 역할.
  • ItemWriter : 하나의 Step은 0~1개의 ItemWriter를 포함하며, ItemProcessor를 통해 가공된 데이터를 Write하는 역할. 이름이 Writer 지만, 쓰기만 가능한 건 아니다.

Step, Item* 은 한 묶음

ItemReader, ItemProcessor, ItemWriterStep에 포함되며, 하나의 묶음이다. Item* 객체가 Step에 반드시 모두 포함되지 않아도 되지만, Batch는 읽고, 가공하고, 쓰고를 기본 동작으로 작동한다.

좀 더 자세한 Job

Job

Job은 여러 개의 Step을 포함하고 있는 객체일 뿐이다. (레퍼런스에는 steps의 컨테이너(container)라고 표현) Job의 구현체인 SimpleJob 필드는 실제로 아래와 같다.

private List<Step> steps = new ArrayList<Step>();

Step List가 선언되어 있는걸 확인할 수 있다.

JobInstance

JobRepository를 통해 조회 또는 생성 되며, Job의 논리적인 실행 단위 객체다. 단순히 job의 nameid를 필드로 선언되어 있을 뿐이다.

JobExecution

JobRepository를 통해 조회 또는 생성 되며, Batch가 Job을 한번 실행할 때마다 생성된다. Job 실행 시 필요한 정보를 아래와 같이 담고있고, 현재 실행되고 있는 Batch의 상태를 BatchStatus에 담고 있다.

자세한 속성 정보는 여기를 보자.

private final JobParameters jobParameters;
private JobInstance jobInstance;
private volatile Collection<StepExecution> stepExecutions = Collections.synchronizedSet(new LinkedHashSet<>());
private volatile BatchStatus status = BatchStatus.STARTING;
private volatile Date startTime = null;
private volatile Date createTime = new Date(System.currentTimeMillis());
private volatile Date endTime = null;
private volatile Date lastUpdated = null;
private volatile ExitStatus exitStatus = ExitStatus.UNKNOWN;
private volatile ExecutionContext executionContext = new ExecutionContext();
private transient volatile List<Throwable> failureExceptions = new CopyOnWriteArrayList<>();
private final String jobConfigurationName;

JobParameter

Job을 실행하는데 필요한 parameter 정보를 key, value 형태로 담고있다.

JobRepository(SimpleRepository)

설명을 위해 JobRepository interface의 구현체인 SimpleRepository를 diagram에 포함했다. SimpleJobRepository는 JdbcTemplate을 통해

  • JobInstance
  • JobExecution
  • JobExecutionParameter
  • StepExecution

등을 저장하고 조회한다.

Spring Batch에서 기본 구현체들은 대부분 Simple* prefix name을 사용한다.

좀 더 자세한 Step

Step

하나의 Job은 여러 개의 Step을 포함할 수 있다. Step은 말 그대로 단계를 정의할 수 있는 객체이며, 이 Step에서 실제 Batch Job을 처리하는 작업의 일부 또는 전체를 수행한다. Job이 여러 개의 Step을 포함할 수 있다는 의미는 여러 가지 단계를 거쳐 Batch Job을 처리할 수 있다는 의미다. 위에 설명했지만, Step은 ItemReader, ItemProcessor, ItemWriter를 포함한다.

StepExecution

JobExecution는 Job의 상태와 Job을 실행하기 위한 속성을 포함하고 있었다면, StepExecution은 Step의 상태와 Step을 실행하기 위한 속성을 포함하고 있다. StepExecution도 마찬가지로 속성 정보를 자세히 설명한 문서를 보자.

StepBuilder, SimpleStepBuilder

Step을 생성하기 위한 클래스다. Step을 생성하는데 필요한 Item*과 그 외 여러 가지 속성들을 주입해 생성한다.

ItemReader

Step에 포함되며, 데이터 읽기를 책임진다.

ItemProcessor

Step에 포함되며, ItemReader로 읽은 데이터를 가공한다.

ItemWriter

Step에 포함되며, ItemReader로 읽고, ItemProcessor로 가공된 후 ItemWriter로 전달돼 쓰여진다. 여기서 쓰기는 단순히 데이터를 저장(insert)하는 역할 뿐 아니라 읽고, 가공된 데이터의 후처리를 의미한다.

참고

The Domain Language of Batch

Comments