이번 글에서는 배치 프로젝트에서 Proxy 패턴을 활용해 여러 worker의 공통 기능(인터벌 설정, 중복 호출 제거, 스레드 종료 시 메모리 정리 등)을 캡슐화하여 안정적인 스레드 관리를 구현한 경험과, 외부 시스템 리소스 정보를 DB 테이블로 중앙 집중식 관리함으로써 유지보수성을 크게 향상시킨 사례를 공유하고자 합니다.
또한, 공휴일, 환율, 미주 세관 정보, 유니패스 등 다양한 외부 시스템과 연동하여, 단일 Linux 서버에서 약 2만 건 이상의 데이터 연동 처리를 안정적으로 수행하며, 추가 연동 기능도 DB 인서트 방식으로 손쉽게 확장할 수 있도록 시스템을 구축한 경험도 중점적으로 다룹니다.
(실제 코드를 예제형식으로 변환하였습니다.)
// 최소 예제: Proxy 패턴으로 동시 실행 제어
type AsyncFunction = (...args: any[]) => Promise<any>;
const state = { onExecute: false };
const proxyHandler = {
async apply(target: AsyncFunction, thisArg: any, args: any[]) {
if (state.onExecute) {
console.log("Already executing.");
return;
}
state.onExecute = true;
try {
return await target.apply(thisArg, args);
} finally {
state.onExecute = false;
}
}
};
const task: AsyncFunction = async () => {
console.log("Task started");
// 비동기 작업 시뮬레이션 (1초 대기)
await new Promise(resolve => setTimeout(resolve, 1000));
console.log("Task completed");
};
const proxiedTask = new Proxy(task, proxyHandler);
// 프록시를 통해 함수 호출 → 이미 실행 중이면 중복 실행을 막음
proxiedTask();
외부 시스템과의 연동 설정(예: URL, HTTP 메서드, Header, Body 등)을 중앙 집중식으로 관리하여, 환경 변화나 신규 시스템 추가 시 코드 수정 없이 DB 테이블 업데이트만으로 손쉽게 대응할 수 있도록 하였습니다.
테이블 구조 예시:
외부 리소스 설정의 변경이나 신규 연동 기능 추가가 단순 DB 인서트 작업으로 이루어져, 유지보수성과 확장성이 크게 향상되었습니다.
아래는 upd_body_col, upd_body_val을 활용한 body값 업데이트하는 코드입니다.
async updateBodyText(data) {
let tracking = '';
try {
// JSON 파싱을 통해 body 텍스트를 객체로 변환
const bodyText = JSON.parse(data.body);
if (data.upd_body_col) {
// 업데이트할 컬럼과 값 목록을 분리
const columns = data.upd_body_col.split(',');
const values = data.upd_body_val.split(',');
for (let i = 0; i < columns.length; i++) {
tracking = `Processing column index: ${i}`;
// 컬럼 경로를 배열로 분리 (예: "key1.key2.key3")
const colPath = columns[i].split('.');
// 값 경로를 배열로 분리하여, 해당 경로로부터 데이터를 추출
const valuePath = values[i].split('.');
let newValue = await this.GetJsonNode2(this.resultData, valuePath);
// 필요 시 날짜 변환 등 추가 로직 적용
if (data.upd_convert_date) {
newValue = this.convertDates(newValue);
}
// 업데이트 대상 객체의 해당 경로에 newValue 적용
await this.updateNodeByPath2(bodyText, colPath, newValue);
}
}
return bodyText;
} catch (ex) {
error("updateBodyText", data.seq, tracking, ex);
}
}
배치 작업에서는 공휴일, 환율, 미주 세관 정보, 유니패스 등 다양한 외부 시스템과 연동하고 있습니다. 최근 분석 결과, 하루 최소 9,000건에서 최대 22,000건의 데이터가 안정적으로 처리되고 있음을 확인했으며, 이는 시스템이 다양한 환경과 부하 상황에서도 견고하게 운영되고 있음을 보여줍니다. 또한, 별도의 복잡한 코드 수정 없이 DB 인서트 작업만으로 새로운 연동 기능을 손쉽게 추가할 수 있어, 시스템의 유연성과 확장성이 좋아졌습니다.
확장성과 유연한 기능 추가:
시스템은 단순히 처리 건수 증가에 대응하는 것을 넘어서, 새로운 스크래핑이나 외부 연동 기능을 추가할 때도 매우 유연하게 동작합니다.
필요한 새로운 기능을 도입할 때 별도의 복잡한 코드 수정 없이, 데이터베이스에 간단히 신규 인서트를 추가하는 방식으로 기능을 확장할 수 있습니다.
이로써 추가 연동 기능의 도입이 용이해져, 비즈니스 요구 사항 변화에 빠르게 대응할 수 있습니다.
비즈니스 연속성 보장: 외부 시스템과의 실시간 데이터 연동을 통해, 회사의 핵심 업무에 필요한 최신 정보를 제공함으로써 빠른 의사 결정을 지원합니다.
시스템 안정성 및 신뢰성 강화: 높은 부하 속에서도 데이터 손실 없이 안정적으로 동작하는 배치 시스템은, 엔터프라이즈 환경에서 필수적인 신뢰성을 확보하는 기반이 됩니다.
이러한 설계 작업은 배치 시스템의 신뢰성과 유연성을 크게 향상시켜, 향후 추가 연동 작업이나 신규 시스템 도입 시에도 빠르고 견고하게 대응할 수 있는 기반을 마련하는 데 큰 도움이 되었습니다.
앞으로도 지속적인 개선과 도전을 통해 더욱 완성도 높은 시스템을 구축해 나가겠습니다.
감사합니다.