귀사의 판매 프로세스를 함께 살펴보고 아키텍처를 제안합니다
카탈로그, 주문, 결제, 회계 시스템과의 교환 — 개발을 시작하기 전에 도면으로.
이커머스 시스템은 카탈로그의 상품 카드에서 결제와 배송이 끝난 주문까지 상품을 이끕니다. 아래에는 시스템의 모듈, 시스템이 처리하는 프로세스, 그리고 CRM, ERP, 창고, POS와의 연결이 정리되어 있습니다.
이커머스 소프트웨어 — 상품, 가격, 재고 데이터를 보관하고 인터넷으로 주문을 받아 결제를 처리한 뒤 주문을 실행 단계로 넘기는 시스템입니다: 창고로, 배송으로, 회계로.
일반 웹사이트와 다른 점은 페이지가 아니라 회계 객체를 다룬다는 것입니다: 상품, 가격, 재고, 주문, 결제, 출고, 반품 — 저마다 상태와 이력을 가진 레코드입니다. 같은 주문이 앱에서도, 자판기에서도, 매니저에게서도, 마켓플레이스에서도 들어올 수 있습니다.
이것은 쇼윈도 자체가 아니라 쇼윈도 위에 놓인 회계 회로입니다. 회계를 다시 쓰지 않고도 쇼윈도를 바꾸거나 하나 더 추가할 수 있습니다.
이커머스 플랫폼을 도입하는 여섯 가지 이유입니다. 도입 전에는 각각을 수작업으로 — 표와 메신저와 전화로 — 처리해야 합니다.
사양, 사진, 가격, 재고가 한곳에 저장되어 모든 판매 채널로 전달됩니다. 웹사이트, 앱, POS 사이에 불일치가 없습니다.
주문은 24시간 내내 자동으로 생성되고 검증되고 결제됩니다. 사람은 판단이 필요한 곳에만 필요합니다: 비표준 배송, 다툼이 있는 반품, 도매 거래.
주문서 작성 시점의 예약 덕분에 같은 상품이 두 번 팔리지 않습니다. 창고에 물건이 없어 생기는 취소는 극히 드문 경우로 줄어듭니다.
가격과 할인은 상품 카드를 일일이 고치는 대신 규칙으로 정합니다. 수천 개 품목의 가격 재조정이 몇 분이면 끝나고 되돌릴 수 있습니다.
주문, 결제, 출고가 재입력 없이 회계와 창고 관리로 넘어갑니다. 장부 대조가 더 이상 별도의 업무가 아니게 됩니다.
무엇을 사는지, 무엇을 찾다가 못 찾는지, 주문서 작성 중 어디서 이탈하는지, 어떤 상품이 반품되는지 보입니다. 상품 구색은 데이터로 계획합니다.
자동화는 «판매원 대신 로봇»이 아니라, 반복되는 작업을 시스템이 스스로 적용하고 그 결과를 이력에 기록하는 규칙으로 옮기는 일입니다.
규칙은 조건이 바뀌기 전까지 계속 작동합니다. 통제는 그대로 남습니다: 모든 자동 동작에는 작성자, 시각, 이전 값이 로그에 남습니다.
자동 모드로 넘어가는 것:
| 시각 | 시스템이 스스로 한 일 |
|---|---|
| 09:41 | 마크업 18%: 1 240개 품목 재계산 |
| 10:00 | «차 −15%» 프로모션이 일정에 따라 시작됨 |
| 10:03 | 주문 № 14 190 취소: 재고 +2 개 |
| 10:06 | SKU 77-1043 재고 부족: 구매 담당에게 알림 |
카탈로그 — 상품 데이터를 구조화해 보관하는 저장소입니다: 무엇을 파는지, 상품끼리 무엇이 다른지, 어떤 속성으로 찾는지.
작동하는 카탈로그를 이루는 것:

