개요

Batch 작업의 수동 트리거, 작업 모니터링을 구현한 작업을 정리해보았습니다.

Batch 작업이 어떻게 수행되고 있었는가?

Spring Batch Framework로 로직이 구현되고, Spring Scheduler를 통해 구동되는 형태로 동작했습니다.

이는 다음과 같은 문제점이 있었습니다.

  • 실패 지점부터 재시도할 수 없는 구조
  • 재시도 시의 멱등성을 보장할 수 없는 구조
  • 재시도 진입점이 API이나, UI가 제공되지 않는 구조
  • 실행 여부, 성공 여부, 작업 수행 과정을 알 수 없는 구조

이 중에서 재시도 시의 멱등성이나, 실패 지점에서의 재시도는 구현방식의 변화가 예상되었습니다.

따라서 비교적 변경 범위가 적은 재시도 진입점과 관제 문제 먼저 해결해보기로 했습니다.

고민 과정 - 실행 과정에 대한 관제

기존 배치 작업은 다음과 같은 문제가 있었습니다.

  • 실행 주체가 Spring Scheduler이고, 과정, 결과를 볼 수 있는 UI가 없다.
  • 수동 실행은 API로 제공되나, UI 진입점은 없다.

둘 모두 명확하게 관리자가 시각적으로 관리할 수 없는 Black Box 구조였습니다.

이런 Black Box 구조로 인해서 일일 점검이나, 배치 실패 인지에 대한 어려움이 지속되었기 때문에, 시각적으로 관리 가능하고 작동 과정이 보이는 White Box 영역으로 이를 끌어올리기로 결정하였습니다.

이를 해결하기 위해서 3가지 정도의 아이디어를 냈습니다.

  1. 내부 관리자 시스템에 UI 및 수동 실행 진입점 구현
  2. 완전히 새로운 배치 대시보드 구현
  3. Jenkins 사용

각 선택지의 장단점은 다음과 같았습니다.

  1. 내부 관리자 시스템에 해당 과정을 구현하기
    • 장점
      • 관리 포인트가 감소합니다.
      • 추가적인 모듈 생성을 막을 수 있습니다.
    • 단점
      • 기존 내부 관리자 시스템과 다소 이질적인 기능입니다.
      • UI와 로직을 모두 1에서 부터 구현해야 합니다.
  2. 새로운 배치 대시보드 구현
    • 장점
      • 내부 관리자 모듈에 추가하는 방식에 비해 독립적 운영이 가능합니다.
    • 단점
      • UI와 로직을 모두 1에서 부터 구현해야 합니다.
      • 추가적인 서버 비용이 요구되어 사측에서 거부당할 수 있습니다.
  3. Jenkins 사용하기
    • 장점
      • 내부 관리자 모듈에 추가하는 방식에 비해 독립적 운영이 가능합니다.
      • UI 구현없이 수동 트리거 지점 마련이 가능합니다.
    • 단점
      • 기존 동작과 다소 이질적인 기능입니다.

위와 같은 지점을 고려했을 때, Front 개발자가 따로 존재하지 않고, 서버 자원이 충분하지 않은 조직 특성상 UI 구현이나, 서버 자원을 추가로 사용하는 1, 2번 방식 대신 3번 방식을 채택하기로 하였습니다.

실제 구현

Spring Batch Application

기존 배치는 Blocking 방식 실행으로, API를 통해 배치를 실행시키면 작업 종료까지 Connection이 유지되는 형태였습니다.

이 방식으로 Jenkins에서 실행 -> 대기 -> 종료 방식으로 수행하게되면 작업의 중간 과정을 알아야한다는 요구사항을 충족할 수 없었기 때문에, 별도 스레드에 실행을 던지고, 작업의 식별자인 ExecutionId만 반환하도록 구조를 변경했습니다.

그리고 기존에는 작업의 중간 과정이나, 작업의 최종 결과를 제공하는 API가 없었기 때문에 이를 구현하였습니다.

Jenkins Pipeline

Jenkins에서는 다음과 같은 파이프라인을 구현했습니다.

  • 작업 실행 트리거 (ExecutionId 정보 기록)
  • ExecutionId 기반 중간 상태 조회 (Polling)
  • ExecutionId 기반 최종 결과 조회

위 파이프라인을 Jenkins 내부의 Cron Scheduler로 트리거 되도록 하여 기존과 같은 주기적 실행을 구현하였습니다.

또한, Jenkins가 제공하는 실행 버튼을 수동 진입점 UI로 사용하여 수동 실행 기능또한 제공하도록 하였습니다.

정리

실행 주체를 Jenkins로 전환하는 방식을 통해서 다음과 같은 이점을 얻었습니다.

  • 전체 작업 성공 여부를 한 눈에 볼 수 있는 UI 제공
  • 작업별 실행 이력 관리
  • 작업별 수동 실행 진입점 제공

이를 통해서 Postman이나 Curl 명령어로 실행한 후, 서버 로그를 관제하는 방식으로 수동 실행을 진행하는 번거로운 과정을 버튼 클릭 한 번으로 간소화하였습니다.

또한, 배치 담당자의 배치 점검 시간이 5~10분에서 1분 대로 감소하게 되었습니다.