Dev

[Tip] @Scheduled 와 Cron 어떤 것을 선택해야할까?

친환경사과 2025. 3. 4. 23:22

🍎 시스템 내부에서 반복적인 작업을 처리해 줄 도구를 고를 때 어떤 부분을 고려하면 좋을 지 정리합니다.


🍏 의사 결정이 필요하게 된 이유

- 공공데이터를 3분에 한 번 API 호출하여 갱신된 Raw Data를 가져와야 하는 요구 사항 존재

- 반복 요청을 OpenAPI Server에 전달해야하는데 어떤 도구를 사용해야할지 고민

 

🍏 다룰 수 있는 도구 중 Schedule 기능을 제공해주는 도구

- Spring Scheduler (@Scheduled)

@Service
class TestService {

	@Scheduled(cron = "0 */3 * * * *")  // 매 3분마다 실행 (초, 분, 시, 일, 월, 요일)
    fun executeTask() {
        println("TestService 실행됨: ${LocalDateTime.now()}")
    }
}

 

    - Spring에서 제공하는 @Scheduled자동으로 일정한 시간 간격마다 메서드를 실행하도록 해주는 스케쥴링 기능 제공

    - @Scheduled는 단일 스레드에서 실행되기 때문에 "하나의 작업이 실행 중이라면 해당 작업이 끝나기 전까지 다음 예약된 작업이 실행되지 않습니다."

    - @Async를 이용한다면 실행 시간이 오래 걸려 정확한 시간 (ex, 매 3분마다)에 다중 스레드를 활용해 이전 작업이 끝나지 않아도 새로운 작업을 실행 가능

 

- Linux Cron

crontab -e # Vi/Vim editor를 통한 cron 작업 설정
*/3 * * * * /path/to/script.sh # corn schedule 추가

sudo systemctl start cron    # cron 시작
sudo systemctl enable cron   # 부팅 시 자동 시작

 

    - cron은 Linux에서 특정 시간 간격마다 자동으로 작업을 실행하는 스케쥴러(프로그램)이며 Background Demon을 실행됨

    - cron의 작업은 crontab이라는 파일에 저장되며 사용자가 원하는 작업을 등록할 수 있음

 

❓ 두 가지의 도구에서 어떤 것을 선택해야 할까?

- 애플리케이션에서 반복적인 작업을 수행하는 방법으로 Linux Cron을 선택했습니다.

 

- 처음에는 @Scheduled도 고려했지만, API 서버 내부에서 사용할 경우 별도의 저장소 없이 간편하게 작업을 정의할 수 있다는 장점이 있었습니다. 그러나, @Scheduled가 존재하는 API 서버가 다운되면 Raw Data를 수집하는 기능도 함께 중단되는 문제가 발생합니다.

 

- 하지만 다루는 데이터는 단순한 Raw Data가 아니라 내부 비즈니스 요구에 맞게 정제된 정보입니다. 즉, 데이터 수집 자체가 서비스의 핵심이 아니라는 점을 고려해야 했습니다.

 

- 따라서, 비즈니스 API 서버와 Raw Data 수집 기능의 역할을 분리하기 위해 @Scheduled가 아닌 Linux Cron을 사용하여 반복 작업을 처리하기로 결정했습니다. 이렇게 함으로써 API 서버의 상태와 관계없이 데이터 수집 기능이 독립적으로 안정적으로 실행될 수 있습니다.

 

p.s) Cron에서 실행하는 Process는 Spring Batch Job입니다.

 


📚 Reference

 

Getting Started | Scheduling Tasks

Although scheduled tasks can be embedded in web applications, the simpler approach (shown in this guide) creates a standalone application. To do so, package everything in a single, executable JAR file, driven by a Java main() method. The following snippet

spring.io

 

 

crontab(5) - Linux manual page

crontab(5) — Linux manual page CRONTAB(5) File Formats CRONTAB(5) NAME         top crontab - files used to schedule the execution of programs DESCRIPTION         top A crontab file contains instructions for the cron(8) daemon in the following sim

man7.org