카탈로그의 기본 단위는 고유 품번(SKU)을 가진 상품 품목입니다: 변경되지 않는 데이터, 편집 가능한 설명, 그리고 연결된 객체 — 이미지, 문서, 가격, 재고.
대량 작업은 가져오기와 내보내기로 진행됩니다: 파일, API 또는 회계 시스템에서의 추출. 가져오기는 언제나 검증을 거칩니다: 무엇이 생성되고, 무엇이 바뀌며, 무엇이 왜 거부되는지.
거부 사유: 품번 중복 — 9, 필수 속성 «브랜드» 누락 — 5, 알 수 없는 카테고리 — 3. 확인 전까지 카탈로그에는 단 한 행도 기록되지 않습니다.
가격 — 상품 카드의 필드가 아니라 요청 시점에 규칙으로 계산한 결과입니다. 한 상품에 여러 가격이 동시에 존재하고, 시스템이 적용할 가격을 고릅니다.
그래서 수천 개의 상품 카드에서 가격을 고칠 필요가 없습니다: 규칙이나 기본 가격표를 바꾸면 됩니다.
가격 책정의 계층:
모든 가격 변경은 이력에 기록됩니다: 누가, 언제, 어떤 규칙으로 바꿨고 이전 값은 얼마였는지. 마진 리포트와 다툼이 있는 주문의 분석이 이 이력에 기댑니다.
규칙은 우선순위에 따라 풀리며 무작정 합산되지 않습니다. 품목 가격의 일반적인 계산 순서는 이렇습니다:
병행 가능 여부는 명시적으로 정합니다: 어떤 할인이 합산되고, 어떤 할인이 서로 배타적이며, 허용되는 최저 가격은 얼마인지. 최저 가격 제한이 있어 올바른 할인이 여럿 겹쳐도 품목이 손해로 넘어가지 않습니다.
프로모션 — 시스템이 조건에 맞는 주문에 스스로 적용하는 규칙입니다. 프로모션 코드 — 같은 규칙을 구매자가 코드로 직접 켜는 것입니다. 둘 다 똑같이 기술됩니다: 조건, 방식, 기간, 제한.
주문에 무엇이 있어야 하는지: 상품, 카테고리, 브랜드, 최소 금액, 배송 방법, 고객 세그먼트, 판매 채널, 시간대나 요일.
비율, 정액, 새 가격, 묶음에서 가장 싼 상품 할인, 무료 배송, 사은품, 할인 대신 적립금.
시작일과 종료일, 반복되는 구간(예를 들어 매주 금요일), 담당자 개입 없는 자동 시작과 종료.
전체 사용 한도, 고객당 한도, 일회용 개인 코드, 다른 프로모션과의 중복 금지, 품목 최저 가격.
발송용 단일 코드 또는 수신자별 고유 코드 묶음. 묶음은 파일로 내려받아 코드 하나하나를 추적합니다.
프로모션마다 보입니다: 주문 수, 할인 총액, 할인을 반영한 매출과 마진, 활성화된 코드 수와 남은 코드 수.
장바구니 — 주문 초안입니다: 구매자에게도 상점에게도 아직 의무를 만들지 않은 품목 묶음. 담긴 상품은 예약되지 않고 가격도 확정되지 않아, 열 때마다 다시 계산됩니다.
재계산은 네 가지를 확인합니다: 상품이 판매 중인지, 창고에 넉넉한지, 가격이 바뀌지 않았는지, 할인이 유효한지. 바뀐 점은 돈이 빠져나간 뒤가 아니라 결제 전에 구매자에게 보입니다.
장바구니가 갖춰야 할 것:
주문서 작성 합계: 3개 품목, 11 640 솜. 두 가지 차이는 모두 돈이 빠져나가기 전에 구매자에게 보여 줍니다.

