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

재고 자동 업데이트 시스템

WooCommerce 재고 관리 훅을 활용하여 외부 재고 동기화, 저재고 알림, 자동 재입고 알림, CSV 가져오기/내보내기를 구현합니다.

재고 관리 자동화가 필요한 이유

수동 재고 관리의 한계와 자동화의 필요성

온라인 쇼핑몰에서 재고 관리는 매출과 고객 만족도에 직접적인 영향을 미치는 핵심 운영 요소입니다. 재고가 실제로 있는데 시스템에서 "품절"로 표시되면 판매 기회를 놓치게 되고, 반대로 재고가 없는데 주문이 들어오면 취소 처리와 함께 고객 신뢰가 크게 하락합니다. 이러한 불일치 문제는 수동 관리 환경에서 빈번하게 발생하며, 쇼핑몰 규모가 커질수록 그 빈도와 피해 규모도 기하급수적으로 증가합니다.


미국 IHL 그룹의 조사에 따르면, 전 세계 소매업체들이 과잉재고와 품절로 인해 매년 약 1.8조 달러(약 2,400조 원)의 손실을 입고 있습니다. 과잉재고는 보관 비용, 감가상각, 폐기 비용을 발생시키고, 품절은 직접적인 매출 손실과 고객 이탈로 이어집니다. 특히 온라인 쇼핑에서 품절을 경험한 고객의 약 70%는 경쟁사 사이트로 바로 이동한다는 통계가 있으며, 이 중 상당수는 다시 돌아오지 않습니다.


WooCommerce 기반 쇼핑몰에서 재고 관리를 자동화하면 이런 문제를 근본적으로 해결할 수 있습니다. WordPress의 훅 시스템과 WP-Cron, REST API를 활용하면 외부 ERP/창고 시스템과 실시간으로 재고를 동기화하고, 저재고 시 자동으로 담당자에게 알림을 보내며, 판매 데이터를 기반으로 미래 수요까지 예측할 수 있습니다. 이 모든 것을 플러그인 없이 코드 레벨에서 구현하는 방법을 이 레슨에서 상세히 다룹니다.

📦
1.8조 $
연간 과잉재고/품절 글로벌 손실액
🚫
70%
품절 경험 후 경쟁사 이동 고객 비율
⏱️
85%
자동화로 절감 가능한 재고 관리 시간
📈
25~35%
재고 최적화 후 평균 수익성 개선율

재고 관리 자동화의 핵심 원칙

재고 자동화를 구축할 때 가장 중요한 원칙은 "단일 진실 소스(Single Source of Truth)"입니다. 여러 채널에서 재고를 관리할 때 어느 시스템의 재고 수량이 "진짜"인지를 명확히 정해야 합니다. 일반적으로 ERP 또는 WMS(창고관리시스템)가 마스터가 되고, WooCommerce를 포함한 판매 채널들은 이 마스터 데이터를 읽어가는 구조가 바람직합니다. 마스터 없이 양방향 동기화만 하면 충돌과 데이터 불일치가 반드시 발생합니다.

재고 관리 자동화로 해결할 수 있는 문제들

과잉재고 문제: 수요 예측 없이 "감"으로 발주하면 재고가 쌓입니다. 보관 비용은 월 매입가의 2~3%에 달하며, 시즌 상품의 경우 시즌이 지나면 원가의 30~50%까지 가치가 하락합니다. 자동화 시스템은 과거 판매 데이터를 분석하여 적정 발주량을 계산해줍니다.


품절 문제: 인기 상품이 예상보다 빨리 소진되면 재입고까지 매출 공백이 발생합니다. 저재고 알림을 자동화하면 재입고 리드타임을 고려한 적정 시점에 발주할 수 있어 품절 기간을 최소화할 수 있습니다.


멀티 채널 불일치: 자사몰, 쿠팡, 스마트스토어 등 여러 채널에서 동시에 판매할 때 한 채널에서 마지막 1개가 팔렸는데 다른 채널에서도 주문이 들어오는 "오버셀링" 문제가 빈번합니다. 실시간 동기화로 모든 채널의 재고를 일관되게 유지해야 합니다.


인적 오류: 수동 입력 시 숫자 오타, 상품 혼동 등의 실수가 발생합니다. 바코드/SKU 기반 자동 처리는 이러한 인적 오류를 거의 완전히 제거합니다.

WooCommerce 재고 관리 훅 완전 가이드

재고 관련 핵심 액션 훅과 필터 훅

WooCommerce는 재고 수량이 변경되는 모든 시점에 훅을 제공합니다. 주문 생성, 결제 완료, 환불 처리, 관리자 수동 변경 등 모든 재고 변동 이벤트를 코드에서 감지하고 처리할 수 있습니다. 아래에서 가장 중요한 재고 관련 훅들을 체계적으로 정리합니다.


