재고관리 시스템, Claude Code한테 시켜봤더니

시도하고자 했던 것과 그 이유를 알려주세요.

(내용 입력)

소개전자제품 재고를 관리할 시스템이 필요했는데, 직접 코딩하려면 Python 문법부터 CSV 처리, CLI 설계까지 혼자서는 훨씬 오래 걸렸을 작업이었습니다.

결과 대시보드

한국 게임 웹사이트의 스크린샷

진행 방법

Claude Code에게 요구사항을 전달하고 단계별로 만들어갔습니다. - inventory.py (핵심 로직) → main.py (CLI 메뉴) → CSV 데이터 순서로 생성 - 가상 전자제품 10개 샘플 데이터를 넣고 전체 기능 테스트 - Windows 인코딩(cp949) 에러 발생 → Claude Code가 바로 잡아서 수정 - 최종적으로 HTML 대시보드까지 생성하여 재고 현황을 시각화떤 도구를 사용했고,

**사용한 프롬프트:**
>
> ```
> Python으로 재고관리 시스템을 만들어줘.
>
> 요구사항:
> - 상품 추가/수정/삭제
> - 재고 수량 입출고 처리
> - 전체 재고 목록 조회
> - 재고 부족 알림 (최소 수량 이하 시 경고)
> - 데이터는 CSV 파일로 저장
> - CLI 메뉴 방식으로 동작
>
> 파일 구조:
> - main.py (메인 실행 파일)
> - inventory.py (재고 관리 핵심 로직)
> - data/inventory.csv (데이터 저장)
> - requirements.txt
>
> 각 파일 생성 전에 설명해주고, 완성 후 실행 방법도 알려줘.
> ```

Claude Code가 4개 파일을 순서대로 생성해줬습니다.

**inventory.py** (핵심 로직 - 상품 CRUD, 입출고, CSV 읽기/쓰기):

```python
import csv
import os
from dataclasses import dataclass, fields, asdict


@dataclass
class Product:
    id: int
    name: str
    category: str
    quantity: int
    min_quantity: int
    price: int


CSV_HEADER = [f.name for f in fields(Product)]


class InventoryManager:
    def __init__(self, csv_path: str = "data/inventory.csv"):
        self.csv_path = csv_path
        self.products: list[Product] = []
        self._ensure_csv()
        self.load()

    def _ensure_csv(self):
        os.makedirs(os.path.dirname(self.csv_path), exist_ok=True)
        if not os.path.exists(self.csv_path):
            with open(self.csv_path, "w", newline="", encoding="utf-8") as f:
                writer = csv.writer(f)
                writer.writerow(CSV_HEADER)

    def load(self):
        self.products = []
        with open(self.csv_path, "r", encoding="utf-8") as f:
            reader = csv.DictReader(f)
            for row in reader:
                self.products.append(Product(
                    id=int(row["id"]),
                    name=row["name"],
                    category=row["category"],
                    quantity=int(row["quantity"]),
                    min_quantity=int(row["min_quantity"]),
                    price=int(row["price"]),
                ))

    def save(self):
        with open(self.csv_path, "w", newline="", encoding="utf-8") as f:
            writer = csv.DictWriter(f, fieldnames=CSV_HEADER)
            writer.writeheader()
            for p in self.products:
                writer.writerow(asdict(p))

    def add_product(self, name, category, quantity, min_quantity, price):
        product = Product(id=self._next_id(), name=name, category=category,
                          quantity=quantity, min_quantity=min_quantity, price=price)
        self.products.append(product)
        self.save()
        return product

    def stock_in(self, product_id, amount):
        product = self.find_by_id(product_id)
        if not product or amount <= 0:
            return None
        product.quantity += amount
        self.save()
        return product

    def stock_out(self, product_id, amount):
        product = self.find_by_id(product_id)
        if not product or amount <= 0 or product.quantity < amount:
            return None
        product.quantity -= amount
        self.save()
        return product

    def get_low_stock(self):
        return [p for p in self.products if p.quantity <= p.min_quantity]
```

**main.py** (CLI 메뉴 - 7개 기능):

```python
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding="utf-8")

from inventory import InventoryManager

def print_menu():
    print("\n===== 재고 관리 시스템 =====")
    print("1. 상품 추가")
    print("2. 상품 수정")
    print("3. 상품 삭제")
    print("4. 입고 처리")
    print("5. 출고 처리")
    print("6. 전체 재고 조회")
    print("7. 재고 부족 알림")
    print("0. 종료")
```

---

### Step 2. 가상 전자제품 데이터 + 실행

> **사용한 프롬프트:**
>
> ```
> 전자제품 재고관리 가상으로 만들어 주고 실행해줘
> ```

Claude Code가 전자제품 10개 샘플 데이터를 자동 생성했습니다.

**data/inventory.csv:**

