중고물품 블라인드 경매라는 컨셉으로 프로젝트를 진행하고 있던 중에 경매가 마감되었을 때
자동으로 서버에서 특정 처리를 해야 하는 서비스 요구사항이 발생하였다.
이를 해결하기 위해 Quartz라는 오픈소스 스케줄러 라이브러리를 도입하였다.
Quartz란?
들어가기에 앞서 간단하게 Quartz에 대해 설명하자면
Quartz는 특정 작업(Job)을 원하는 시점(Trigger)에 자동으로 실행할 수 있도록 지원하는 오픈소스 스케줄러 라이브러리라이브러리이다.
Quartz를 사용한 이유
프로젝트의 입찰 서비스를 크게 보면 위와 같은 과정을 거친다.
일반적으로 경매라고 하면 실시간으로 이루어지며 더 이상 높은 가격으로 입찰을 원하는 사용자가 없을 경우 경매가 마감되게 된다.
하지만 우리 서비스는 블라인드 입찰 시스템으로 경매가 마감되는 기준은 판매자가 설정한 경매마감 시각이다.
따라서 경매마감 시각이 되었을 때 아래와 같은 특정 작업을 처리해야 하는 필요성이 있었다.
이번 프로젝트에서의 경매 마감시 이루어지는 작업을 보면 먼저 물품의 상태값을 변경해야 한다. (입찰 중 -> 입찰 마감)
그리고 판매자와 낙찰자 간의 1대 1 채팅방을 자동으로 생성하여 제공해야 한다.
또한 낙찰자와 판매자뿐만 아니라 입찰에 참여한 모든 사용자에게 FCM을 통해 알림을 보내야 했다.
단순 특정 시각에 특정 작업을 하는 것은 기본적으로 Spring에서 제공되는 스케줄러로도 가능하지만
우리 서비스는 독립적으로 각각의 물품마다 마감시각을 기준으로 위 작업들을 수행해야 했고,
이를 구현하기에 Spring에서 기본으로 제공하는 스케줄러는 부적합하다고 판단했다.
기능 | Spring Task Scheduler | Quartz Scheduler |
설정 난이도 | 간단 | 복잡 |
기본 제공 Cron 표현식 지원 | O | O |
고급 스케줄링 | 제한적 | 다양함 (Trigger/Job 분리 등) |
작업 상태 영구 저장 | 불가능 | 가능 (DB 사용) |
분산 환경 지원 | 불가능 | 가능 (클러스터링) |
재시도 및 장애 복구 | 제한적 | 지원 |
사용 사례 | 단순 반복 작업, 기본적인 스케줄 | 복잡한 스케줄, 분산 시스템 |
간단하게 Spring에서 기본적으로 제공하는 스케줄러와 Quartz를 비교하는 표를 살펴보면 위와 같다.
여기서 가장 중요하게 생각한 것은 시각을 기준으로 트리거를 설정할 수 있고 이를 수정 및 삭제할 수 있어야 한다는 것
그리고 입찰 시스템은 우리 서비스의 핵심 비즈니스 로직이기 때문에 서버장애가 일어나도 Trigger와 Job을 복구할 수 있어야 한다는 것
이었다. 이런 것들을 따져보았을 때 Quartz는 우리 서비스에 매우 잘 맞는 라이브러리였다.
Quartz를 어떻게 이용했는가
Quartz를 활용한 입찰 마감 시의 플로우를 간단히 표현해 보았다.
우리 서비스에서는 물품을 등록할 때 설정했던 마감시각을 수정하거나 조기마감이라는 기능을 이용해 마감시각을 단축시킬 수 있다.
또한 올린 물품을 삭제할 수도 있기 때문에 Trigger를 수정하거나 삭제할 수 있는 Quartz가 매우 용이했다.
또한 모종의 이유로 서버가 재실행되어도 MySQL에 저장되어 있는 Trigger&Job을 불러올 수 있기 때문에
안정적으로 입찰 시스템을 구현할 수 있었다.
'Project' 카테고리의 다른 글
WebSocket HTTP Connection 문제 해결하기 (0) | 2025.03.05 |
---|---|
Redis를 이용하여 최근 조회수 기반 인기공연 제공하기 (0) | 2025.02.27 |
Embeddis Redis 적용하기(feat. M1) (0) | 2024.11.05 |