오늘은 Spring batch 에 대해서 적어 보려고 한다.
Spring batch
결론적으로 Spring 기반의 배치 작업을 구성할 수 있는 프레임워크이다.
Spring batch 특징
스케줄링과 같은 특징은 Spring batch 를 사용할 땐 보통 Scheduled 와 Quartz 를 사용한다고 생각하는게 좋을것 같다,
Spring batch 가 직접 적으로 주기적 실행을 제공하는것 같진 않아서 이다.
에러처리와 장애 복구 관련된 특징은 Spring batch 를 사용할 때 필요한 메타데이터 와 관련된 특징 으로 밑에서 살펴 보도록 하겠다.
일괄처리 방법
스프링 배치 일괄처리 방법은 간단하게 그림으로 살펴 보자면 Step은 하나의 작업이라고 생각하고 이러한 Step 여러개의 한 단위를 Job 이라고 생각하면 될것 같다.
그리고 Step 을 구현하는 방법엔 Tasklet 과 Reader, Writer 을 함께 사용하는 것이 있다.
Spring batch 메타 데이터
메타 데이터는 위와같은 데이터의 정보를 데이터로 가지고 있는 테이블을 말하는데 Spring batch 를 사용하는 이유가 이것 때문인것 같은 생각이 든다.
앞선 내용 중 예외 처리와 장애 복구 내용을 다시 생각해 보면 위의 메타데이터의 어떤 Job, Step 이 있는지 와 이전에 실행한 Job 데이터, 실행된 Job 의 성공 여부 마지막으로 다시 실행 한다면 어디서 부터 실행할지 와 같은 메타 데이터로 로직을 구현할 수 있겠다고 생각 되어진다.
JOB_INSTANCE
JOB_EXECUTION
BATCH_STEP_EXECUTION
좀더 자세히 어떤 정보를 담고 있는지 살펴보면 위의 정보와 같다.
Spring batch 구현 코드
해당 코드는 Job 과 Step 을 생성하는 것으로 두개의 Step 을 생성하고 Job 에 배정 하는 과정으로 여기서 JobRepository 는 메타데이터가 저장되어 있는 곳이고 Tasklet 은 해당 Step 의 로직을 작성 하는 곳이다.
다음은 Step 에서 동작할 로직을 Tasklet 방법을 사용해 구현한 것으로 테이블에서 데이터를 불러오고 특정 조건을 총족하는 데이터를 변환하는 작업을 구현할 수 있다.
Tasklet 의 execute 를 오버라이드 해서 구현할 수 있다.
활동을 모집하고 간단한 채팅을 나눌 수 있는 프로젝트를 구현 했을 때 게시글과 채팅방의 활성화를 비활성화 상태로 만들어 줘야하는 상황에 해당 게시글의 시간 데이터와 현재 시간 데이터를 활용해 현재 시간보다 지난 게시글 과 채팅방을 비활성화 함으로 써 사용자들의 접근을 막았다.
마지막으로 해당 Job 을 Spring scheduled 를 사용해 반복 주기를 설정 해주면 Spring batch 는 해당 작업을 설정된 주기 로 반복 실행 한다.
Spring batch 를 사용하는 이유
Spring batch 를 적용한다고 해서 쿼리 성능이 빨리지는 것은 아닌것 같고 이해도에 따른 효율적인 작업 처리 로직에 따라 데이터 처리의 성능이 달린것 같다.
하지만 데이터 처리에 대한 구조를 제공해 줌으로 해당 구조를 깊게 이해하고 사용한다면 대용량 데이터 처리 로직을 효율적으로 구현할 수 있을것 같고 메타데이터를 활용한 데이터 처리 상태를 추적해서 상태에 맞는 처리가 가능한 로직을 구현한다면 좋은 기술 스택이 될것 같다
마무리
Spring batch의 한 부분인 Tasklet 을 사용한 간단한 데이터 처리 로직으로 사용 했지만 계속 이해하며 ItemReader, ItemProcessor, ItemWrite 를 활용한 대용량 데이터 처리 로직을 구현해볼 예정이다.