🍎 시스템 내부에서 반복적인 작업을 처리해 줄 도구를 고를 때 어떤 부분을 고려하면 좋을 지 정리합니다.
🍏 의사 결정이 필요하게 된 이유
- 공공데이터를 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
'Dev' 카테고리의 다른 글
모듈을 만들 때 염두에 두어야 할 점 (0) | 2025.04.07 |
---|---|
원자성 보장 코드에서? DB에서? (0) | 2025.03.18 |
[Dev] 프로세스 메모리 할당과 JVM (3) | 2024.11.12 |
[Dev] 서버 클라이언트 사이 버전을 관리하는 방법 (2) | 2024.10.16 |
Enum을 사용할 때 생각해봐야할 점 (2) | 2024.09.26 |