장바구니 옆에는 구매로 이어지지 않는 목록이 함께 있습니다: 찜, 재입고 알림, 사양 비교, 지난 주문 다시 담기. 일부러 분리했습니다 — 그러지 않으면 주문 합계가 명확하지 않게 됩니다.
대부분의 장바구니는 주문이 되지 않습니다. 시스템은 시각을 붙여 이를 보관하고 구매자를 다시 부를 수 있습니다: 메일이나 메신저 알림, 담았던 구성을 되살리는 링크, 개인 맞춤 제안.
알림은 사건에 따라 한 번만 보내고 광고 발송으로 바뀌지 않습니다 — 수신 거부는 되찾은 주문보다 비쌉니다.
주문 — 구매 구성, 작성 시점의 가격, 구매자, 배송과 결제 조건을 확정하는 문서입니다. 이후 주문은 정해진 상태 집합을 따라 움직이고, 모든 전환이 기록됩니다.
가격과 할인은 주문서 작성 때 확정됩니다: 가격 변경이나 프로모션 종료는 이미 만들어진 주문에 영향을 주지 않습니다 — 그러지 않으면 결제 금액과 영수증 금액이 어긋납니다.
단계별 주문서 작성:

일반적인 상태: 신규 → 결제 대기 → 결제됨 → 피킹 중 → 배송으로 전달됨 → 배달됨 → 완료. 이와 나란히 취소와 반품 갈래가 있습니다. 상태 집합은 회사의 프로세스에 맞춰 설정하되, 유한하고 명시적으로 남습니다.
주문 수정은 권한이 필요한 별도의 작업입니다: 품목 추가, 상품 교체, 수량 변경, 추가 결제나 부분 환불. 수정할 때마다 이전 구성이 남습니다.
콜센터 — 별도의 프로그램이 아니라 같은 주문 대기열 위에 놓인 업무 공간입니다. 상담원은 구매자가 개인 계정에서 보는 것과 같은 객체를 보고, 여기에 고객에게는 닫혀 있는 작업이 더해집니다: 구성 수정, 한도 안에서의 할인, 예약 해제, 환불.
문의도 주문과 마찬가지로 상태와 이력을 가진 레코드입니다: 채널, 주제, 연결된 주문, 담당자, 답변 기한이 있습니다. 그래서 교대할 때 대화가 사라지지 않고, 그 결과가 고객 카드에 보입니다.
단계별 문의 흐름:
내보내는 업무도 같은 구조입니다: 피킹 전 주문 확인, 비표준 배송에 대한 전화, 버려진 장바구니로의 복귀, 다툼이 있는 반품에 대한 통화. 모든 접촉은 들어온 문의와 같은 이력에 기록됩니다.

상점은 카드 정보를 보관하지도, 결제를 직접 수행하지도 않습니다: 구매자를 결제 대행사에 넘기고, 처리 결과를 받아 주문과 연결합니다. 나머지는 결제의 생애주기 관리입니다.

