UMS DBPitcher는 외부 시스템의 발송요청을 데이터베이스에서 Polling하여 UMS(Unified Message Service)로 전송하는 메시지 중개 시스템입니다.
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Legacy System │────▶│ UMS DBPitcher │────▶│ UMS Server │
│ (발송요청 DB) │ │ (중개 시스템) │ │ (푸시/카톡/SMS)│
└─────────────────┘ └──────────────────┘ └─────────────────┘
| 구분 |
설명 |
| ums-dbpitcher-core |
코어 라이브러리 (3.6.1.1-SNAPSHOT) - 실제 메시지 발송 로직 |
| ums-dbpitcher-custom |
커스텀 프로젝트 - 이 프로젝트로 DAO 및 설정 커스터마이징 |
graph TD
A[DBPitcherMain] --> B[ApplicationConfig]
A --> C[CustomLoadConfig]
B --> D[UMS DB DataSource]
B --> E[Legacy DB DataSource]
C --> F[config.xml]
C --> G[customConfig.xml]
A --> H[DBPitcherCoreMain]
H --> I[UmsWorkerManager]
H --> J[FileqWorkerManager]
H --> K[UmsCompletManager]
호출 위치: UmsDBFetcherThread.java (line 66)
// UmsDBFetcherThread.java:66
List<UmsWorkBean> pitcherWorkBeanList = umsPitcherDao.selPitcherMsg(LAST_GET_PITCHER_SEQNO);
| 구분 |
내용 |
| 스레드명 |
UmsDBFetcherThread |
| 역할 |
Legacy DB에서 미처리 발송요청 데이터를 주기적으로 조회 |
| 실행 시점 |
시스템 시작 후 무한 루프로 동작 |
| 설정 간격 |
dbWatchMiliTime (기본 5초) |
호출 위치: DbDeleteThread.java (line 26)
// DbDeleteThread.java:26
dbDeleteMgr.getUmsPitcherDao().delPitcherMsg(delWorkBean);
| 구분 |
내용 |
| 스레드명 |
DbDeleteThread-N (N: 0~4) |
| 역할 |
UMS 발송 성공 후 Legacy DB의 원본 데이터 삭제 |
| 실행 시점 |
메시지 발송 완료 후 |
| 설정 개수 |
completWorkerCnt (기본 5개) |
호출 위치: UmsCompletWorkThread.java (line 38)
// UmsCompletWorkThread.java:38
DBPitcherCoreMain.getInstance().getUmsPitcherDao().inPitcherCompletedMsg(umsWorkBean);
| 구분 |
내용 |
| 스레드명 |
UmsCompletWorkThread-N (N: 0~4) |
| 역할 |
UMS 발송 결과를 UMS DB의 결과 테이블에 저장 |
| 실행 시점 |
UMS로부터 발송 결과 수신 후 |
| 설정 |
compleatDataDbSave (Y/N) |
1. DBPitcherMain.main() 실행
│
├─▶ DBPitcherCoreMain.startDaemon() 호출
│
├─▶ workerCommonStart() [line 116]
│ │
│ ├─▶ MasterRollChecker.startScheduler() - 10초마다 마스터 체크
│ │
│ ├─▶ UmsCompletManager.getInstance() - 결과 저장 스레드 생성
│ │ └─▶ UmsCompletWorkThread 5개 생성 (completWorkerCnt)
│ │
│ └─▶ UmsWorkerManager.start() [line 104]
│ │
│ └─▶ startFileWorkers() [FILE 큐 사용시]
│ │
│ └─▶ FileqWorkerManager.startWorkers()
│ └─▶ FileqWorkerThread 10개 생성 (taskWorkerThreadCnt)
│
└─▶ UmsWorkerManager.dbFetcherWorkerThreadStart() [마스터 결정 후]
│
└─▶ UmsDBFetcherThread 1개 생성
└─▶ DbDeleteMgr.startWorkers() 호출
└─▶ DbDeleteThread 5개 생성 (completWorkerCnt)
| 구분 |
내용 |
| 생성 위치 |
UmsWorkerManager.dbFetcherWorkerThreadStart() [line 150] |
| 호출 조건 |
MasterRollChecker가 마스터로 결정 후 |
| 역할 |
Legacy DB에서 발송요청 Polling |
| 설정 간격 |
dbWatchMiliTime (기본 5초) |
| 호출 DAO |
selPitcherMsg() |
| 구분 |
내용 |
| 생성 위치 |
FileqWorkerManager.startWorkers() [line 103-113] |
| 호출 조건 |
시스템 시작 시 (queueType=FILE) |
| 역할 |
파일 큐에서 메시지를 꺼내 UMS로 발송 |
| 설정 개수 |
taskWorkerThreadCnt (기본 10개) |
| 구분 |
내용 |
| 생성 위치 |
DbDeleteMgr.startWorkers() [line 33-38] |
| 호출 조건 |
UmsDBFetcherThread.run() 내부에서 초기화 [line 51] |
| 역할 |
UMS 발송 성공 후 원본 데이터 삭제 |
| 설정 개수 |
completWorkerCnt (기본 5개) |
| 호출 DAO |
delPitcherMsg() |
| 구분 |
내용 |
| 생성 위치 |
UmsCompletManager 생성자 [line 99-100] |
| 호출 조건 |
workerCommonStart() 호출 시 |
| 역할 |
UMS 발송 결과를 DB에 저장 |
| 설정 개수 |
completWorkerCnt (기본 5개) |
| 호출 DAO |
inPitcherCompletedMsg() |
sequenceDiagram
participant Core as DBPitcherCoreMain
participant Master as MasterRollChecker
participant Worker as UmsWorkerManager
participant Fetcher as UmsDBFetcherThread
Core->>Master: startScheduler() [10초 주기]
Master->>Master: startMasterRollCheck() [주기적 실행]
alt 마스터로 결정
Master->>Worker: dbFetcherWorkerThreadStart()
Worker->>Fetcher: new UmsDBFetcherThread()
Fetcher->>Fetcher: start()
Fetcher->>Fetcher: dbDeleteMgr.startWorkers() [DbDeleteThread 생성]
else 슬레이브
Master->>Worker: dbFetcherWorkerThreadStop()
end
마스터 선출 로직 (MasterRollChecker)
- 체크 주기: 10초 (
PeriodicTrigger(10, TimeUnit.SECONDS))
- 선출 방식: DB 테이블에서 MASTER_YN = 'Y' 인 프로세스가 마스터
- 상태 변경 시:
DBPitcherCoreMain.masterRollExec(isMaster) 콜백 호출
sequenceDiagram
participant Fetcher as UmsDBFetcherThread
participant Queue as Fileq/Redis
participant Worker as UmsWorkerThread
participant UMS as UMS Server
participant Deleter as DbDeleteThread
participant Completor as UmsCompletWorkThread
participant DB as UMS DB
Fetcher->>DB: selPitcherMsg() [발송요청 조회]
Fetcher->>Queue: 메시지 등록
Fetcher->>Deleter: DelWorkBean 등록
Queue->>Worker: 메시지 꺼내기
Worker->>UMS: UMS로 발송
UMS-->>Worker: 발송결과 수신
Worker->>Completor: 결과 데이터 전달
Deleter->>DB: delPitcherMsg() [원본 삭제]
Completor->>DB: inPitcherCompletedMsg() [결과 저장]
graph TD
subgraph DBPitcherCoreMain
A[시작] --> B[workerCommonStart]
B --> C[UmsCompletManager]
C --> D[UmsCompletWorkThread x5]
B --> E[UmsWorkerManager.start]
E --> F[FileqWorkerManager]
F --> G[FileqWorkerThread x10]
end
subgraph 마스터 선출
H[MasterRollChecker] -->|마스터 결정| I[dbFetcherWorkerThreadStart]
I --> J[UmsDBFetcherThread]
J --> K[DbDeleteMgr]
K --> L[DbDeleteThread x5]
end
J -->|selPitcherMsg| M[Legacy DB]
G -->|UMS 발송| N[UMS Server]
L -->|delPitcherMsg| M
D -->|inPitcherCompletedMsg| O[UMS DB]
| 설정 |
기본값 |
설명 |
dbWatchMiliTime |
5000 |
DB 폴링 간격 (5초) |
taskWorkerThreadCnt |
10 |
발송 처리 스레드 수 |
completWorkerCnt |
5 |
결과 처리 스레드 수 |
umsRequestThreadCnt |
5 |
UMS 요청 스레드 수 |
maxQueueSize |
50000 |
최대 큐 크기 |
queueType |
FILE |
큐 타입 (FILE/REDIS/ORDER) |
| 메서드 |
호출 클래스 |
파일 위치 |
selPitcherMsg() |
UmsDBFetcherThread |
ums-dbpitcher-core/.../worker/UmsDBFetcherThread.java:66 |
delPitcherMsg() |
DbDeleteThread |
ums-dbpitcher-core/.../worker/delete/DbDeleteThread.java:26 |
inPitcherCompletedMsg() |
UmsCompletWorkThread |
ums-dbpitcher-core/.../worker/completed/UmsCompletWorkThread.java:38 |
| 스레드 |
생성 시점 |
생성 위치 |
DAO 메서드 |
| UmsDBFetcherThread |
마스터 선출 후 |
UmsWorkerManager:150 |
selPitcherMsg() |
| FileqWorkerThread |
시스템 시작 |
FileqWorkerManager:103 |
- |
| DbDeleteThread |
UmsDBFetcherThread 시작 시 |
DbDeleteMgr:33 |
delPitcherMsg() |
| UmsCompletWorkThread |
시스템 시작 |
UmsCompletManager:99 |
inPitcherCompletedMsg() |
| 채널 |
설정 메서드 |
설명 |
| 푸시 |
setPUSH_TEMPL_ID() |
템플릿 기반 푸시 발송 |
| RCS |
setRCS_TEMPL_ID() |
RCS 템플릿 발송 |
| 카카오 알림톡 |
setALLIMTOLK_TEMPLCODE() |
카카오톡 발송 |
| SMS |
setSMS_TEMPL_ID() |
SMS 발송 |
mvn clean package
# Windows
start.bat
# Linux
./start.sh
./stop.sh
- 메인 로그:
logs/logFile.2026-06-25.log
- 발송 성공:
logs/ums/sent.2026-06-25.log
- 발송 실패:
logs/ums/fail.2026-06-25.log
- 웹훅 로그:
logs/webhook/2026-06-25.log