```csv
id,name,category,quantity,min_quantity,price
1,갤럭시S25,스마트폰,45,10,1190000
2,아이폰16,스마트폰,32,10,1350000
3,맥북프로16,노트북,12,5,3490000
4,갤럭시북4,노트북,8,5,1590000
5,에어팟프로3,이어폰,120,20,359000
6,갤럭시버즈3,이어폰,85,20,229000
7,아이패드에어,태블릿,3,10,929000
8,갤럭시탭S10,태블릿,18,10,1099000
9,LG그램17,노트북,2,5,1890000
10,애플워치10,웨어러블,60,15,599000
```

아이패드에어(3개)와 LG그램17(2개)은 의도적으로 최소 수량 이하로 설정해서 재고 부족 알림을 테스트할 수 있게 했습니다.

---

### Step 3. 에러 발생과 해결

실행하니 Windows 인코딩(cp949) 에러가 발생했습니다.

```
UnicodeEncodeError: 'cp949' codec can't encode character '\u26a0'
```

Claude Code가 바로 원인을 파악하고 두 가지를 수정했습니다:
- `sys.stdout`/`sys.stdin` 인코딩을 UTF-8로 설정
- 이모지 문자를 텍스트 `[부족!]`로 교체

수정 후 정상 실행되었습니다.

---

### Step 4. 전체 기능 테스트

> **사용한 프롬프트:**
>
> ```
> 순차적으로 전부 실행해줘
> ```

7개 기능을 한 번에 테스트한 결과:

```
[ 상품 추가 ] → 소니WH1000 헤드폰 등록 (ID: 11)          ✅
[ 상품 수정 ] → 갤럭시S25 → 갤럭시S25울트라 이름 변경       ✅
[ 상품 삭제 ] → 애플워치10 (ID:10) 삭제                    ✅
[ 입고 처리 ] → 아이패드에어 +20개 (3→23개)                ✅
[ 출고 처리 ] → 에어팟프로3 -30개 (120→90개)               ✅
[ 전체 조회 ] → 10개 상품 테이블 출력                       ✅
[ 부족 알림 ] → LG그램17만 부족 감지 (입고로 아이패드 해소)   ✅
```

---

### Step 5. HTML 대시보드 생성

> **사용한 프롬프트:**
>
> ```
> 지금까지 만든 재고 관리 시스템 가시성있게 보여줘
> ```

Claude Code가 다크 테마의 HTML 대시보드를 자동 생성했습니다.

- 상단 요약 카드 4개 (총 상품 수, 총 재고 수량, 총 재고 가치, 재고 부족 경고)
- 카테고리별 현황 칩
- 상품별 재고 테이블 (재고 바, 비율%, 상태 태그)
- 부족 상품은 빨간색 깜빡이는 "부족" 태그로 경고

> [여기에 dashboard.html 캡처 화면을 첨부해주세요]

---

## 결과

| 항목 | Before | After |
|------|--------|-------|
| 재고관리 | 없음 | CLI 시스템 + 대시보드 완성 |
| 기능 | - | 상품 CRUD + 입출고 + 부족 알림 7개 |
| 시각화 | - | HTML 대시보드 (다크 테마) |
| 데이터 | - | CSV 파일 자동 저장/불러오기 |
| 파일 | 0개 | 4개 (main.py, inventory.py, inventory.csv, dashboard.html) |

---

## 배운 점

1. **요구사항만 정리하면 된다** — 파일 구조와 기능 목록을 프롬프트에 적어주니 Claude Code가 알아서 설계하고 구현했습니다.

2. **에러도 대화로 해결된다** — Windows 인코딩 에러가 터졌을 때, Claude Code가 원인을 바로 파악하고 수정까지 해줬습니다. 직접 구글링했으면 한참 걸렸을 겁니다.

3. **"보여줘" 한마디로 대시보드까지** — CLI 결과물을 시각화하고 싶다고 했더니 HTML 대시보드를 만들어줬습니다. 디자인 감각도 괜찮습니다.

시행착오가 있어도 대화하듯 고쳐나갈 수 있다는 게 Claude Code의 가장 큰 장점이었습니다.

어떻게 활용하셨나요?

Tip: 사용한 프롬프트 전문을 꼭 포함하고, 내용을 짧게 소개해 주세요.

Tip: 활용 이미지나 캡처 화면을 꼭 남겨주세요.

Tip: 코드 전문은 코드블록에 감싸서 작성해주세요. ( / 을 눌러 '코드 블록'을 선택)

(내용 입력)

결과와 배운 점

배운 점과 나만의 꿀팁을 알려주세요.

과정 중에 어떤 시행착오를 겪었나요?

도움이 필요한 부분이 있나요?

앞으로의 계획이 있다면 들려주세요.

(내용 입력)

도움 받은 글 (옵션)

참고한 지피터스 글이나 외부 사례를 알려주세요.

(내용 입력)

1
2개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요