| 주문 | 처리 | 금액 | 상태 |
|---|---|---|---|
| 14 208 | 홀드 설정 | 12 480 | 홀드 |
| 14 201 | 청구 | 6 350 | 완료됨 |
| 14 177 | 환불 | 2 100 | 완료됨 |
| 14 206 | 홀드 해제 | 3 940 | 해제됨 |
| 14 209 | 은행 거절 05 | 890 | 재시도 |
환불 결제 없이 홀드만 풀렸습니다: 창고에 물건이 없었습니다. 멱등 키로 요청을 다시 보내도 두 번째 줄은 생기지 않습니다.
은행 카드, QR과 즉시 결제 시스템, 전자 지갑, 수령 시 결제, 법인 계좌 이체, 할부와 신용, 적립금 결제.
먼저 홀드: 금액이 카드에서 묶이지만 빠져나가지는 않습니다. 청구는 주문 피킹이 끝난 뒤입니다. 물건이 없으면 환불 결제 없이 묶임만 풀립니다.
처리 결과는 구매자가 사이트로 돌아오는 것과 무관하게 별도의 서버 요청으로 옵니다. 브라우저를 닫아도 결제는 깨지지 않습니다: 상태는 알림으로 갱신됩니다.
같은 결제 요청을 다시 보내도 두 번째 결제가 생기지 않습니다. 모든 처리에는 키가 있고, 대행사와 시스템은 그 키로 중복을 알아봅니다.
결제가 끝나면 온라인 POS가 세금 영수증을 만들어 구매자에게 보냅니다. 반품 시에는 돌아온 품목에 대한 환불 영수증이 만들어집니다.
매일 시스템의 처리 내역을 대행사 내역, 은행 명세와 맞춰 봅니다. 어긋난 건은 별도 목록으로 모여 사람이 확인합니다.
재고 — 지금 바로 판매할 수 있는 상품의 수량입니다. 창고에 있는 물리적 수량과는 다릅니다: 일부는 주문에 예약되어 있고, 일부는 이동 중이며, 일부는 불량으로 묶여 있습니다.
판매 가능 수량 = 실물 재고 − 예약 − 묶임 + 확정된 입고 예정분(선주문이 허용된 경우).
창고와 매장이 여럿이면 재고는 창고별로 따로 계산하고, 스토어프론트에는 선택한 지역으로 배송이 가능한 창고들의 합이 보입니다.
데이터 교환의 구조:
예약에는 언제나 유효 기간이 있습니다: 제때 결제되지 않은 주문은 상품을 다시 판매로 풀어 줍니다 — 그러지 않으면 버려진 장바구니가 판매 가능한 재고를 «먹어» 버립니다.
| 창고 | 실물 | 예약 | 불량 | 판매 가능 |
|---|---|---|---|---|
| 중앙 | 1 420 | 310 | 24 | 1 086 |
| «보스토크» 매장 | 96 | 12 | — | 84 |
| 수령 장소 № 3 | 40 | 8 | 2 | 30 |
| 입고 예정 | 600 | — | — | 600 |
| 판매 가능 수량 | 2 156 | 330 | 26 | 1 800 |
실물은 물리적 재고, 불량은 묶여 있는 수량입니다. 입고 예정분은 선주문이 허용된 곳에서만 판매 가능 수량에 들어갑니다. 스토어프론트에는 선택한 지역으로 배송이 가능한 창고들의 합이 보입니다.
배송은 세 가지 객체로 기술됩니다: 배송 방법, 권역, 요금. 반품은 «소급 취소»가 아니라 자체 문서를 가진 역방향 프로세스입니다.
주소로 가는 배송기사, 수령 장소, 무인 보관함, 직접 수령, 대형 화물 운송사, 전자 상품을 위한 디지털 전달.
비용은 지역, 무게, 부피, 주문 금액에 따라 달라집니다. 규칙으로 무료 배송 기준 금액, 계단 운반과 규격 초과 할증을 정합니다.
날짜와 시간대는 창고 운영 일정, 피킹 시간, 운송사 일정에 따라 계산됩니다. 찬 슬롯은 자동으로 닫힙니다.
주문은 API로 운송사에 전달되고, 시스템은 운송장 번호와 이동 상태를 받아 개인 계정에 보여 줍니다.
구매자가 품목과 사유를 고르면, 시스템이 기한과 상품 유형별 반품 가능 여부를 확인하고 안내가 담긴 문서를 만듭니다.
검수가 끝나면 상품은 재고로 돌아가거나 불량으로 처리되고, 대금은 원래의 결제 수단으로 돌아가며, 환불 영수증이 만들어집니다.
부분 반품은 흔한 일입니다: 다섯 품목 중 하나만 돌아오기도 합니다. 그래서 반품은 품목 단위로 계산하고, 주문 전체에 걸린 할인은 품목들에 비례해 나눕니다 — 그러지 않으면 환불 금액이 영수증과 어긋납니다.
창고 담당자 — 상품을 실제로 옮기는 직원입니다: 입고를 받고, 셀에 넣고, 주문에 맞춰 품목을 꺼내고, 포장한 상자를 배송기사에게 넘깁니다. 시스템은 이 동작을 직원의 말로 아는 것이 아닙니다: 모든 작업이 바코드 스캔으로 확인됩니다.
차이는 근본적입니다. 목록의 «완료» 표시는 의도를 확인해 주지만, 스캔은 사실을 확인해 줍니다: 어느 품번을, 어느 셀에서, 어느 직원이, 초 단위 시각에. 품번의 오타는 한 달 뒤 재고 조사에서야 드러나지만, 잘못된 바코드는 앱이 아예 받지 않습니다.
창고 담당자가 한 근무조에 하는 일:

스캔 하나하나가 곧 전표입니다: 셀의 재고는 저녁에 서류를 옮길 때가 아니라 작업하는 그 순간에 바뀝니다. 스토어프론트, POS, 콜센터가 같은 재고를 읽으므로 «사이트에는 있는데 선반에는 없다»는 상황이 사라집니다.
피킹 정확도 99.4%: 근무조 동안 스캔 차단 7건, 모두 그 자리에서 수정. 데이터는 별도의 근무 대장이 아니라 같은 전표에서 가져옵니다.
배송기사 — 실행의 마지막 고리이자 구매자가 직접 마주하는 유일한 직원입니다. 그의 앱은 두 가지 일을 합니다: 경로를 안내하는 것과, 나중에 전화로 확인할 필요가 없도록 전달 사실을 기록하는 것.
핵심 작업은 전달 시 QR 코드 스캔입니다. 코드는 주문 라벨에 인쇄되어 있거나 구매자가 화면으로 보여 줍니다. 스캔은 달리 하면 말다툼으로 풀어야 하는 질문에 답합니다: 이 주문이 맞는지, 받는 사람이 맞는지, 몇 분에 전달됐는지.
물류 담당자 는 같은 앱의 반대편에서 일합니다: 권역, 무게, 부피, 시간대에 맞춰 경로를 짜고, 배송기사를 배정하고, 근무조 지도를 보며 사고를 처리합니다 — 지연, 연락 두절, 문 앞에서의 수령 거부.
단계별 배송기사의 근무조:

배송기사가 기록한 그 상태를 구매자는 개인 계정에서, 상담원은 주문 카드에서 봅니다. 별도의 «배송기사 일지»는 없습니다: 이벤트는 하나이고 세 쪽 모두 그것을 읽습니다.
창고 담당자와 배송기사는 서로 다른 앱에서 서로 다른 곳에서 일하지만 같은 주문을 이끕니다. 이들을 잇는 것은 하루가 끝난 뒤의 리포트가 아니라 여섯 가지 공통 규칙입니다.
피킹 지시서, 포장 명세서, 배송 지시서는 각각의 서류가 아니라 하나의 주문을 보는 여러 방식입니다. 상담원이 추가한 품목은 다시 작성하지 않아도 창고 담당자에게 전달됩니다.
상품은 스캔으로 창고에서 배송기사에게, 배송기사에게서 구매자에게 넘어갑니다. 지금 주문이 누구에게 물리적으로 있는지, 몇 분부터인지 언제든 보입니다.
표시는 동작을 수행한 사람이, 수행한 곳에서 합니다. 배차 담당이 상태를 손으로 옮기지 않으므로 사실과 기록 사이에 몇 시간의 간격이 생기지 않습니다.
두 앱 모두 작업을 로컬 큐에 기록했다가 연결이 되면 마저 보냅니다. 모든 작업에는 키가 있어 다시 보내도 두 번째 피킹이나 두 번째 전달이 생기지 않습니다.
입고 시의 부족, 오배송, 파손, 주소에서의 부분 수령 거부 — 각각의 사례는 재고를 말없이 고치는 것이 아니라 사유와 담당자가 붙은 별도의 기록이 됩니다.
피킹 시간당 품목 수, 피킹 정확도, 시간대를 지킨 배송의 비율, 주소에서 머문 시간, 부분 수령 거부의 비율. 업무량과 성과급은 느낌이 아니라 이 데이터로 계산합니다.
도입에 대한 요구도 여기서 나옵니다: 창고와 배송은 시스템에 함께 연결합니다. 배송기사 앱 없는 창고 담당자 앱은 출고 이후로는 어디에도 닿지 못하는 정확한 재고를 줄 뿐입니다.
개인 계정 — 구매자가 상담원을 거치지 않고 자기 데이터에 접근하는 곳입니다: 주문, 문서, 주소, 결제 수단, 반품. 계정에서 풀린 질문 하나하나가 고객지원에 걸려 오지 않은 전화입니다.
계정은 자기만의 데이터를 따로 보관하지 않습니다: 상담원이 관리자 패널에서 보는 것과 같은 객체를, 다만 이 고객의 기록만, 그리고 그에게 허용된 작업만 보여 줍니다.
안에 무엇이 있는가:
B2B에서는 계정이 더 복잡합니다: 한 조직에 권한이 다른 직원이 여럿 있습니다. 구매 담당이 주문을 만들고, 책임자가 승인하고, 회계 담당이 증빙 서류를 받아 갑니다. 주문은 하나이고 동작은 나뉩니다.
일회용 코드나 비밀번호로 로그인하고, 돈과 연락처 변경에는 2차 인증을 걸며, 세션 로그에서 다른 기기의 연결을 끊습니다. 메일이나 전화번호 변경은 기존 주소와 새 주소 양쪽에서 확인합니다.
같은 기록을 상담원은 주문 카드에서 봅니다: 이벤트는 공통이고, 계정을 위한 별도의 일지는 없습니다. 영수증과 거래명세서는 «문서» 영역에 있습니다.
연동 — 외부 프로그램과 합의된 데이터 교환입니다: 무엇을, 어떤 형식으로, 얼마나 자주 주고받는지, 데이터는 누구의 것인지, 장애가 나면 어떻게 되는지.
시스템이 연결되는 곳:

연동에서 가장 중요한 결정은 데이터에 대한 책임입니다. 엔티티마다 소유 시스템을 정합니다: 품목 마스터와 가격은 ERP에서, 고객은 CRM에서, 재고는 창고에서 오고, 주문은 이커머스에서 태어납니다. 같은 필드를 두 시스템에서 양방향으로 고치면 계속 어긋나므로 그렇게 하지 않습니다.
| 시스템 | 무엇을 전달하는가 | 메시지 | 결과 |
|---|---|---|---|
| ERP | 품목 마스터, 가격 | 4 120 | 오류 없음 |
| 창고 | 재고, 예약 | 18 640 | 재시도 2건 |
| CRM | 고객, 세그먼트 | 1 305 | 오류 없음 |
| 마켓플레이스 | 주문, 재고 | 2 470 | 1건 확인 중 |
연동은 시작할 때가 아니라 반년 뒤에 깨집니다 — 외부 시스템이 업데이트되거나, 통신이 한 시간 끊기거나, 마스터에 예상하지 못한 값이 들어올 때입니다. 이런 일을 교환이 견뎌 내는지는 여섯 가지 규칙이 정합니다.
주문서 작성은 외부 시스템의 응답을 기다리지 않습니다: 메시지는 큐에 담겨 따로 처리됩니다. 창고가 멈춰도 판매는 멈추지 않습니다.
실패한 전달은 간격을 늘려 가며 다시 시도합니다. 모든 시도 뒤에도 지나가지 못한 메시지는 사라지지 않고 확인 대기열로 들어갑니다.
다시 전달된 메시지는 두 번째 주문을 만들지도, 재고를 두 번 차감하지도 않습니다. 수신 쪽이 작업 키로 중복을 알아봅니다.
형식이 바뀌면 새 버전으로 나오고, 이전 버전은 계속 작동합니다. 외부 이용자는 자기 일정에 맞춰 옮겨 갑니다.
모든 메시지는 본문, 시각, 결과, 시도 횟수와 함께 저장됩니다. 사고 조사는 기억이 아니라 로그에 기댑니다.
핵심 지표를 주기적으로 맞춰 봅니다: 주문, 결제 금액, 재고. 어긋난 값은 재고 조사 때 발견되는 것이 아니라 처리해야 할 과제가 됩니다.
카탈로그와 주문
결제
재고와 창고
분석
분석은 외부 방문자 카운터만이 아니라 판매와 행동에 대한 자체 데이터 위에 세워집니다. 카운터는 조회수를 알고, 시스템은 돈과 상품과 반품을 압니다.
리포트는 단면별로 계산됩니다: 기간, 판매 채널, 카테고리, 브랜드, 창고, 지역, 고객 세그먼트, 프로모션. 어떤 지표든 각 단면에서 볼 수 있고 파일이나 데이터 웨어하우스로 내보낼 수 있습니다.

