시도하고자 했던 것과 그 이유를 알려주세요.
(내용 입력)

한국 게임 웹사이트의 스크린샷
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: 코드 전문은 코드블록에 감싸서 작성해주세요. ( / 을 눌러 '코드 블록'을 선택)
(내용 입력)
배운 점과 나만의 꿀팁을 알려주세요.
과정 중에 어떤 시행착오를 겪었나요?
도움이 필요한 부분이 있나요?
앞으로의 계획이 있다면 들려주세요.
(내용 입력)
참고한 지피터스 글이나 외부 사례를 알려주세요.
(내용 입력)
원문: 천동암, 지피터스 GPTers (2026.03.19) gpters.org 원문 보기