본 포스팅은 아래의 내용을 대충 한글화 하는데 초점을 맞췄다.

https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-1-the-basics/

본문 내 모든 이미지는 위 링크에서 참조하였다.



Spring Batch에서 생각해야 할 Transaction 개념에 대해 정리해 본다.


일반적인 어플리케이션의 경우 사용자의 액션을 기준으로 하나의 액션에 하나의 트랜잭션을 생각하면 된다. 하지만 배치 어플리케이션의 경우에는 다량의 데이터를 처리하는 배치 전체 프로세스를 트랜잭션으로 묶게 되면 데이터베이스에 무리가 될 수 있기 때문에 중간에 작업 데이터에 대한 커밋이 일어나야 한다. 만약 배치를 재실행해야 하거나 수동으로 실행해야 하는 등의 기능이 제공되어야 할 경우에는 중간에 이미 커밋된 데이터에 대해 어떻게 처리해야 할지 생각해 봐야 한다.


이하 설명은 단일 쓰레드로 이루어진 Chunk Oriented Processing에 대해 진행한다.


Chunk Oriented Steps



Chunk Oriented Processing Step은 다음과 같다.

  1. ItemReader는 item이 없을 때 까지 하나씩 item을 어딘가에서 read 한다.
  2. ItemProcessor는 item 각각에 대해 특정 process를 진행한다.
  3. ItemWriter는 item list를 받아 어딘가로 write한다.

배치 프로세스는 Chunk 단위로 구분되며 이 Chunk단위로 하나의 트랜젝션이 형성된다. exception이 발생할 경우, 해당 Chunk는 롤백이 된다. 당연히 이전에 커밋한 Chunk는 완료된 상태가 유지된다. Chunk 단위는 CompletionPolicy에 의해 결정되며 그림 속의 1번과 같이 read 단계에서 CompletionPolicy 조건이 만족될 경우 item이 남아있더라도 하나의 Chunk 단위로 묶여 다음 단계인 process 단계로 넘어가게 된다.

CompletionPolicy는 다음과 같이 설정할 수 있다.

  • commit-interval 속성을 설정할 경우, SimpleCompletionPolicy가 적용되며, 지정한 갯수의 item이 chunk단위로 묶인다.
  • CompletionPolicy에 chunk-completion-policy 속성을 지정하여 추가로 커스터마이징 할 수도 있다.

Business data and batch job data



Spring Batch는 기본적으로 몇몇 table definition을 제공한다. 이 곳에는 배치 히스토리 관리나 배치 프로세스 재시작에 이용될 수 있는 job, step, 실행 context가 저장된다. 배치 프로세스 상에서 저장되는 부분은 위 그림에 표시되어 있다. 이러한 정보를 Business data가 들어있는 DB와는 다른 별도의 DB에 저장할 수 있지만, JtaTransactionManager, DataSources등을 따로 지정해줘야 하고, 각각의 DB에 연결해야 하는 성능상 이슈 등이 발생할 수 있으므로 보통 추천하지는 않는다.


A Failted Batch

배치가 실패했을 경우를 좀 더 자세히 살펴보면 다음과 같다.



Chunk 단위 내에서 exception이 발생할 경우 rollback이 발생하고 해당 step 및 해당 batch job은 fail상태로 기록된다. job data 기록부분은 별도의 transaction으로 묶여있기 때문에 기록이 가능하다. 만약 특정 exception의 경우 무시하고 진행하길 원할 경우 아래처럼 no-rollback-exception-class에 해당 exception을 등록해 주면 된다.


<batch:tasklet>
  <batch:chunk ... />
  <batch:no-rollback-exception-classes>
    <batch:include class="some.ignoreable.MyRuntimeException"/>
  </batch:no-rollback-exception-classes>
</batch:tasklet>


Transaction Attributes

각 transaction에 대해 지정할 수 있는 속성은 다음과 같다.

  • Propagation Type ( 기본 : REQUIRED)
  • Isolation Level ( 기본 : DEFAULT)
  • Timeout
<batch:tasklet>
  <batch:transaction-attributes isolation="READ_COMMITTED" propagation="REQUIRES_NEW" timeout="200"/>
  <batch:chunk reader="myItemReader" writer="myItemWriter" commit-interval="20"/>
</batch:tasklet>


Posted by 제리곰
,