1. 연동 개요
화면 단위 API 개발의 비효율성을 해소하고, 퍼널 중심의 동적 데이터 활용 체계를 구축합니다.
리소스 테이블 기반의 표준 API 모델을 정립하여 향후 확장 가능한 구조를 만듭니다.
배경
- 화면 단위 API 개발은 건별 비용, 확장성, 유지보수 측면에서 비효율적
- DB 직접 접근은 보안 리스크 및 비즈니스 로직 누락 위험 존재
- 표준화된 API를 통한 안전하고 확장 가능한 데이터 통신 필요
기대 효과
- 차일디: AI 기반 수요 예측, 발주 최적화, 재고 건전성 확보
- 세원: 표준 API 모델 확보로 타 고객사 유료 옵션 제공 가능
2. 단계별 개발 로드맵
조회 전용 API
운영 DB 부하를 최소화하면서 필요한 데이터를 호출하는 읽기 전용 인터페이스 구축
상태 변경 API
입고 확정, 출고 처리 등 기존 데이터의 상태를 변경하는 비즈니스 로직 연동
생성 API
신규 데이터 생성을 포함한 완전한 CRU 기능 구현 (삭제는 데이터 무결성 보호를 위해 제외)
3. 도메인 구성
세원 시스템과의 데이터 연동은 5개의 핵심 도메인으로 구성됩니다. 각 도메인은 독립적인 API 세트를 제공하며, 차일디 시스템의 AI 기반 분석 및 최적화 기능을 지원합니다.
상품
상품 등록/수정/조회, 카테고리, 속성 정보
원가
사전/사후 원가 정보 관리 및 비교
입출고
품번 일자별 입고, 출고 데이터
재고
매장/창고별 실시간 재고
판매
주문, 취소/반품, 매출 내역
4. 공통 규격
4.1 인증 방식
모든 API 요청 시 Bearer 토큰 방식의 인증이 필요합니다.
요청 헤더
Authorization: Bearer {access_token}
Content-Type: application/json
4.2 에러 응답 형식
API 오류 발생 시 표준화된 에러 응답을 반환합니다.
에러 응답 예시
{
"success": false,
"error": {
"code": "INVALID_PARAMETER",
"message": "brand_code는 필수 파라미터입니다.",
"details": {
"field": "brand_code",
"reason": "required"
}
}
}
주요 에러 코드
| 코드 | 설명 |
|---|---|
| INVALID_PARAMETER | 잘못된 파라미터 |
| UNAUTHORIZED | 인증 실패 |
| NOT_FOUND | 리소스를 찾을 수 없음 |
| INTERNAL_ERROR | 서버 내부 오류 |
4.3 페이지네이션
모든 목록 조회 API는 페이지네이션을 지원합니다.
| 파라미터 | 설명 | 기본값 |
|---|---|---|
| page | 페이지 번호 (1부터 시작) | 1 |
| limit | 페이지당 건수 | 100 (최대: 1000) |
4.4 날짜/시간 형식
| 타입 | 형식 | 예시 |
|---|---|---|
| 날짜 | YYYY-MM-DD | 2026-03-04 |
| 날짜시간 | ISO 8601 | 2026-03-04T15:30:00Z |
5. 상품(Product) API
5.1 상품 목록 조회
상품 마스터 정보를 조회합니다. 브랜드, 시즌, 품번 등으로 필터링 가능합니다.
요청 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| brand_code | string | 선택 | 브랜드 코드 (예: HR) |
| season | string | 선택 | 시즌 (예: 2026) |
| product_name | string | 선택 | 상품명 (부분 검색 가능) |
| main_category | string | 선택 | 대복종 |
| sub_category | string | 선택 | 소복종 |
| style_no | string | 선택 | 품번 (STYLE NO) |
| page | integer | 선택 | 페이지 번호 (기본값: 1) |
| limit | integer | 선택 | 페이지당 건수 (기본값: 100) |
응답 예시
{
"success": true,
"data": {
"total": 8009,
"page": 1,
"limit": 100,
"items": [
{
"style_no": "9N62S2S03",
"product_name": "산수화 자수 셔츠",
"brand_code": "HR",
"brand_name": "헤지스",
"season": "2026",
"color": "OTMU",
"color_name": "오트밀",
"size": "140",
"main_category": "상의",
"sub_category": "셔츠",
"supplier": "로제스",
"production_type": "완사입",
"retail_price": 100000,
"image_url": "https://...",
"created_at": "2026-03-04T10:00:00Z",
"updated_at": "2026-03-04T10:00:00Z"
}
]
}
}
5.2 상품 상세 조회
특정 품번의 상세 정보를 조회합니다. 컬러별, 사이즈별 SKU 정보를 포함합니다.
응답 예시
{
"success": true,
"data": {
"style_no": "9N62S2S03",
"product_name": "산수화 자수 셔츠",
"brand_code": "HR",
"brand_name": "헤지스",
"season": "2026",
"colors": [
{
"color_code": "OTMU",
"color_name": "오트밀",
"sizes": [
{"size": "140", "sku": "9N62S2S03-OTMU-140"},
{"size": "150", "sku": "9N62S2S03-OTMU-150"}
]
}
],
"main_category": "상의",
"sub_category": "셔츠",
"supplier": "로제스",
"production_type": "완사입",
"retail_price": 100000,
"attributes": {
"fabric": "면 100%",
"origin": "중국"
}
}
}
5.3 상품 등록3단계
신규 상품을 등록합니다.
요청 본문
{
"style_no": "9N62S2S03",
"product_name": "산수화 자수 셔츠",
"brand_code": "HR",
"season": "2026",
"main_category": "상의",
"sub_category": "셔츠",
"supplier": "로제스",
"production_type": "완사입",
"retail_price": 100000,
"variants": [
{
"color_code": "OTMU",
"color_name": "오트밀",
"size": "140",
"sku": "9N62S2S03-OTMU-140"
}
]
}
5.4 상품 수정3단계
기존 상품 정보를 수정합니다.
5.5 카테고리 목록 조회
상품 카테고리 목록을 조회합니다. 대복종과 소복종 계층 구조로 제공됩니다.
응답 예시
{
"success": true,
"data": {
"categories": [
{
"main_category": "상의",
"sub_categories": [
{"code": "SHIRT", "name": "셔츠"},
{"code": "TSHIRT", "name": "티셔츠"},
{"code": "KNIT", "name": "니트"}
]
},
{
"main_category": "하의",
"sub_categories": [
{"code": "PANTS", "name": "팬츠"},
{"code": "JEANS", "name": "청바지"}
]
},
{
"main_category": "아우터",
"sub_categories": [
{"code": "JACKET", "name": "재킷"},
{"code": "COAT", "name": "코트"}
]
}
]
}
}
6. 원가(Cost) API
6.1 사전원가 조회
상품의 사전원가 정보를 조회합니다.
응답 예시
{
"success": true,
"data": {
"style_no": "9N62S2S03",
"cost_type": "pre",
"raw_material": 15000,
"sub_material": 3000,
"processing": 8000,
"label_sticker": 500,
"tag": 300,
"labor": 12000,
"customs": 2000,
"logistics": 2200,
"margin": 57000,
"total_cost": 43000,
"retail_price": 100000,
"margin_rate": 57.0,
"updated_at": "2026-03-04T10:00:00Z"
}
}
6.2 사후원가 조회
상품의 사후원가(실제 발생 원가) 정보를 조회합니다.
응답 예시
{
"success": true,
"data": {
"style_no": "9N62S2S03",
"cost_type": "post",
"raw_material": 15500,
"sub_material": 3200,
"processing": 8500,
"label_sticker": 500,
"tag": 300,
"labor": 12500,
"customs": 2100,
"logistics": 2400,
"margin": 55000,
"total_cost": 45000,
"retail_price": 100000,
"margin_rate": 55.0,
"variance": 2000,
"updated_at": "2026-04-01T10:00:00Z"
}
}
6.3 원가 등록/수정2단계
상품의 원가 정보를 등록하거나 수정합니다.
요청 본문
{
"style_no": "9N62S2S03",
"cost_type": "pre",
"raw_material": 15000,
"sub_material": 3000,
"processing": 8000,
"label_sticker": 500,
"tag": 300,
"labor": 12000,
"customs": 2000,
"logistics": 2200,
"note": "2026 SS 시즌 사전원가"
}
원가 항목 설명
| 항목 | 설명 |
|---|---|
| raw_material | 원자재 비용 (원단 등) |
| sub_material | 부자재 비용 (단추, 지퍼 등) |
| processing | 가공비 (염색, 워싱 등) |
| label_sticker | 라벨/스티커 비용 |
| tag | 택/택고리 비용 |
| labor | 공임 (봉제비 등) |
| customs | 관세 |
| logistics | 물류/경비 |
6.4 사전/사후 원가 비교
사전원가와 사후원가를 비교하여 차이를 분석합니다.
응답 예시
{
"success": true,
"data": {
"style_no": "9N62S2S03",
"pre_cost": {
"total": 43000,
"margin_rate": 57.0
},
"post_cost": {
"total": 45000,
"margin_rate": 55.0
},
"variance": {
"amount": 2000,
"percentage": 4.65,
"items": {
"raw_material": 500,
"processing": 500,
"labor": 500,
"logistics": 200
}
}
}
}
7. 입출고(Inbound/Outbound) API
7.1 입고 내역 조회
일자별 입고 데이터를 조회합니다. 적정 발주 시점 파악에 활용됩니다.
요청 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| start_date | date | 필수 | 조회 시작일 (YYYY-MM-DD) |
| end_date | date | 필수 | 조회 종료일 (YYYY-MM-DD) |
| brand_code | string | 선택 | 브랜드 코드 |
| style_no | string | 선택 | 품번 |
| store_code | string | 선택 | 매장 코드 |
응답 예시
{
"success": true,
"data": {
"items": [
{
"inbound_no": "IB20260304001",
"inbound_date": "2026-03-04",
"style_no": "9N62S2S03",
"product_name": "산수화 자수 셔츠",
"color": "OTMU",
"size": "140",
"sku": "9N62S2S03-OTMU-140",
"quantity": 100,
"store_code": "WH001",
"store_name": "본사창고",
"supplier": "로제스",
"status": "confirmed",
"created_at": "2026-03-04T09:00:00Z"
}
]
}
}
7.2 출고 내역 조회
일자별 출고 데이터를 조회합니다. 수요량 동적 파악에 활용됩니다.
요청 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| start_date | date | 필수 | 조회 시작일 |
| end_date | date | 필수 | 조회 종료일 |
| brand_code | string | 선택 | 브랜드 코드 |
| style_no | string | 선택 | 품번 |
| channel | string | 선택 | 판매 채널 |
| store_code | string | 선택 | 매장 코드 |
응답 예시
{
"success": true,
"data": {
"items": [
{
"outbound_no": "OB20260304001",
"outbound_date": "2026-03-04",
"order_no": "ORD20260304001",
"style_no": "9N62S2S03",
"sku": "9N62S2S03-OTMU-140",
"quantity": 1,
"channel": "온라인몰",
"store_code": "WH001",
"store_name": "본사창고",
"status": "shipped"
}
]
}
}
7.3 입고 확정 처리2단계
입고 예정 건을 확정 처리합니다.
요청 본문
{
"confirmed_quantity": 100,
"confirmed_by": "홍길동",
"note": "정상 입고"
}
8. 재고(Inventory) API
8.1 실시간 재고 조회
매장/창고별 실시간 재고를 조회합니다. 결품 방지 및 악성 재고 탐지에 활용됩니다.
요청 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| brand_code | string | 선택 | 브랜드 코드 |
| style_no | string | 선택 | 품번 |
| store_code | string | 선택 | 매장 코드 |
| sku | string | 선택 | SKU |
응답 예시
{
"success": true,
"data": {
"items": [
{
"sku": "9N62S2S03-OTMU-140",
"style_no": "9N62S2S03",
"product_name": "산수화 자수 셔츠",
"color": "OTMU",
"size": "140",
"store_code": "WH001",
"store_name": "본사창고",
"available_quantity": 95,
"allocated_quantity": 5,
"total_quantity": 100,
"last_updated": "2026-03-04T15:30:00Z"
}
]
}
}
8.2 매장별 재고 현황
매장별 재고 집계 정보를 조회합니다.
응답 예시
{
"success": true,
"data": {
"stores": [
{
"store_code": "WH001",
"store_name": "본사창고",
"store_type": "창고",
"total_skus": 1657,
"total_quantity": 22809,
"inventory_value": 489680000
},
{
"store_code": "ST001",
"store_name": "강남점",
"store_type": "매장",
"total_skus": 450,
"total_quantity": 3200,
"inventory_value": 85000000
}
]
}
}
8.3 재고 수불부 조회
재고 수불 이력을 조회합니다. 입고/출고/조정 내역을 시계열로 확인할 수 있습니다.
요청 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| start_date | date | 필수 | 조회 시작일 |
| end_date | date | 필수 | 조회 종료일 |
| sku | string | 선택 | SKU |
| transaction_type | string | 선택 | 거래 유형 (입고/출고/조정) |
응답 예시
{
"success": true,
"data": {
"items": [
{
"transaction_date": "2026-03-04",
"sku": "9N62S2S03-OTMU-140",
"transaction_type": "입고",
"quantity": 100,
"balance_before": 0,
"balance_after": 100,
"reference_no": "IB20260304001",
"store_code": "WH001",
"store_name": "본사창고"
},
{
"transaction_date": "2026-03-04",
"sku": "9N62S2S03-OTMU-140",
"transaction_type": "출고",
"quantity": -5,
"balance_before": 100,
"balance_after": 95,
"reference_no": "OB20260304001",
"store_code": "WH001",
"store_name": "본사창고"
}
]
}
}
9. 판매(Sales) API
9.1 주문 내역 조회
주문 내역을 조회합니다. 채널별 수익성 분석에 활용됩니다.
요청 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| start_date | date | 필수 | 조회 시작일 |
| end_date | date | 필수 | 조회 종료일 |
| channel | string | 선택 | 판매 채널 |
| status | string | 선택 | 주문 상태 |
| brand_code | string | 선택 | 브랜드 코드 |
| style_no | string | 선택 | 품번 |
| store_code | string | 선택 | 매장 코드 |
응답 예시
{
"success": true,
"data": {
"items": [
{
"order_no": "ORD20260304001",
"order_date": "2026-03-04T14:20:00Z",
"channel": "온라인몰",
"customer_name": "[고객명]",
"items": [
{
"sku": "9N62S2S03-OTMU-140",
"product_name": "산수화 자수 셔츠",
"quantity": 1,
"unit_price": 100000,
"discount": 10000,
"final_price": 90000
}
],
"total_amount": 90000,
"status": "confirmed"
}
]
}
}
9.2 취소/반품 내역 조회
취소 및 반품 내역을 조회합니다.
요청 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| start_date | date | 필수 | 조회 시작일 |
| end_date | date | 필수 | 조회 종료일 |
| return_type | string | 선택 | 반품 유형 (취소/반품) |
| brand_code | string | 선택 | 브랜드 코드 |
| style_no | string | 선택 | 품번 |
| store_code | string | 선택 | 매장 코드 |
응답 예시
{
"success": true,
"data": {
"items": [
{
"return_no": "RT20260304001",
"order_no": "ORD20260304001",
"return_date": "2026-03-05",
"return_type": "반품",
"reason": "사이즈 불만",
"sku": "9N62S2S03-OTMU-140",
"quantity": 1,
"refund_amount": 90000,
"status": "completed"
}
]
}
}
9.3 매출 집계 조회
일별/월별/채널별 매출 집계를 조회합니다. 마케팅 인사이트 도출에 활용됩니다.
요청 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| start_date | date | 필수 | 조회 시작일 |
| end_date | date | 필수 | 조회 종료일 |
| group_by | string | 선택 | 집계 기준 (daily/monthly/channel/brand/store/style) |
| brand_code | string | 선택 | 브랜드 코드 |
| style_no | string | 선택 | 품번 |
| store_code | string | 선택 | 매장 코드 |
응답 예시
{
"success": true,
"data": {
"summary": [
{
"date": "2026-03-04",
"brand_code": "HR",
"brand_name": "헤지스",
"channel": "온라인몰",
"store_code": "ST001",
"store_name": "강남점",
"order_count": 150,
"total_quantity": 200,
"gross_sales": 15000000,
"discount": 1500000,
"net_sales": 13500000,
"return_count": 5,
"return_amount": 500000,
"cancel_count": 3,
"cancel_amount": 300000
}
]
}
}
10. Webhook 이벤트
세원 시스템에서 특정 이벤트 발생 시, 차일디 서버로 실시간 알림을 전송하는 방식입니다. 주기적인 폴링 없이 즉각적인 데이터 동기화가 가능합니다.
10.1 재고 변동 알림
재고 수량이 변경될 때마다 차일디 서버로 알림을 전송합니다.
Payload 예시
{
"event": "inventory.changed",
"timestamp": "2026-03-04T15:30:00Z",
"data": {
"sku": "9N62S2S03-OTMU-140",
"store_code": "WH001",
"store_name": "본사창고",
"previous_quantity": 100,
"current_quantity": 95,
"change_type": "출고",
"reference_no": "OB20260304001"
}
}
10.2 주문 생성 알림
신규 주문이 생성될 때 알림을 전송합니다.
Payload 예시
{
"event": "order.created",
"timestamp": "2026-03-04T14:20:00Z",
"data": {
"order_no": "ORD20260304001",
"channel": "온라인몰",
"total_amount": 90000,
"items": [
{
"sku": "9N62S2S03-OTMU-140",
"quantity": 1
}
]
}
}
10.3 입고 완료 알림
입고가 완료될 때 알림을 전송합니다.
Payload 예시
{
"event": "inbound.completed",
"timestamp": "2026-03-04T09:30:00Z",
"data": {
"inbound_no": "IB20260304001",
"style_no": "9N62S2S03",
"total_quantity": 100,
"store_code": "WH001",
"store_name": "본사창고"
}
}
11. 세원측 제공 필요 자료
원활한 API 개발을 위해 세원측에서 아래 자료 제공이 필요합니다.
우선순위 높음
1. 핵심 테이블 샘플 데이터 (5~10건)
- 상품 마스터 테이블
- 원가 정보 테이블 (사전/사후)
- 재고 수불부 테이블
- 입출고 테이블
- 주문/판매 테이블
2. 기존 연동 사례
- 카페24, 무신사 등 타 시스템 연동 API 프로토콜
- 표준 API 문서 (있는 경우)
우선순위 중간
1. 테이블 구조 정보
- ERD 또는 테이블 정의서 (간략 버전)
- 주요 필드 설명 및 데이터 타입
2. 코드 정보
- 브랜드 코드 목록 (예: HR, LF 등)
- 매장 코드 목록 (창고 및 매장 구분 포함)
- 상태 코드 정의 (주문, 입고, 출고 등)
- 채널 코드 목록 (온라인몰, 오프라인 등)
- 대복종/소복종 코드 목록
기술 검토 사항
| 항목 | 설명 |
|---|---|
| Webhook 지원 | 실시간 이벤트 알림 기능 지원 가능 여부 |
| API Rate Limit | API 호출 제한 정책 (분당/시간당 요청 수) |
| 개발 환경 | 개발/스테이징 환경 제공 여부 |
| 보안 정책 | IP 화이트리스트, SSL 인증서 등 |