데브포일 홈
WordPress 자동화
Guest
STAGE 14 · Lv.70

주문 데이터 외부 연동

Make.com과 Google Sheets를 활용한 주문 데이터 자동 동기화, 주문 내보내기 자동화, 회계/ERP 시스템 연동을 구현합니다.

1. 주문 데이터 연동 아키텍처 설계

왜 외부 시스템과 주문 데이터를 연동해야 할까?

WooCommerce에서 발생하는 주문 데이터는 단순히 쇼핑몰 내에서만 사용되는 것이 아닙니다. 현대 이커머스 비즈니스에서는 회계 처리, 재고 관리, 고객 관리(CRM), 배송 추적, 마케팅 분석 등 다양한 외부 시스템과 유기적으로 연동되어야 합니다. 수동으로 엑셀 파일을 다운로드하고 다시 업로드하는 방식은 시간이 오래 걸리고, 실수가 발생하기 쉬우며, 데이터의 실시간성을 보장할 수 없습니다.


Google Sheets로 주문 데이터를 자동 기록하면 팀원 누구나 실시간으로 확인할 수 있고, 회계 소프트웨어와 연동하면 세금계산서 발행과 세금 신고가 자동화되며, ERP 시스템과 연결하면 생산 계획부터 물류, 재무까지 통합 관리할 수 있습니다. 이번 레슨에서는 이러한 연동을 실제로 구현하는 방법을 단계별로 배워보겠습니다.


주문 데이터 연동 아키텍처를 설계할 때는 데이터 흐름 방향(단방향 vs 양방향), 동기화 주기(실시간 vs 배치), 데이터 포맷(JSON, CSV, XML), 인증 방식(API Key, OAuth, 서비스 계정)을 먼저 결정해야 합니다. 잘못된 아키텍처 설계는 나중에 전체 시스템을 다시 구축해야 하는 상황을 만들 수 있으므로, 초기 설계에 충분한 시간을 투자하는 것이 중요합니다.

🔄
73%
수동 작업 시간 절감률
(자동 연동 도입 후 평균)
📉
95%
데이터 입력 오류 감소율
(자동화 vs 수동 입력)
<3초
Webhook 기반 실시간 연동
평균 데이터 전달 시간
💰
40%
운영 비용 절감
(ERP 연동 후 평균 효과)
🛒
WooCommerce
주문 발생
🔗
Webhook
이벤트 트리거
⚙️
미들웨어
데이터 변환/라우팅
📊
외부 시스템
Sheets / ERP / 회계

연동 아키텍처의 핵심 구성 요소

1) 이벤트 소스(Event Source): WooCommerce에서 주문이 생성, 업데이트, 완료, 환불될 때 발생하는 이벤트입니다. Webhook을 통해 외부로 전달되며, 각 이벤트별로 포함되는 데이터가 다릅니다. 주문 생성 시에는 고객 정보와 상품 목록이, 상태 변경 시에는 이전/이후 상태값이 포함됩니다.


2) 미들웨어(Middleware): Make.com, Zapier, n8n 같은 자동화 플랫폼이나 자체 PHP/Node.js 서버가 중간 다리 역할을 합니다. 데이터 포맷 변환, 필터링, 라우팅, 에러 처리를 담당합니다. 미들웨어 없이 직접 연결하면 한쪽 시스템의 API 변경 시 전체가 영향을 받는 강한 결합(tight coupling)이 발생합니다.


3) 대상 시스템(Target System): Google Sheets, 회계 소프트웨어(더존, QuickBooks), ERP(SAP, Oracle), CRM(Salesforce, HubSpot) 등 최종적으로 데이터가 도착하는 시스템입니다. 각 시스템마다 요구하는 데이터 포맷과 인증 방식이 다르므로 미들웨어에서 적절히 변환해야 합니다.


4) 모니터링/로깅: 연동 과정에서 발생하는 성공/실패를 기록하고, 실패 시 재시도하는 로직이 필수입니다. 네트워크 오류, API 한도 초과, 인증 만료 등 다양한 실패 원인에 대비해야 합니다.

아키텍처 설계 팁
연동 아키텍처를 설계할 때 가장 중요한 원칙은 느슨한 결합(Loose Coupling)입니다. WooCommerce와 외부 시스템 사이에 반드시 미들웨어 레이어를 두어, 한쪽 시스템의 API가 변경되더라도 다른 쪽에 영향이 가지 않도록 설계하세요. 또한 각 연동 포인트마다 실패 시 재시도할 수 있는 큐(Queue) 시스템을 도입하면 데이터 유실을 방지할 수 있습니다.
Webhook
특정 이벤트 발생 시 지정된 URL로 HTTP POST 요청을 자동 전송하는 메커니즘. "역방향 API"라고도 불리며, 폴링(polling) 방식보다 효율적입니다.
ETL (Extract-Transform-Load)
데이터를 소스에서 추출(Extract)하고, 대상 시스템에 맞게 변환(Transform)한 뒤, 적재(Load)하는 프로세스. 주문 데이터 연동의 핵심 패턴입니다.
Idempotency (멱등성)
동일한 요청을 여러 번 보내도 결과가 한 번 보낸 것과 같도록 보장하는 성질. Webhook 재시도 시 중복 데이터 입력을 방지하기 위해 필수적입니다.
Service Account (서비스 계정)
사람이 아닌 애플리케이션이 API에 접근할 때 사용하는 특수 계정. Google API 연동 시 서비스 계정 JSON 키 파일을 사용합니다.