woocommerce_product_set_stock는 상품의 재고 수량이 변경될 때마다 실행되는 가장 범용적인 훅입니다. 주문에 의한 차감, 환불에 의한 복구, 관리자 수동 변경 등 모든 경우에 트리거됩니다. woocommerce_reduce_order_stock는 주문으로 인해 재고가 차감되는 시점에만 실행되며, 주문 객체와 상품 정보를 함께 전달받을 수 있어서 "어떤 주문 때문에 재고가 줄었는지"를 추적할 수 있습니다.


woocommerce_low_stockwoocommerce_no_stock는 각각 저재고 임계값 이하로 떨어질 때와 재고가 0이 될 때 실행됩니다. 이 두 훅은 알림 시스템 구축에 핵심적입니다. woocommerce_restore_order_stock는 주문 취소나 환불 시 재고가 복구될 때 실행됩니다.

// ── 1. 재고 수량 변경 통합 감지 (모든 재고 변동 이벤트) ── add_action('woocommerce_product_set_stock', function($product) { $stock = $product->get_stock_quantity(); $name = $product->get_name(); $sku = $product->get_sku(); // 재고 변동 로그 기록 (감사 추적용) global $wpdb; $wpdb->insert($wpdb->prefix . 'stock_audit_log', [ 'product_id' => $product->get_id(), 'sku' => $sku, 'product_name' => $name, 'new_quantity' => $stock, 'changed_by' => get_current_user_id() ?: 'system', 'change_source' => current_action(), 'created_at' => current_time('mysql'), ]); error_log("[재고변동] {$name} (SKU: {$sku}): 재고 {$stock}개로 변경"); // 저재고 임계값 체크 $low_threshold = get_post_meta($product->get_id(), '_low_stock_amount', true); if (!$low_threshold) { $low_threshold = get_option('woocommerce_notify_low_stock_amount', 5); } if ($stock $low_threshold && $stock > 0) { do_action('map_custom_low_stock_alert', $product, $stock, $low_threshold); } if ($stock do_action('map_custom_out_of_stock', $product); } }); // ── 2. 주문에 의한 재고 차감 추적 ── add_action('woocommerce_reduce_order_stock', function($order) { $order_id = $order->get_id(); foreach ($order->get_items() as $item) { $product = $item->get_product(); $qty = $item->get_quantity(); $remaining = $product->get_stock_quantity(); error_log(sprintf( '[주문재고] 주문 #%d: %s(SKU:%s) %d개 차감 → 잔여 %d개', $order_id, $product->get_name(), $product->get_sku(), $qty, $remaining )); // 외부 시스템에 재고 변동 알림 (웹훅) do_action('map_notify_external_stock_change', [ 'sku' => $product->get_sku(), 'qty_sold' => $qty, 'remaining' => $remaining, 'order_id' => $order_id, ]); } }); // ── 3. 저재고 및 품절 알림 훅 ── add_action('woocommerce_low_stock', function($product) { $message = sprintf( "⚠️ 저재고 경고\n상품: %s\nSKU: %s\n현재 재고: %d개\n관리 링크: %s", $product->get_name(), $product->get_sku(), $product->get_stock_quantity(), admin_url('post.php?post=' . $product->get_id() . '&action=edit') ); map_send_multi_channel_alert($message, 'warning'); }); add_action('woocommerce_no_stock', function($product) { $message = sprintf( "🚫 품절 발생!\n상품: %s\nSKU: %s\n즉시 재입고가 필요합니다.\n관리 링크: %s", $product->get_name(), $product->get_sku(), admin_url('post.php?post=' . $product->get_id() . '&action=edit') ); map_send_multi_channel_alert($message, 'critical'); }); // ── 4. 주문 취소/환불 시 재고 복구 ── add_action('woocommerce_restore_order_stock', function($order) { $order_id = $order->get_id(); error_log("[재고복구] 주문 #{$order_id} 재고 복구됨"); foreach ($order->get_items() as $item) { $product = $item->get_product(); if ($product && $product->get_stock_status() === 'outofstock') { $product->set_stock_status('instock'); $product->save(); } } });
훅 이름 실행 시점 전달 파라미터 주요 용도
woocommerce_product_set_stock 재고 수량이 변경될 때마다 $product (WC_Product) 범용 재고 변동 감지, 로그 기록
woocommerce_reduce_order_stock 주문으로 재고가 차감될 때 $order (WC_Order) 주문-재고 연결 추적, 외부 알림
woocommerce_restore_order_stock 주문 취소/환불로 재고 복구 시 $order (WC_Order) 재고 복구 로그, 상태 자동 변경
woocommerce_low_stock 저재고 임계값 이하로 떨어질 때 $product (WC_Product) 저재고 알림 발송
woocommerce_no_stock 재고가 0이 될 때 $product (WC_Product) 품절 긴급 알림, 상품 숨김 처리
woocommerce_variation_set_stock 변형 상품 재고가 변경될 때 $variation (WC_Product_Variation) 변형별 재고 추적
🔒
여기까지는 미리보기입니다
재고 자동 업데이트 시스템
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)