가장 가파른 낙차는 장바구니와 주문서 작성 사이입니다: 그곳에서 회원 가입 단계, 배송비 계산, 결제 수단을 손봅니다.
보안은 세 가지에 달려 있습니다: 결제 정보는 상점 시스템에 들어오지 않고, 개인정보는 제한적으로 통제 아래 보관되며, 돈과 주문에 관한 모든 동작은 흔적을 남깁니다.
카드 번호는 인증된 대행사 쪽에서 입력되고 상점 시스템에는 들어오지 않습니다. 재청구를 위해서는 카드가 아니라 토큰을 보관합니다.
모든 통신은 HTTPS로 이뤄집니다. 데이터베이스의 민감한 필드는 암호화되고, 백업은 운영 회로와 분리해 암호화된 형태로 보관합니다.
역할 모델: 콘텐츠 매니저는 결제를 보지 못하고, 상담원은 가격을 바꾸지 못합니다. 관리자 로그인에는 2단계 인증이 걸립니다.
누가 가격을 바꿨는지, 누가 주문을 취소했는지, 누가 고객 데이터를 내려받았는지. 기록은 변경할 수 없고 운영 데이터와 따로 보관됩니다.
꼭 필요한 최소한의 항목, 보관 기간, 요청에 따른 삭제, 날짜와 출처가 남는 처리·수신 동의.
요청 빈도 제한, 무차별 대입으로부터의 양식 보호, 프로모션 코드 재사용 통제, 피킹 전 주문에 대한 이상거래 점검.
복구는 별도의 회로입니다. 백업은 복구가 확인되기 전까지는 쓸모가 없습니다: 시험 복구는 사고가 난 순간이 아니라 정해진 일정에 따라 해 둡니다.
확장성은 다시 쓰지 않고도 성장을 견디는 능력입니다. 세 가지 값이 커집니다: 카탈로그의 크기, 동시 방문자 수, 시간당 주문 수.
카탈로그는 검색과 필터링에, 최대 트래픽은 페이지 응답에, 주문 흐름은 데이터베이스와 외부 연동에 부딪힙니다. 해법도 저마다 다르고 필요해질 때 하나씩 적용합니다.
실제로 쓰이는 방법:
| 지표 | 측정값 | 기준값 |
|---|---|---|
| 카탈로그 응답, p95 | 180 밀리초 | 400 밀리초 |
| 최대치에서의 시간당 주문 수 | 3 000 | 2 400 |
| 캐시에서 나간 응답 | 86% | 70% |
| 카탈로그 재색인 | 9 분 | 20 분 |
| 백업에서의 복구 | 22 분 | 60 분 |
시스템은 모듈로 조립됩니다: 각 모듈이 자기 데이터와 작업의 영역을 맡고, 모듈 사이의 연결은 명시적으로 기술됩니다. 프로젝트는 나눠서 시작합니다 — 먼저 카탈로그와 주문, 그다음 적립, 분석, 외부 채널.
상품 품목, 품번, 설명, 게시 상태, 상품 카드의 버전, 판매를 중지한 상품의 보관함.
분류 트리, 상품을 여러 갈래에 연결하기, 정렬, 기획전과 시즌 코너를 위한 랜딩 페이지.
데이터 타입과 표시 규칙을 가진 속성 목록 — 필터, 비교, 마켓플레이스 전송의 바탕입니다.
사이즈, 색상, 용량을 한 상품 카드에 담되 품번과 재고는 따로. 여러 품목을 차감하는 묶음 상품.
사진, 동영상, 문서, 형식과 해상도의 자동 생성, 워터마크, 상품과의 연결.
가격표, 마크업 규칙, 수량 구간, 개별·계약 가격, 통화, 반올림, 세금, 이력.
적용 조건, 할인 방식, 일정, 한도, 코드 묶음 생성, 병행 가능 여부, 최저 가격.
기기 사이를 넘나드는 장바구니, 가격과 구매 가능 여부의 재계산, 주문서 작성 단계, 비회원 주문, 버려진 장바구니로의 복귀.
모든 채널의 주문을 담은 단일 대기열, 상태와 전환, 구성 수정, 추가 결제, 출고 분할, 취소.
대행사 연결, 홀드와 청구, 부분·전액 환불, 알림 처리, 대사.
판매와 환불 영수증, 온라인 POS와의 교환, 구매자에게 영수증 발송, 보내지 못한 문서의 관리.
창고별 재고, 유효 기간이 있는 예약, 불량 묶음, 입고와 반품 검수, 재고 부족 기준값.
배송 방법, 권역, 요금, 시간대와 슬롯, 운송 건 생성, 상태 추적, 문서 출력.
품목별 신청, 기한과 가능 여부 확인, 검수, 환불, 재고 복원 또는 불량 처리.
계정, 주소, 법인과 계약, 주문 이력, 세그먼트, 개인정보 처리 동의.
적립금, 등급, 적립과 사용 규칙, 적립금 유효 기간, 개인 맞춤 제안, 추천인.
검색 인덱스, 형태소와 동의어, 오타, 속성별 필터, 정렬, 결과가 없는 검색어.
관련 상품과 비슷한 상품, «함께 구매한 상품», 수동 기획전과 주문 이력에 기반한 규칙.
페이지, 아티클, 배너, 메타 태그와 페이지 주소, 상품 구조화 데이터, 사이트맵, 상품 피드.
주문 사건에 따른 메일, SMS, 메신저, 푸시, 메시지 템플릿, 일정, 발송 로그.
매출, 마진, 재고, 퍼널, 반품 리포트, 자유로운 단면, 내보내기, 데이터 마트.
CRM, ERP, 창고, POS, 결제·물류 서비스, 마켓플레이스와의 교환. API, 웹훅, 큐.
영역과 작업에 대한 역할과 권한, 2단계 인증, 직원 동작 로그.
하나의 코어 위의 여러 스토어프론트, 다국어와 다중 통화, 여러 법인과 창고, 지역.
시스템을 한 번의 릴리스로 통째로 띄우지는 않습니다. 아래 순서는 의존 관계를 따릅니다: 각 단계는 앞 단계에서 생긴 데이터에 기댑니다.
현재의 프로세스, 마스터 데이터, 데이터를 소유한 시스템. 결과물은 엔티티 도면과 연동 지도입니다.
품목 마스터 이관, 속성과 카테고리 설정, 가격과 재고 교환. 실제 데이터로 확인합니다.
주문서 작성, 상태, 결제 대행사, 세무 처리, 실행으로의 전달. 일부 상품 구색으로 시작합니다.
배송과 반품, 적립, 분석, 새로운 판매 채널. 각 묶음은 측정이 따르는 별도의 릴리스입니다.
이미 무엇이 돌아가고 있는지 알려 주세요: 회계 시스템, 창고, POS, 지금의 스토어프론트. 프로세스를 살펴보고 솔루션 아키텍처를 제안하겠습니다.