RT-O6: 옴니채널 주문 통합 (Channel Adapter)

🎯 옴니채널 OMS의 의미Unified Commerce · Channel Normalization

옴니채널 OMS는 자사몰·네이버/쿠팡 마켓·오프라인 POS·B2B EDI 등 주문 입수 경로별로 서로 다른 데이터 모델·결제 흐름·반품 정책을 단일 파이프라인에서 흡수하는 시스템이다. 채널마다 필드명·통화·세금·할인 구조가 달라 raw_order를 그대로 후속 단계(라우팅·EDD·반품)로 넘기면 분기 코드가 폭발적으로 늘어난다.

RT-O6은 ChannelAdapter 패턴으로 raw_order를 표준 OrderRequest 객체로 정규화하고, 채널 코드(channel_type)를 메타로 보존해 후속 라우팅·EDD·반품 로직에 일관된 인터페이스를 제공한다. 이렇게 하면 RT-O1(DOM Score Engine)·RT-O3(EDD)·RT-O5(반품) 모두 채널 무관한 동일한 인터페이스로 호출 가능하여, 신규 채널이 추가되어도 어댑터 파일 1개만 추가하면 되는 O(1) 확장성을 확보한다.

🧭 채널 통합 파이프라인5 stages · webhook/EDI → 표준 OrderRequest
STEP 1
inbound_event

채널별 webhook · EDI 파일 수신 (HTTP / SFTP / Kafka). 원본 페이로드 그대로 큐에 적재.

STEP 2
channel_resolve

channel_type 결정 + 인증·서명 검증 (HMAC / JWT). 위변조 시 격리 큐로 격하.

STEP 3
parser_dispatch

parsers[channel_type] 호출. 채널별 필드 매핑 dict 로드 + 통화·세금·할인 컬럼 정렬.

STEP 4
standardize

표준 OrderRequest 객체 생성. 결제·세금·통화 통일 (KRW 환산), 메타로 채널 코드 보존.

STEP 5
dom_handoff

DOM Score Engine(RT-O1)으로 라우팅 위임. 채널 정보는order.meta.channel에 보관.

🐍 ChannelAdapter (Python)
class ChannelAdapter:
    def __init__(self):
        self.parsers = {
            "mall": MallParser(),
            "marketplace": MarketplaceParser(),
            "pos": PosParser(),
            "edi": EdiX12Parser(),
        }

    def normalize(self, raw_order, channel_type):
        # 채널별 어댑터 dispatch
        parser = self.parsers[channel_type]
        std_order = parser.to_standard_order(raw_order)
        std_order.meta["channel"] = channel_type
        return std_order   # 표준 OrderRequest 객체로 변환
➗ 통합 정확도 & latency 모델unify_score · 4 채널 가중 균등 0.25
unify_score = 0.4·field_match + 0.3·schema_valid + 0.2·channel_specific0.1·conflict
latency_p95 = max(parse_ms, validate_ms, normalize_ms)
# field_match 가 가장 큰 가중치 — 채널마다 SKU/주소/결제 컬럼명이 다르기 때문
mall .25REST webhook · 자사몰 / JSON 표준에 가장 가까워 field_match 평균 0.96
marketplace .25REST + 인증 · 네이버/쿠팡 등 외부 마켓, 결제·세금 컬럼이 채널별로 상이
pos .25Kafka stream · 매장 단말, 영수증 단위 micro-batch, 결제 단말 ID 보존 필요
edi .25SFTP X12 850 · B2B 표준이지만 파일 파싱 비용이 높고 스키마 위반이 가장 많음

예) 자사몰 webhook 1건은 field_match=0.96, schema_valid=1, conflict=0 unify_score 0.98로 즉시 표준화. EDI 850 파일은 50라인 아이템에서 conflict=0.3이 발생하여 별도 워커 풀에서 재시도된다.

📦 채널별 입수 방식 비교4월 OMS 트래픽 기준 · N=20,720 건/일
채널입수 방식파싱 난이도평균 latency일일 주문
자사몰REST webhook낮음22ms5,200건
마켓플레이스REST + 인증48ms11,800건
POSKafka stream38ms3,400건
B2B EDISFTP X12/EDIFACT매우 높음540ms320건

마켓플레이스가 일일 11,800건으로 가장 큰 트래픽을 차지하지만, 파싱 latency 자체는 EDI(540ms)가 압도적으로 높다. EDI 비중이 1.5%에 불과하더라도 동일 워커 풀에서 처리하면 전체 p95를 끌어올리는 long-tail 원인이 되므로 4월부터 별도 워커 풀로 격리했다.

참고문헌
[1] 김지훈 외, "옴니채널 OMS와 ChannelAdapter 정규화 패턴", IntraLogis 사내 보고서, 2026.04
[2] Manhattan Associates, "Manhattan Active Omni — Unified Commerce Architecture", 2024
[3] Salesforce, "Commerce Cloud Order Management Whitepaper", 2024
[4] Adyen, "Unified Commerce Report", 2024
[5] X12 / EDIFACT 850 Purchase Order 표준 명세, 2023
[6] 네이버 / 쿠팡 OPEN API 통합 가이드, 2025
[7] GS1 Korea, 전자상거래 표준 데이터 모델, 2024