2. WooCommerce 웹훅 설정 (주문 이벤트)

웹훅(Webhook)의 작동 원리와 설정 방법

WooCommerce 웹훅은 특정 이벤트가 발생할 때 지정된 URL로 주문 데이터를 JSON 형태로 자동 전송합니다. WordPress 관리자 패널의 WooCommerce > 설정 > 고급 > 웹훅 메뉴에서 GUI로 설정할 수 있지만, 프로그래밍 방식으로 관리하면 버전 관리와 배포 자동화가 가능합니다.


웹훅을 설정할 때는 다음 이벤트들을 목적에 맞게 선택해야 합니다:


order.created - 새 주문이 생성될 때 발생합니다. 결제 완료 전 주문 접수 단계에서도 발생하므로, 결제 확인이 필요한 시스템에는 부적합할 수 있습니다. 재고 확보나 알림 발송 등 즉시 처리가 필요한 경우에 사용합니다.


order.updated - 주문 정보가 변경될 때마다 발생합니다. 상태 변경, 메모 추가, 배송 정보 업데이트 등 모든 변경에 반응합니다. 빈번하게 발생할 수 있으므로 필터링 로직이 필요합니다.


order.completed - 주문이 "완료" 상태로 변경될 때 발생합니다. 회계 시스템이나 Google Sheets에 확정된 매출 데이터를 기록할 때 가장 적합합니다. 대부분의 연동 시나리오에서 이 이벤트를 기본으로 사용합니다.

// ============================================ // WooCommerce 웹훅 프로그래밍 방식 등록 // 주문 생성/업데이트/완료 3개 이벤트 한번에 설정 // ============================================ class MAP_Webhook_Manager { private $delivery_url; private $secret; public function __construct() { $this->delivery_url = get_option('map_webhook_delivery_url', ''); $this->secret = get_option('map_webhook_secret', ''); // 관리자 전용 초기화 훅 add_action('admin_init', [$this, 'maybe_register_webhooks']); } /** * 웹훅이 아직 등록되지 않았으면 3개 이벤트 모두 등록 */ public function maybe_register_webhooks() { if (get_option('map_webhooks_registered')) { return; } $topics = [ 'order.created' => '주문 생성 알림', 'order.updated' => '주문 상태 변경 알림', 'order.completed' => '주문 완료 알림', ]; foreach ($topics as $topic => $name) { $this->create_webhook($name, $topic); } update_option('map_webhooks_registered', true); error_log('[MAP] 주문 웹훅 3개 등록 완료'); } /** * 개별 웹훅 생성 */ private function create_webhook($name, $topic) { $webhook = new WC_Webhook(); $webhook->set_name($name); $webhook->set_status('active'); $webhook->set_topic($topic); $webhook->set_delivery_url($this->delivery_url); $webhook->set_secret($this->secret); $webhook->set_api_version('wp_api_v3'); $webhook->save(); error_log("[MAP] 웹훅 생성: {$name} (ID: " . $webhook->get_id() . ")"); return $webhook->get_id(); } } // 커스텀 Webhook 페이로드 확장 — 마케팅/분석 데이터 추가 add_filter('woocommerce_webhook_payload', function($payload, $resource, $resource_id, $webhook_id) { if ($resource !== 'order') { return $payload; } $order = wc_get_order($resource_id); if (!$order) { return $payload; } // 마케팅 추적 데이터 $payload['marketing'] = [ 'utm_source' => get_post_meta($resource_id, '_utm_source', true), 'utm_medium' => get_post_meta($resource_id, '_utm_medium', true), 'utm_campaign' => get_post_meta($resource_id, '_utm_campaign', true), 'order_source' => get_post_meta($resource_id, '_order_source', true), ]; // 고객 통계 데이터 $customer_id = $order->get_customer_id(); $payload['customer_stats'] = [ 'total_orders' => wc_get_customer_order_count($customer_id), 'total_spent' => wc_get_customer_total_spent($customer_id), 'is_returning' => wc_get_customer_order_count($customer_id) > 1, 'first_order_date' => $this->get_first_order_date($customer_id), ]; // 멱등성 키 — 중복 처리 방지용 $payload['idempotency_key'] = md5($resource_id . '_' . $order->get_date_modified()->getTimestamp()); return $payload; }, 10, 4); new MAP_Webhook_Manager();
웹훅 보안 주의사항
웹훅의 secret 값은 반드시 강력한 랜덤 문자열로 설정하고, 수신 서버에서 HMAC-SHA256 서명을 검증해야 합니다. 서명 검증 없이 수신하면 공격자가 가짜 주문 데이터를 전송할 수 있습니다. 또한 delivery_url은 반드시 HTTPS를 사용하세요. HTTP로 전송하면 주문 데이터(이름, 이메일, 주소, 결제 정보)가 평문으로 노출됩니다.
🔒
여기까지는 미리보기입니다
주문 데이터 외부 연동
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)