솔적솔적

윈도우 기반 배치 프로그램 구현 방법 정리(JAVA +Jenkins, NSSM, DB 스케줄러) 본문

카테고리 없음

윈도우 기반 배치 프로그램 구현 방법 정리(JAVA +Jenkins, NSSM, DB 스케줄러)

카드값줘체리 2025. 9. 22. 13:46

개발과 운영을 하다 보면 반복적으로 처리해야 하는 작업들이 꼭 생기는데,

이걸 데이터 적재, 로그 정리, 특정 시간대에만 실행해야 하는 집계 같은 것들이 있다.
이것과 관련된 프로젝트를 하면서 이런 작업들을 자동화할 필요가 있었고,

윈도우 환경에서 배치 프로그램을 구현했던 경험이 있다. 당시 내가 썼던 방법은 크게 세 가지였다.

 

 

1. Java 배치 프로그램 + Jenkins 자동화 배포

처음에는 Java로 배치 프로그램을 만들었다. jar 파일로 빌드해서 Jenkins에 등록해두고, 스케줄링과 배포를 자동화하는 방식이었다.

 

구현하려했던 방식 java spring boot 프러임워크를 이용하여 정한 시간대마다 주기적으로 도는 배치프로그램을 만들고 MSSQL에 접속하여 만들었던 프로시저를 호출하는 방식,

이 접근 방식에 가장 큰 장점은 운영자가 직접 신경쓰지 않아도 정해진 시간에 안정적으로 실행된다는 점,

Jenkins의 스케줄러를 이용해 특정 시간마다 실행되도록 설정해두면 매번 콘솔을 열어 수동으로 실행할 필요없는 장점이 있다.

 

Java로 배치 프로그램을 만들어 Jenkins에 등록하면, 단순히 배포만 자동화되는 게 아니라 실행 주기까지 손쉽게 제어할 수 있다.

 

크게 두 가지 방법으로 나눌 수 있다.

방법1. Jenkins에서 Poll SCM / Build Schedule을 이용해 주기를 정의하는 방법

방법2. 애플리케이션 내부에서 @EnableScheduling + @Scheduled 어노테이션으로 주기를 제어하는 방법

두 방법 모두 “정해진 시간마다 자동 실행”이라는 같은 목적을 갖지만, 동작하는 위치와 성격이 다름.

Jenkins는 빌드·배포 흐름 전체를 통제하는 데 강점이 있고,

Spring Boot 스케줄링은 애플리케이션 내부 로직의 반복 실행에 강하다.

 

상황에 따라 하나만 쓰기도 하고, 필요하다면 두 가지를 조합해 쓰기도 한다.

 

 


 

2. NSSM으로 윈도우 서비스 등록

 NSSM 다운로드

다음으로 시도한 건 NSSM(Non-Sucking Service Manager)이었다. 배치 프로그램을 아예 윈도우 서비스로 등록해버리는 방법이다.

이 방식의 가장 큰 장점은 서버가 재부팅되더라도 자동으로 다시 실행된다는 것.

게다가 Windows Service Manager에서 서비스 상태를 직접 확인하고 재시작할 수 있으니 운영할 때도 마음이 놓였다.

특히 항상 켜져 있어야 하는 프로그램에는 이게 딱 맞았다. 다만 서비스로 돌리다 보니, 문제 발생 시 즉각적으로 로깅/알림이 필요한데, 그 부분은 별도로 보완해야 했다.


 

3. 데이터베이스(DB) 스케줄러 활용

마지막으로는 DB 자체 스케줄러를 활용했다. SQL Server Agent 같은 걸 이용해서 저장 프로시저를 주기적으로 실행하는 방식이다.

이건 주로 데이터 적재나 집계 같은 순수 DB 작업에 정말 잘 맞았다.

애플리케이션 레벨을 거치지 않고 바로 DB에서 실행되니 빠르고 단순했다. 

나는 이 방식을 쓸 때 중복 실행을 막기 위해 상태 테이블을 두고, 실행 로그를 따로 기록했다. 이렇게 해두니 실패 시점이나 재실행 여부를 바로 파악할 수 있어 나름 안정적으로 관리할 수 있었다.

 


정리

배치 시스템을 만드는 방법은 다양했었다. 

근데 여기서 아무거나 그냥 코카콜라맛있다로 고르는게 아니라, 

상황에 따라 Java + Jenkins로 할건지, 윈도우 서비스(NSSM)로 하는게 나은지, DB 스케줄러가 더 적합한지를 각각 쓰거나 조합해야 한다.

  • 데이터 집계나 ETL → DB 스케줄러
  • 외부 API 호출이나 로그 처리 → Java + Jenkins
  • 항상 켜져 있어야 하는 모듈 → NSSM 서비스 등록

이렇게 적절히 섞어서 사용했던 게 가장 좋은 방법이라 생각한다.
돌아보면, 배치 자체는 단순해 보여도 운영 안정성, 알림 체계, 중복 실행 방지 같은 세부 요소들이 훨씬 더 중요하여 로그 관리와 기록 체계도 잘 세워야했었다.