Spring

스프링 배치

yoon9 2022. 11. 23. 21:51

 

스프링 배치에 대하여 정리하는 글을 가져보도록 합니다...

정리를 하는 글이며.. 틀릴 수가 있으니 어느 정도 감안하시며 보시는 걸 추천합니다.

작성된 코드는  github 에서 볼 수 있습니다

 

 

스프링 배치를 도입하는 경우는 (아무래도 모든 시스템에 배치시스템이 적용되지 않았을까.. 생각이 든다)

  • 기본적으로 프로그램에서 큰 단위의 작업을 일괄처리를 해야 하는 경우.
  • 실시간을 필요로 하지 않는 경우의 작업에 사용된다 ex) 통계, 정산 등등..
  • 컴퓨터 자원을 최대로 활용을 한다. 비교적 사용자가 적은 즉 자원 사용량이 적은 시간대에 사용을 하여서 이용한다.
  • 사용자가 직접 실행이 아닌 스케줄러를 이용하여 실행한다 ex) 매일 오후 4시 실행, 매달 1일 실행, N분 간격으로 실행 등등.. 

위에 사진을 참고하여서 

일단 jobLancher job을 실행시킬 수 있으며 job은 배치의 실행 단위입니다.

jobInstance의 생성 기준은 jobParameters의 중복 여부이다.

job을 실행할 때는 parameter 가 필요한데 동일한 파라미터가 오면 재실행 대상인 job이면 다시 재실행을 해주며,

재실행 대상이 아닌 완료된 job이면 jobInstance를 생성하지 않는다.

 

하나의 job에는 N개의 step이 존재할 수 있으며, 흐름을 관리할 수 있다.

스프링 배치는 크게 tasklet 방식과 chunk방식이 있다.

간단하게 한방에 처리를 하는 경우는 tasklet방식이 있고, 3단계로 나눠서 처리를 하는 chunk방식이 있다.

 

tasklet에서는  읽고, 처리, 쓰기 가 한방에 처리가 되지만 chunk에서는 나눠서 한다는 뜻이다.

대부분에 배치시스템은 대용량일 경우가 대부분이기 때문에 chunk base로 공부를 하였습니다.

chunk기반 step

  • ItemReader로 배치 처리 대상의 객체를 읽어, ex) DB, file 등등.. ItemProcessor나 ItemWriter에게 전달을 합니다.
  • ItemProcessor는 읽어온 객체를 원하는 객체로 변경을 하거나 필터링을 하는 역할이다 (사실 writer에서도 가능하지만  역할분담을 위해 사용.)
  • ItemWriter는 DB에 insert 및 update 등 사용자에게 단체 알림 등등 처리를 구현하면 된다. 
  •  

tasklet이 대용량을 감당하기엔 부하를 감당하기가 쉽지 않을 것이고, 그렇다고 chunk처럼 할 수 없는 것은 아니지만 가독성면에서 떨어지기 때문에 권장하지 않으며.. 오히려 필자는 딱딱.. 영역을 구분지어서 작업을 할 수 있어서 단순하다는 tasklet보다 더 편리하게 사용할 수 있었습니다.

 

 

예를 들어보자 개발자가 회원들의 월별 매출량에 맞게 등급을 지정하여 회원들에게 포인트를 제공하는 배치시스템을 만들어 본다고 한다.

 

하나의 job에 두 가지 step 존재한다

첫 번째 step에는 회원들의 월별 매출량을 조회를 하고 일정 금액의 규칙에 맞게 등급을 지정한다.

두 번째로 step에는 회원들의 등급에 맞게 포인트를 지급을 해준다.

 

이 위의 두 가지 step도 두 가지의 job으로 나눌 수 있다고 생각하는데 연관성이 아예 없다고는 보지 않아서 하나의 job에 넣었다.

첫 번째의 step이 끝나지 않으면..  두 번째의 step을 실행을 하지 않도록 설계를 하였습니다.

등급에 맞게 포인트를 지급해줘야 하는데 등급을 지정하는 step에서 실행이 실패하면.. 두 번째 step은 알맞은 포인트가 지급이 안된다고 봅니다.

 

그리고 추가로 job에 대한 META-DATA를 저장한다. 이것은 배치 실행에 대한 정보들이 담겨 있으면서, 스프링이 참고하여 job을 실행한다.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-batch</artifactId>
</dependency>

위에 의존성을 추가를 해주면 library에. sql 파일들이 각각 제공되어있다. h2db를 사용하지 않을 경우에는 따로 구축을 해줘야 하며, h2db를 사용 시에는 자동으로 스프링이 만든다.

 

 

이러한 META-DATA들이 있어서 배치의 장점을 잘 사용하는 것 같다. 50000만 개의 데이터를 1000개씩 나누어서 

배치 처리를 하는데 40000만 번째에 실패를 할 경우에는 다시 처음부터 하는 것이 아니라 실패 지점으로부터 다시 시작을 한다.. 엄청난 장점이다

 

 

 

chunk Step을 input과 output을 정할 수 있다.

reader에서 input를 정하고 processor에서 가공 및 필터링을 하며 writer가 output를 정한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

스프링 배치에는 크게 jpa, jdbc, mybatis를 제공해준다.

  • itemReader는 cursor기반이 있고, Paging기반이 있다.
  • cursor기반은 해당 배치 처리 시작부터 끝날 때까지 connection을 유지를 한다.(connection빈도가 적다) 
  • 한 번의 connection에 모든 것을 처리하기에 thread-safe하지가 않다.
  • paging기반
  • 개발자 설정에 맞춰 페이징 개수를 정하여 페이징 개수에 맞게 connection을 연결을 하며 조회를 한다.
  • cursor 기반과 달리 connetion연결 시간이 짧으나, 빈도가 잦다. ->(thread-safe 하다.)
  • 스프링 배치에 제공되는 성능개선을 위해서는 thread-safe를 필요로 하니 paging기반 조회를 이용하는 것을 권장