[SpringFW] Spring Batch 간단 정리





서론

스프링 배치를 동작시키기 위한 코드구현보다는 개념에 대해서만 짧막하게 이야기하려고 합니다.




1. 스프링 배치란 무엇인가?

  1. 엔터프라이즈급 어플리케이션에서 주로 사용되며, 데이터 및 작업의 대용량처리를 위한 프레임워크입니다. 대용량처리를 위한 로깅, 트랜잭션관리, 작업통계, 재시작, 오류 데이터 처리 등을 Spring Batch 프레임워크가 지원해주며, 개발자는 비즈니스로직에 집중할 수 있도록 도와주는 툴이라고 생각하면 됩니다.

  1. 스프링 배치는 스케줄러와 다른 개념입니다. 스프링 배치는 Batch Job을 관리하지만 Job 실행을 시키는 기능은 지원하지 않습니다. 스프링 배치는 스케줄러를 대체하는 것이 아니라 스케줄러와 함께 작동하도록 설계되었습니다.




2. 스프링 배치는 언제 사용하는가?

  1. 스프링 배치의 가장 일반적인 사용케이스는 읽기(item reader), 가공(item processor), 쓰기(item writer) 처리입니다. 예를 들어, 유저의 접속시간 통계를 매일매일 수집하고 싶다거나, 매일매일 가입/탈퇴한 유저의 수를 수집하고 싶다거나 등 아주 많은 경우가 해당될 것입니다. 기업 입장에서는 여러 데이터를 이용해 기업전략수립에 도움이 되는 통계 데이터들을 스프링 배치를 이용해 간단히 수집할 수 있게 됩니다.

  1. 시간 기반 서비스에도 적합할 것입니다. 예를 들면, 아직 금액을 납부하지 않은 유저에게 월말에 이메일전송을 한다는 등의 매월 혹은 매년 반복되는 비즈니스 서비스 개발에도 스프링 배치는 적합할 것 같습니다.

  1. 데이터마이그레이션에도 사용할 수 있습니다. 커밋횟수 측정, 안정적인 롤백 지원 등 데이터 마이그레이션을 위한 일회성 솔루션을 만들기에도 적합합니다.




3. 어떤 방식이 존재하는가?

  • Task를 처리하는 관점에서 두가지 방식이 있습니다. tasklet 방식과 chunk 지향 프로세싱인데, 간단히 요약하자면 각각 tasklet 방식은 단일작업에 유리, chunk 지향 방식은 다중task/복잡한 작업에 유리 하다고 봅니다.


3-1. tasklet 방식

  1. 데이터 처리 과정(read,process,write)이 tasklet안에서 한번에 이뤄집니다.

  1. 간편하게 구현할 수 있지만, 데이터량이 늘어난다거나 step이 많은 경우 구현이 복잡하고 오류처리에 애를 먹을 수 있습니다.


3-2. chunk 지향 방식

  1. chunk size 단위로 데이터가 페이징처럼 처리됩니다.

  1. 위에서 소개한 것처럼 대용량 데이터 처리, step이 많은 복잡한 경우에 적합합니다.

  1. reader, processor, writer로 구분되어 처리됩니다.

  1. 청크끼리는 독립적이며 한 청크내에서의 실패가 다른 청크에게 영향을 끼치지 않습니다.

  1. 청크만큼만 트랜잭션 시간을 가져가기 때문에 트랜잭션 시간을 짧게 가져갈 수 있습니다. 트랜잭션 시간이 길수록 예기치못한 데드락 혹은 각종 timeout으로 인한 네트워크 장애, DB idle time 초과 등에 tasklet에 비하여 효과적으로 대응할 수 있을것입니다.




4. 무엇을 주의해야하는가?

  1. 대용량 처리로 인한 I/O 사용을 최소화 하여야 합니다. 또한 잦은 I/O로 인해 데이터베이스 커넥션, 네트워크 비용이 커지면 오히려 성능에 영향을 줄 수 있습니다.

  1. 배치동작으로 인해 다른 서비스들 혹은 다른 인프라들이 영향을 받지는 않는지, 인프라적으로도 점검이 필요 합니다.

  1. 배치가 동작하지 않았거나 혹은 일부의 데이터가 실패했을 경우를 위한 대책이 필요합니다. Skip이라든지 Retry를 통해 배치가 동작하지 않는 경우를 대비해야하며, 처리되지 못한 Skip 데이터에 대한 처리도 고려해야 합니다. 실제로 저는 반드시 동작해야 할 스프링 배치가 긴 시간 동안 동작하지 않았던 사실을 뒤늦게 알아차려서(젠킨스 잡에 FAIL, UNSTABLE 웹훅을 걸어놓았으나 어떠한 이유(?)로 동작하지 않음) 서비스 운영에 큰 오점을 남긴 경험이 있습니다. (울고싶다)

  1. 아직까지는 Spring WebFlux와 같은 리액티브 스트림을 지원하지 않는 것으로 알고 있습니다. 아무래도 데이터의 무한한 처리를 위한 리액티브 스트림과 일정한 크기의 데이터를 일괄처리하는 스프링 배치의 성격이 맞지 않는게 아닌가 하고 추측만 해봅니다.




참고사이트 :

https://docs.spring.io/spring-batch/docs/current/reference/html/index.html
https://velog.io/@gkskaks1004/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98%EC%9D%98-Tasklet-%EB%B0%A9%EC%8B%9D%EA%B3%BC-Chunk-Tasklet-%EB%B0%A9%EC%8B%9D
https://khj93.tistory.com/entry/Spring-Batch%EB%9E%80-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

읽어주셔서 감사합니다.🖐


Written byRamsbaby
이 블로그는 직접 개발/운영하는 블로그이므로 당신을 불쾌하게 만드는 불필요한 광고가 없습니다.

#My Github#My Portfolio#Blog OpenSource Github#Blog OpenSource Demo Site