productdb.json: 제품 데이터의 단일 출처

이 글은 productdb가 모든 제품 데이터, 즉 구성 요소, 기능, 호환성 규칙, 그리고 자재 명세서를 하나의 중앙 집중화된 파일에 정의함으로써 단일 출처로서 어떻게 작동하는지 설명합니다.

문제점: 흩어진 제품 데이터

제품 데이터는 여러 시스템에 걸쳐 흩어져 있을 수 있습니다:

  • 재고 시스템: 부품 원가와 재고 수준

  • ERP 시스템: 자재 명세서와 생산 데이터

  • 웹사이트: 제품 설명과 사양

  • 회계: 가격 책정 및 원가 계산 규칙

데이터가 흩어져 있으면 불일치가 발생합니다:

  • 웹사이트는 16GB RAM을 표시하지만, ERP는 8GB라고 표시함

  • 가격 책정에 오래된 원가 데이터가 사용됨

  • 자재 명세서가 실제 제품과 동기화되지 않음

  • 기능이 현실과 일치하지 않음

우리는 모든 시스템이 참조할 수 있는 단일 출처가 필요합니다.

해결책: productdb.json

productdb.json은 모든 구성 요소, 그 기능, 호환성 규칙, 그리고 구성 요소들을 정의하는 JSON 파일입니다. 모든 시스템은 시작 시 이 파일을 로드합니다.

이 파일은 Git에서 버전 관리되어, 모든 변경 사항이 추적되고 감사 가능하도록 보장합니다.

파일 구조

파일은 구성 요소 카테고리별로 구성되어 있습니다:

{
  "Chassis": { ... },
  "Board": { ... },
# ... (구현 세부 사항 생략)

각 카테고리는 해당 속성을 가진 구성 요소들을 포함합니다.

구성 요소 정의

각 구성 요소는 여러 속성을 가집니다:

기본 속성

class: 호환성 매칭을 위한 구성 요소 클래스

"class": "THIN_MINI_ITX"

internal: 재고 및 생산을 위한 내부 이름

"internal": "Chassis, Treo"

external: 웹사이트 및 마케팅을 위한 고객 대상 이름

"external": "Thinvent® Treo Mini PC"

weight: 그램 단위의 물리적 무게

"weight": 590

호환성 규칙 (allows)

allows 필드는 어떤 구성 요소들이 함께 사용될 수 있는지를 정의합니다:

"allows": {
  "Board": [
    {"class": "THIN_MINI_ITX"}
# ... (구현 세부 사항 생략)

이는 다음을 의미합니다:

  • Board: 클래스가 THIN_MINI_ITX인 보드만 호환됨

  • Flash: 클래스가 m.2_SATA인 플래시 저장 장치만 호환됨

  • Accessories: 모든 액세서리가 호환됨

호환성은 다음과 같이 지정될 수 있습니다:

클래스 기반 (동적):

{"class": "THIN_MINI_ITX"}

부품 ID 기반 (명시적):

["N100", "N150", "i5-1335U"]

자재 명세서 (constituents)

constituents 필드는 이 구성 요소를 구성하는 부품들을 정의합니다:

"constituents": [
  {
    "Category": "Custom",
# ... (구현 세부 사항 생략)

이는 다음을 가능하게 합니다:

  • 원가 계산: 모든 구성 요소의 원가 합산

  • 생산: 조립을 위한 피킹 리스트 생성

  • 재고: 구성 요소 사용량 추적

기능 제공 (provides)

provides 필드는 이 구성 요소가 제공하는 기능들을 정의합니다:

"provides": {
  "Operating Temperature": "0°C ~ 40°C",
  "Operating Humidity": "20% ~ 80% RH, non condensing",
# ... (구현 세부 사항 생략)

이러한 기능들은 SKU 내 모든 구성 요소에서 집계되어 제품의 완전한 사양을 생성합니다.

예시: Treo 케이스

{
  "Treo": {
    "class": "THIN_MINI_ITX",
# ... (구현 세부 사항 생략)

예시: N100 보드

{
  "N100": {
    "class": "THIN_MINI_ITX",
# ... (구현 세부 사항 생략)

productdb.json 로드

파일은 애플리케이션 시작 시 로드됩니다:

import json

with open(PRODUCTDB_JSON_PATH, "r", encoding="utf-8") as productdb_file:
    productdb = json.load(productdb_file)

이는 메모리 내 사전을 생성합니다:

productdb = {
    "Chassis": {
        "Treo": { ... },
# ... (구현 세부 사항 생략)

모든 코드는 제품 데이터를 위해 이 사전을 참조합니다.

구성 요소 데이터 접근

카테고리 및 ID로 구성 요소 가져오기

chassis = productdb["Chassis"]["Treo"]
board = productdb["Board"]["N100"]
ram = productdb["RAM"]["8"]

외부 이름 가져오기

name = productdb["Board"]["N100"]["external"]
# 결과: "Intel® N100 Processor"

기능 가져오기

features = productdb["Board"]["N100"]["provides"]
# 결과: {"Generation": "12th", "Series": "N", ...}

구성 요소 가져오기

constituents = productdb["Chassis"]["Treo"]["constituents"]
# 결과: [{"Category": "Custom", "PartID": "base_treo", "qty": 1}, ...]

SKU 검증

우리는 productdb.json을 사용하여 SKU를 검증합니다:

def check_sku(sku:str) -> bool:
    parts = sku.split("-")
    mapped_parts = map_parts_to_fields(parts)
# ... (구현 세부 사항 생략)

자세한 내용은 SKU 구조를 참조하세요.

기능 집계

우리는 SKU 내 모든 구성 요소의 기능을 집계합니다:

def get_product_features(sku: str) -> dict:
    partids = sku.split("-")
    features = {}
# ... (구현 세부 사항 생략)

예시:

SKU: Treo-N100-8-256-2H-W6-11P

기능:

- 폼 팩터: Mini PC (Treo에서)

- 세대: 12세대 (N100에서)

- 시리즈: N (N100에서)

- 코어: 4 (N100에서)

- 메인 메모리: 8 (8에서)

- SSD 저장 공간: 256 (256에서)

- HDMI: 2 (2H에서)

- 운영 체제: Windows 11 Pro (11P에서)

자세한 내용은 기능 추출을 참조하세요.

원가 계산

구성 요소 원가를 합산하여 SKU 원가를 계산합니다:

def calculate_cost(item: dict, partid: str) -> tuple:
    if "constituents" in item:
        # 복합 항목: 구성 요소 원가 합산
# ... (구현 세부 사항 생략)

이 재귀적 계산은 중첩된 구성 요소들을 처리합니다.

복합 항목

일부 구성 요소는 복합적입니다(다른 구성 요소들로 만들어짐):

예시: 키보드 + 마우스 콤보

{
  "KM": {
    "internal": "Keyboard + Mouse",
# ... (구현 세부 사항 생략)

이는 다음을 가능하게 합니다:

  • BOM 생성: 필요한 모든 구성 요소 나열

  • 원가 계산: 키보드 + 마우스 + 동글 원가 합산

  • 재고 추적: 구성 요소 사용량 추적

productdb.json 업데이트

수동 편집

파일은 텍스트 편집기나 IDE에서 수동으로 편집됩니다. 변경 사항은 Git에 커밋됩니다:

git add PATH_TO_FILE/productdb.json
git commit -m "Add new N150 board configuration"
git push

검증

편집 후, JSON 구문을 검증합니다:

python -m json.tool PATH_TO_FILE/productdb.json > /dev/null

이는 구문 오류를 확인합니다.

배포

Git에 푸시한 후, 파일은 프로덕션에 배포됩니다.

애플리케이션은 재시작 시 파일을 다시 로드합니다.

다른 시스템과의 통합

웹사이트

웹사이트는 productdb.json을 사용하여:

  • 제품 페이지 생성

  • 사양 표시

  • 기능별 제품 필터링

  • 비교표 생성

ERP

ERP는 productdb.json을 사용하여:

  • SKU 검증

  • BOM 생성

  • 원가 계산

  • 재고 추적

회계

회계는 productdb.json을 사용하여:

  • 제품 원가 계산

  • 송장 생성

  • 매출 원가(COGS) 추적

SEO 파이프라인

SEO 파이프라인은 productdb.json을 사용하여:

자세한 내용은 SEO 파이프라인 개요를 참조하세요.

단일 출처의 이점

1. 일관성

모든 시스템이 동일한 데이터를 사용합니다. 불일치가 없습니다.

2. 유지보수성

한 번 업데이트하면 모든 곳에 전파됩니다. 여러 시스템을 업데이트할 필요가 없습니다.

3. 감사 가능성

모든 변경 사항이 Git에서 추적됩니다. 누가 무엇을 언제 변경했는지 쉽게 확인할 수 있습니다.

4. 테스트 가능성

변경 사항은 프로덕션 배포 전 스테이징 환경에서 테스트할 수 있습니다.

5. 단순성

이해하기 쉬운 하나의 파일입니다. 복잡한 데이터베이스 스키마나 API가 없습니다.

6. 성능

메모리 내 사전은 O(1) 조회를 제공합니다. 데이터베이스 쿼리가 필요 없습니다.

7. 이식성

JSON은 사람이 읽기 쉽고 언어에 구애받지 않습니다. 어떤 언어로든 쉽게 파싱할 수 있습니다.

한계점

1. 수동 편집

변경 사항은 수동 편집과 Git 커밋이 필요합니다. 비기술 사용자를 위한 웹 UI가 없습니다.

2. 재시작 필요

애플리케이션은 변경 사항을 로드하기 위해 재시작해야 합니다. 핫 리로드가 없습니다.

3. 검증 부족

JSON 구문은 검증되지만, 의미론적 검증(예: "이 부품이 존재하나요?")은 자동으로 이루어지지 않습니다.

4. 동시성

여러 사람이 동시에 편집하면 병합 충돌이 발생할 수 있습니다.

참고 자료

기술 개념

관련 글

요약

productdb.json은 모든 제품 데이터의 단일 출처입니다:

구조:

  • 구성 요소 카테고리별 구성 (Chassis, Board, RAM 등)

  • 각 구성 요소는 속성을 가짐 (class, internal, external, weight)

  • 호환성 규칙 (allows)

  • 자재 명세서 (constituents)

  • 기능 제공 (provides)

이점:

  • 모든 시스템 간 일관성

  • 유지보수성 (한 번 업데이트)

  • 감사 가능성 (Git 추적)

  • 테스트 가능성 (스테이징 배포)

  • 단순성 (하나의 파일)

  • 성능 (메모리 내 O(1) 조회)

  • 이식성 (JSON 형식)

사용 사례:

  • SKU 검증

  • 기능 집계

  • 원가 계산

  • BOM 생성

  • 웹사이트 제품 페이지

  • SEO 파이프라인 기능 추출

이 중앙 집중화된 접근 방식은 모든 시스템이 동일한 제품 데이터를 참조하도록 보장하여 불일치를 제거하고 유지보수를 단순화합니다.


← 문서 색인으로 돌아가기