무신사
경력근거: 재고 원장과 가용 재고 계산, Promise 산출 같은 과제를 맡아 요구사항 정리부터 배포·운영까지 책임집니다.
※ 실제 산출물이 아닌 AI 예측 시안입니다.
무신사는 무신사 스토어·29CM·무신사 글로벌 스토어 같은 여러 쇼핑 플랫폼을 한 법인이 운영하는 패션 커머스예요. 국내외 패션 소비자에게 입점 브랜드 상품을 중개해 팔고, 직매입 상품과 자체 브랜드 상품도 직접 팔아요.
공고는 Core Catalog 가 '어떤 플랫폼에서도 동일한 재고 인프라를 사용할 수 있는 기반을 만들어가고 있습니다'라고 쓰고, 이 자리가 맡을 과제로 '재고 원장과 가용 재고 계산'을 꼽아요. 여러 플랫폼이 한 재고에서 팔면, 한 플랫폼 화면만 봐서는 다른 플랫폼에서 결제됐지만 아직 출고되지 않은 주문을 알 수 없어요. 창고의 실물도 출고·반품 검수·불량 판정이 생길 때마다 바뀌어서, 몇 개를 더 팔 수 있는지는 그 시각까지의 원장과 주문을 함께 봐야 알 수 있어요.
공고는 통합 카탈로그와 CIAP 재고·Promise 플랫폼의 핵심 도메인을 설계·구현하는 일을 이 자리에 맡기고, 과제로 재고 원장과 가용 재고 계산, Promise 산출을 꼽아요. 요구사항 정리부터 배포·운영까지 이 자리가 책임져요.
공고는 Core Catalog 가 재고와 배송약속 시스템을 전 플랫폼이 공유하는 단일 엔진(CIAP)으로 통합해, 어떤 플랫폼에서도 같은 재고 인프라를 쓰는 기반을 만들고 있다고 적어요. 무신사가 단일 플랫폼을 넘어 29CM·글로벌 등 여러 플랫폼으로 넓혀 왔다는 설명이 앞에 있어요.
자격 요건에 대용량 데이터 환경에서 확장성과 데이터 정합성을 고려한 RDBMS 설계·성능 최적화 경험을 적고, 우대사항으로 재고 원장(Ledger) 같은 커머스 코어 시스템을 개발·운영한 경험을 꼽아요.
상품 운영 담당자가 판매 상태를 점검하는 회차마다 여는 관리자 페이지예요. 무신사 스토어·29CM·글로벌 스토어에서 함께 파는 옵션마다 그 회차에 몇 개를 더 팔 수 있는지 알려 주고, 실물보다 많이 팔린 옵션에는 어느 플랫폼의 어떤 주문을 보내지 못하는지, 반품 검수를 기다리는 옵션에는 검수 전 반품이 몇 개인지 보여 줘요. 받은 실사·원장·주문 기록을 담을 DB 설계와, 회차마다 판매 가능 수량을 다시 세는 기술·구조는 지원자가 정해요.
무신사 스토어·29CM·글로벌 스토어에서 함께 파는 상품의 판매 상태를 맡은 상품 운영 담당자예요. 한 재고를 여러 플랫폼 주문이 함께 쓰면 창고에 남은 수량만 봐서는 다른 플랫폼에서 결제됐지만 아직 나가지 않은 주문, 검수를 기다리는 반품, 방금 불량으로 빠진 수량을 함께 맞춰 볼 수 없어서, 옵션을 열어 둘지 닫을지와 보내지 못할 주문이 몇 건인지 바로 알기 어려워요.
세 플랫폼에서 함께 파는 상품의 옵션이에요. 한 행이 옵션 하나(상품의 색상·사이즈 하나)이고 sku_id 가 키예요. 이 데이터에서는 같은 옵션이 무신사 스토어·29CM·글로벌 스토어 어디서 팔려도 같은 sku_id 이고, 창고 한 곳의 같은 재고를 써요. product_id·product_name 은 옵션이 속한 상품, option_name 은 색상과 사이즈, brand_id 는 상품의 브랜드예요. 옵션은 product_name 과 option_name 두 칸으로 가르고, 이름 앞부분이 같은 다른 상품(오버핏 후드 티셔츠와 오버핏 후드 집업)과 상품은 같고 옵션만 다른 행(그레이 L 과 그레이 XL, 블랙 M 과 블랙 L)이 들어 있어요. 큰 데이터는 브랜드 100곳의 옵션 1,200개 전부이고, 시작용은 그 가운데 브랜드 BR-0731 의 옵션 10개 전부를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 10행 가운데 앞 5행이에요.
| sku_id | product_id | product_name | option_name | brand_id |
|---|---|---|---|---|
| SK-100681 | PD-100300 | 오버핏 후드 티셔츠 | 그레이 L | BR-0731 |
| SK-100682 | PD-100300 | 오버핏 후드 티셔츠 | 그레이 XL | BR-0731 |
| SK-100683 | PD-100301 | 오버핏 후드 집업 | 그레이 L | BR-0731 |
| SK-100684 | PD-100302 | 와이드 데님 팬츠 | 인디고 30 | BR-0731 |
| SK-100685 | PD-100302 | 와이드 데님 팬츠 | 인디고 32 | BR-0731 |
10행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 1,200행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "옵션 하나(상품의 색상·사이즈 하나). 키는 sku_id.",
"additionalProperties": false,
"required": [
"sku_id",
"product_id",
"product_name",
"option_name",
"brand_id"
],
"properties": {
"sku_id": {
"type": "string",
"pattern": "^SK-[0-9]{6}$",
"description": "옵션 코드. 이 표의 키예요. 무신사 스토어·29CM·글로벌 스토어 어디서 팔려도 같은 코드예요."
},
"product_id": {
"type": "string",
"pattern": "^PD-[0-9]{6}$",
"description": "이 옵션이 속한 상품 코드. 한 상품에 옵션이 여러 개 있어요."
},
"product_name": {
"type": "string",
"description": "상품 이름. 같은 상품의 옵션은 같은 글자로 적혀 있어요."
},
"option_name": {
"type": "string",
"description": "색상과 사이즈(예: 그레이 L). product_name 과 이 칸 두 개로 옵션을 갈라요."
},
"brand_id": {
"type": "string",
"pattern": "^BR-[0-9]{4}$",
"description": "상품의 브랜드 코드."
}
}
}창고에서 옵션마다 판매할 수 있는 실물을 직접 센 기록이에요. 한 행이 한 옵션의 실사 한 번이고 count_id 가 키예요. sku_id 는 skus.sku_id 를 가리켜요. counted_qty 는 그 시각 창고에 있던 판매 가능한 실물 개수로, 아직 출고되지 않은 주문 몫은 들어 있고 검수를 기다리는 반품은 들어 있지 않아요. 이 데이터에서는 실사 수량이 그 시각의 실물 수량이 되고, 실사가 그 전 원장으로 센 수량과 어긋난 만큼은 원장에 따로 적지 않아요. counted_at 은 창고 시스템 시계로 찍은 시각이에요. 실사는 창고 작업이 없는 07:00 에 해서 같은 옵션의 같은 시각 원장 줄은 없어요. 첫날 07:00 에 모든 옵션을 셌고(아직 입고 전인 옵션은 0), 그 뒤로는 브랜드마다 1주일에 한 번 그 브랜드의 옵션을 한꺼번에 세요. 실사 수량이 그 전 원장으로 센 수량보다 적거나 많은 옵션이 들어 있어요. 큰 데이터는 8월 3일부터 10월 28일까지의 실사 전부이고, 시작용은 BR-0731 옵션 10개의 10월 28일 07:00 실사 전부예요.
전체 10행 가운데 앞 5행이에요.
| count_id | sku_id | counted_qty | counted_at |
|---|---|---|---|
| CT-1015819 | SK-100681 | 27 | 2026-10-28T07:00:00+09:00 |
| CT-1015820 | SK-100682 | 3 | 2026-10-28T07:00:00+09:00 |
| CT-1015821 | SK-100683 | 37 | 2026-10-28T07:00:00+09:00 |
| CT-1015822 | SK-100684 | 13 | 2026-10-28T07:00:00+09:00 |
| CT-1015823 | SK-100685 | 8 | 2026-10-28T07:00:00+09:00 |
10행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 15,931행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "한 옵션의 재고 실사 한 번. 키는 count_id.",
"additionalProperties": false,
"required": [
"count_id",
"sku_id",
"counted_qty",
"counted_at"
],
"properties": {
"count_id": {
"type": "string",
"pattern": "^CT-[0-9]{7}$",
"description": "실사 번호. 이 표의 키예요."
},
"sku_id": {
"type": "string",
"pattern": "^SK-[0-9]{6}$",
"description": "센 옵션. skus.sku_id 를 가리켜요."
},
"counted_qty": {
"type": "integer",
"minimum": 0,
"description": "그 시각 창고에 있던 판매할 수 있는 실물 개수. 아직 출고되지 않은 주문 몫은 들어 있고, 검수를 기다리는 반품은 들어 있지 않아요. 이 수량이 그 시각의 실물 수량이에요."
},
"counted_at": {
"type": "string",
"format": "date-time",
"description": "실사 시각. 창고 시스템 시계, 한국 시간(+09:00) ISO 8601, 초 단위. 늘 07:00:00 이고 같은 옵션의 같은 시각 원장 줄은 없어요."
}
}
}창고에서 옵션의 실물이 움직일 때마다 한 줄씩 쌓인 기록이에요. 한 행이 움직임 한 번이고 ledger_id 가 키예요. sku_id 는 skus.sku_id 를, order_line_id 는 orders.order_line_id 를 가리켜요. event_type 은 inbound(입고), outbound(주문 한 줄의 출고), adjustment(재고 조정), return_received(반품이 창고에 도착), return_inspected(반품 검수 완료) 다섯 가지예요. quantity 는 움직인 개수로, adjustment 만 부호가 있고(불량 판정·분실은 음수, 되찾음은 양수) 나머지는 0 이상이에요. outbound·return_received·return_inspected 에는 order_line_id 가 있고 inbound·adjustment 는 null 이에요. 주문 한 줄은 한 번에 그 수량 전부가 출고되고, 출고는 실물이 있을 때만 일어나요. 반품은 도착 줄과 검수 완료 줄이 같은 order_line_id 로 따로 남고, 검수를 마쳐야 다시 팔 수 있는 실물이 돼요. 한 주문 줄의 반품은 도착 줄 하나와, 검수를 마쳤으면 검수 완료 줄 하나로 한 번만 남아요. return_inspected 의 quantity 는 검수를 통과한 개수라 도착한 개수보다 적을 수 있어요. reason 은 adjustment 에만 있고(defect 불량 판정, missing 분실, found 되찾음) 나머지는 null 이에요. occurred_at 은 창고 시스템 시계로 찍은 시각이에요. 출고 전 주문이 남은 채 불량 판정으로 실물이 줄어든 옵션, 품절됐다가 다시 입고된 옵션, 반품 검수에서 일부만 통과한 옵션, 실사 뒤로 줄이 하나도 없는 옵션이 들어 있어요. 큰 데이터는 8월 3일 07:00 부터 10월 28일 23:59 까지 옵션 1,200개의 원장 전부이고, 시작용은 BR-0731 옵션 10개의 10월 28일 07:00 실사 뒤 14:00 까지의 줄 전부와, 그 실사 때 아직 검수를 기다리던 반품의 도착 줄, 그리고 시작용의 반품 도착·검수 완료 줄이 가리키는 주문 줄의 출고 줄이에요.
전체 39행 가운데 앞 5행이에요.
| ledger_id | sku_id | event_type | quantity | order_line_id | reason | occurred_at |
|---|---|---|---|---|---|---|
| LG-1108535 | SK-100683 | outbound | 2 | OL-40096700 | — | 2026-10-22T10:31:06+09:00 |
| LG-1109243 | SK-100685 | outbound | 1 | OL-40097434 | — | 2026-10-22T16:01:29+09:00 |
| LG-1110083 | SK-100681 | outbound | 1 | OL-40097969 | — | 2026-10-23T10:32:29+09:00 |
| LG-1110120 | SK-100686 | outbound | 1 | OL-40098056 | — | 2026-10-23T10:33:01+09:00 |
| LG-1112223 | SK-100681 | return_received | 1 | OL-40097969 | — | 2026-10-24T16:36:16+09:00 |
39행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 117,476행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "창고에서 옵션의 실물이 움직인 한 번. 키는 ledger_id.",
"additionalProperties": false,
"required": [
"ledger_id",
"sku_id",
"event_type",
"quantity",
"order_line_id",
"reason",
"occurred_at"
],
"properties": {
"ledger_id": {
"type": "string",
"pattern": "^LG-[0-9]{7}$",
"description": "원장 줄 번호. 이 표의 키예요."
},
"sku_id": {
"type": "string",
"pattern": "^SK-[0-9]{6}$",
"description": "움직인 옵션. skus.sku_id 를 가리켜요."
},
"event_type": {
"type": "string",
"enum": [
"inbound",
"outbound",
"adjustment",
"return_received",
"return_inspected"
],
"description": "inbound 입고, outbound 주문 한 줄의 출고, adjustment 재고 조정, return_received 반품이 창고에 도착, return_inspected 반품 검수 완료."
},
"quantity": {
"type": "integer",
"description": "움직인 개수. adjustment 만 부호가 있어요(불량 판정·분실은 음수, 되찾음은 양수, 0 은 없음). 나머지는 0 이상이고, outbound 는 그 주문 줄의 quantity 와 같아요. return_inspected 는 검수를 통과해 다시 팔 수 있게 된 개수라 도착한 개수보다 적을 수 있어요(0 이면 모두 불량)."
},
"order_line_id": {
"type": [
"string",
"null"
],
"pattern": "^OL-[0-9]{8}$",
"description": "outbound·return_received·return_inspected 가 가리키는 주문 줄. orders.order_line_id 를 가리키고, 그 주문의 sku_id 는 이 줄의 sku_id 와 같아요. inbound·adjustment 는 null 이에요."
},
"reason": {
"type": [
"string",
"null"
],
"enum": [
"defect",
"missing",
"found",
null
],
"description": "adjustment 의 까닭. defect 불량 판정, missing 분실, found 되찾음. adjustment 가 아니면 null 이에요."
},
"occurred_at": {
"type": "string",
"format": "date-time",
"description": "움직임이 일어난 시각. 창고 시스템 시계, 한국 시간(+09:00) ISO 8601, 초 단위."
}
}
}세 플랫폼에서 들어온 주문의 상품 한 줄이에요. 한 행이 주문 한 줄이고 order_line_id 가 키예요. sku_id 는 skus.sku_id 를 가리키고, platform 은 그 주문이 들어온 곳(musinsa 무신사 스토어, 29cm 29CM, global 무신사 글로벌 스토어)이에요. 이 데이터에서는 같은 옵션의 주문이 플랫폼과 상관없이 같은 재고에서 나가요. quantity 는 그 줄의 주문 개수예요. ordered_at 은 주문을 접수한 시각, paid_at 은 결제가 확인된 시각이고 결제되지 않은 주문은 null 이에요. canceled_at 은 출고 전에 취소된 시각이고 취소되지 않았으면 null 이에요. 출고된 줄은 취소되지 않고 반품으로만 돌아와요. 세 시각은 각 플랫폼 주문 시스템이 찍었고, 원장의 occurred_at·점검 회차의 check_at 과 같은 기준(한국 시간)으로 견줄 수 있어요. 접수하고 몇 시간 뒤에 결제된 주문, 결제했지만 출고 전에 취소된 주문, 점검 회차 몇 분 앞뒤에 결제·취소된 주문, 여러 플랫폼에서 비슷한 때 같은 옵션을 산 주문, 한 줄에 두 개 이상 산 주문이 들어 있어요. 큰 데이터는 같은 기간 옵션 1,200개의 주문 전부이고, 시작용은 BR-0731 옵션 10개의 주문 가운데 10월 28일 07:00 실사 뒤 14:00 까지 접수된 줄, 그 실사 때 아직 출고·취소되지 않았던 줄, 시작용 원장 줄이 가리키는 줄 전부예요.
전체 61행 가운데 앞 5행이에요.
| order_line_id | platform | sku_id | quantity | ordered_at | paid_at | canceled_at |
|---|---|---|---|---|---|---|
| OL-40096700 | musinsa | SK-100683 | 2 | 2026-10-21T21:39:54+09:00 | 2026-10-21T21:40:53+09:00 | — |
| OL-40097434 | 29cm | SK-100685 | 1 | 2026-10-22T15:47:47+09:00 | 2026-10-22T15:50:02+09:00 | — |
| OL-40097969 | musinsa | SK-100681 | 1 | 2026-10-22T23:18:45+09:00 | 2026-10-22T23:18:58+09:00 | — |
| OL-40098056 | musinsa | SK-100686 | 1 | 2026-10-23T01:13:53+09:00 | 2026-10-23T01:16:23+09:00 | — |
| OL-40101981 | 29cm | SK-100689 | 1 | 2026-10-26T06:36:21+09:00 | 2026-10-26T06:36:37+09:00 | — |
61행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 105,101행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "주문의 상품 한 줄. 키는 order_line_id.",
"additionalProperties": false,
"required": [
"order_line_id",
"platform",
"sku_id",
"quantity",
"ordered_at",
"paid_at",
"canceled_at"
],
"properties": {
"order_line_id": {
"type": "string",
"pattern": "^OL-[0-9]{8}$",
"description": "주문 줄 번호. 이 표의 키예요."
},
"platform": {
"type": "string",
"enum": [
"musinsa",
"29cm",
"global"
],
"description": "주문이 들어온 곳. musinsa 무신사 스토어, 29cm 29CM, global 무신사 글로벌 스토어."
},
"sku_id": {
"type": "string",
"pattern": "^SK-[0-9]{6}$",
"description": "주문한 옵션. skus.sku_id 를 가리켜요. 플랫폼과 상관없이 이 옵션의 같은 재고에서 나가요."
},
"quantity": {
"type": "integer",
"minimum": 1,
"description": "이 줄의 주문 개수."
},
"ordered_at": {
"type": "string",
"format": "date-time",
"description": "주문을 접수한 시각. 그 플랫폼 주문 시스템 시계, 한국 시간(+09:00) ISO 8601, 초 단위."
},
"paid_at": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "결제가 확인된 시각. 같은 기준, 한국 시간(+09:00) ISO 8601, 초 단위. 결제되지 않은 주문은 null 이에요."
},
"canceled_at": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "출고 전에 주문이 취소된 시각. 같은 기준, 한국 시간(+09:00) ISO 8601, 초 단위. 취소되지 않았으면 null 이에요. 출고된 줄은 취소되지 않고 반품으로만 돌아와요."
}
}
}상품 운영 담당자가 옵션의 판매 상태를 점검하는 회차예요. 한 행이 회차 하나이고 check_id 가 키예요. check_at 은 그 회차의 기준 시각으로, 이 기능이 '지금'으로 삼는 시각이에요. 회차는 매일 09:00 부터 21:00 까지 정각마다 있어요. 큰 데이터는 8월 3일부터 10월 28일까지의 회차 전부이고, 시작용은 10월 28일 09:00~14:00 회차 6개예요.
전체 6행 가운데 앞 5행이에요.
| check_id | check_at |
|---|---|
| CK-01119 | 2026-10-28T09:00:00+09:00 |
| CK-01120 | 2026-10-28T10:00:00+09:00 |
| CK-01121 | 2026-10-28T11:00:00+09:00 |
| CK-01122 | 2026-10-28T12:00:00+09:00 |
| CK-01123 | 2026-10-28T13:00:00+09:00 |
6행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 1,131행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "판매 상태 점검 회차 하나. 키는 check_id.",
"additionalProperties": false,
"required": [
"check_id",
"check_at"
],
"properties": {
"check_id": {
"type": "string",
"pattern": "^CK-[0-9]{5}$",
"description": "점검 회차 번호. 이 표의 키예요."
},
"check_at": {
"type": "string",
"format": "date-time",
"description": "그 회차의 기준 시각. 이 기능이 '지금'으로 삼는 시각이에요. 한국 시간(+09:00) ISO 8601, 초 단위. 원장·주문 시각과 같은 기준으로 견줄 수 있어요."
}
}
}