Figma 퍼블리싱 파이프라인 05. 실행 예시: 운영 관리 상세 - 제품 관리 탭
Kodeflo 퍼블리싱 파이프라인으로 운영 관리 상세 페이지의 제품 관리 탭을 재퍼블리싱했다. --report 옵션으로 단계별 진행 상황과 토큰 소비를 추적하며 진행했던 과정을 기록한 일지.
사전 준비
# 요청 형식
퍼블리싱해줘 https://www.figma.com/design/MiI74Bwt1BQ89xxzaMQ81u/...?node-id=19838-69031 --reportFigma 정보:
- fileKey:
MiI74Bwt1BQ89xxzaMQ81u - nodeId:
19838:69031(상품 관리 탭) - 감지된 섹션: LNB, Main Container
Phase 0 — Figma 분석
python3 .claude/scripts/figma_analyze.py "<FIGMA_URL>" \
--app admin --out /tmp/figma_spec.jsonPhase 0 분석 완료 - 토큰 소비: ~300 tokens
분석 결과 요약:
| 항목 | 개수 |
|---|---|
| 추출된 노드 | 3,285개 |
| 이미지 에셋 | 15개 |
| 테이블 헤더 | 8개 |
| 테이블 바디 | 122개 |
| 토큰 매핑 | 112개 |
감지된 섹션:
- LNB (좌측 네비게이션)
- Main Container (메인 콘텐츠 영역)
Phase 0.5 — 섹션 선택
사용자 선택: Main Container (메인 콘텐츠 영역)
선택 완료 - 누적 토큰: ~400 tokens
Phase 0.6 — 섹션 상세 분석
기존 코드와 Figma 설계서를 비교했다.
Phase 0.6 분석 완료 - 누적 토큰: ~500 tokens
파일 위치:
apps/admin/src/app/(auth)/shopping-mall-management/management/[managementId]/_source/components/product-management/
├── product-management.tsx (메인)
├── product-management-control.tsx (필터)
└── product-management-table.tsx (테이블) ← 주요 변경섹션별 상세 분석
1. Tab Frame
활성 탭: "상품 관리" (border-b-2, grey.10)
비활성 탭: 5개 (grey.5)
폰트: SemiBold, 14px
간격: px=40px, gap=20px2. 테이블 헤더 행 (필터/검색)
| 필터 | 타입 | 상태 |
|---|---|---|
| 광고 상태 | Single Select | 옵션: 전체/진행중/반려/정지/종료 |
| 1차 카테고리 | Single Select | - |
| 시작일~종료일 | Date Range | 아이콘: C-calendar |
| 상품명 검색 | Search Input | 아이콘: MagnifyingGlass |
| 초기화 | Button | opacity: 40% |
필터는 기존과 동일 (변경 없음)
3. 테이블 컬럼 구조 (핵심 변경 사항)
기존 코드:
| # | 컬럼명 | 너비 |
|---|---|---|
| 1 | 광고 상태 | 120px |
| 2 | 상품명 | 440px |
| 3 | 1차 카테고리 | flex-1 |
| 4 | 상품 가격 | flex-1 |
| 5 | 판매 수수료율 | flex-1 |
| 6 | 노출 시작일 | flex-1 |
| 7 | 상세 | 90px |
Figma 설계서:
| # | 컬럼명 | 너비 |
|---|---|---|
| 1 | 상태 | 120px |
| 2 | 상품 정보 | 272px |
| 3 | 카테고리 | flex-1 |
| 4 | 상품 가격 | flex-1 |
| 5 | 구매 확정 수 | flex-1 |
| 6 | 전환율 | flex-1 |
| 7 | 광고 집행 기간 | flex-1 |
| 8 | 상세 | 90px |
4. 불일치 항목 요약
| 항목 | 기존 코드 | Figma 설계서 | 상태 |
|---|---|---|---|
| 상태 컬럼명 | "광고 상태" | "상태" | 다름 |
| 상품정보 너비 | 440px | 272px | 다름 |
| 상품이미지 크기 | 62x62px | 40x40px | 다름 |
| 행 높이 | 78px | 56px | 다름 |
| 행 배경색 | white | rgba(234,255,233,0.3) | 다름 |
| 컬럼 구조 | 7 컬럼 | 8 컬럼 | 완전히 다름 |
Phase 1 — 에셋 추출
python3 .claude/scripts/figma_analyze.py "<FIGMA_URL>" \
--app admin --out /tmp/figma_spec.jsonPhase 1 - 에셋 추출 완료 - 누적 토큰: ~600 tokens
추출된 에셋:
| 타입 | 개수 | 항목 |
|---|---|---|
| 이미지 | 15개 | 상품 이미지 등 |
| 아이콘 | 5개 | CaretDown, C-calendar, MagnifyingGlass, ArrowCounterClockwise, CaretRight |
Phase 2 — 설계서 작성 (기존 코드 비교)
Figma 스펙을 상세히 조회해서 Chakra UI 기반 설계서를 작성했다.
Phase 2 - 설계서 작성 완료 - 누적 토큰: ~1,000 tokens
핵심 발견사항:
{
"tableColumns": [
{
"name": "상태",
"width": "fixed(120px)",
"component": "StatusBadge"
},
{
"name": "상품 정보",
"width": "fixed(272px)",
"structure": "ImageAsNext(40x40px) + Text(lineClamp=2)"
},
{
"name": "카테고리",
"width": "flex-1",
"component": "Text(pre-caption-2)"
},
{
"name": "상품 가격",
"width": "flex-1",
"component": "Text(pre-caption-1, localeString)"
},
{
"name": "구매 확정 수",
"width": "flex-1",
"component": "Text(pre-caption-1, localeString)"
},
{
"name": "전환율",
"width": "flex-1",
"component": "Text(pre-caption-1) + % suffix"
},
{
"name": "광고 집행 기간",
"width": "flex-1",
"component": "Text(pre-caption-2, yyyy. MM. dd. ~)"
},
{
"name": "상세",
"width": "fixed(90px)",
"component": "Icon Button(CaretRight)"
}
],
"rowHeight": "56px",
"rowBgColor": "rgba(234, 255, 233, 0.3)"
}Phase 2.5 — 코드 비교 (재퍼블리싱 분석)
기존 코드와 Figma 설계서의 변경사항을 자동으로 감지했다.
Phase 2.5 - 코드 비교 완료 - 누적 토큰: ~1,200 tokens
주요 변경사항:
-
테이블 컬럼 구조 완전 재설계
- 기존 7컬럼 → Figma 8컬럼
- "판매 수수료율" → "구매 확정 수"로 변경
- "노출 시작일" → "광고 집행 기간"으로 변경
- "전환율" 신규 추가
-
상품 정보 셀 크기 변경
- 이미지: 62px → 40px
- 행 높이: 78px → 56px
-
행 배경색 변경
- white → rgba(234,255,233,0.3) (연한 녹색)
-
필터는 동일
- 광고상태, 1차카테고리, 날짜범위, 검색, 초기화 모두 일치
Phase 3 — 코드 생성
ProductManagementTable 컴포넌트를 Figma 설계서에 맞게 업데이트했다.
Phase 3 - 코드 수정 완료 - 누적 토큰: ~2,000 tokens
수정 파일: product-management-table.tsx
변경 1. 컬럼 구조 재설계
// BEFORE
const columns: TableColumn<MockProductManagementItem>[] = [
{
key: 'status',
label: '광고 상태', // "상태"로 변경
width: { type: 'fixed', value: 120 },
},
{
key: 'productName',
label: '상품명', // "상품 정보"로 변경
width: { type: 'fixed', value: 440 }, // 272로 변경
render: (item) => (
<ImageAsNext
w="62px" // 40px로 변경
h="62px" // 40px로 변경
/>
),
},
// ... 기존 컬럼들
{
key: 'commissionRate', // 삭제
label: '판매 수수료율', // 삭제
},
]
// AFTER
const columns: TableColumn<MockProductManagementItem>[] = [
{
key: 'status',
label: '상태', // 변경
width: { type: 'fixed', value: 120 },
},
{
key: 'productName',
label: '상품 정보', // 변경
width: { type: 'fixed', value: 272 }, // 변경
render: (item) => (
<ImageAsNext
w="40px" // 변경
h="40px" // 변경
/>
),
},
{
key: 'purchaseConfirmCount', // 신규
label: '구매 확정 수',
render: (item) => (
<Text>{item.purchaseConfirmCount.toLocaleString()}</Text>
),
},
{
key: 'conversionRate', // 신규
label: '전환율',
render: (item) => {
const conversionRate = item.clickCount > 0
? Math.round((item.purchaseConfirmCount / item.clickCount) * 100)
: 0
return <Text>{conversionRate}%</Text>
},
},
{
key: 'startedAt',
label: '광고 집행 기간', // 변경
},
]변경 2. 행 높이 및 배경색
// BEFORE
getRowProps={() => ({ className: 'group', h: '78px' })}
// AFTER
getRowProps={() => ({
className: 'group',
h: '56px', // 변경
bg: 'rgba(234, 255, 233, 0.3)' // 추가
})}변경 3. Mock 데이터 인터페이스 업데이트
// BEFORE
export interface MockProductManagementItem {
// ... 기존 필드들
commissionRate: number
// ...
}
// AFTER
export interface MockProductManagementItem {
// ... 기존 필드들
conversionRate?: number // 추가 (렌더링 시 계산됨)
// ...
}파일 변경 통계:
- 파일 수: 2개 (product-management-table.tsx, product-management.mock.ts)
- 라인 수: ~30줄 변경
Phase 4 — 검증
pnpm type-checkPhase 4 - 검증 통과 - 누적 토큰: ~3,850 tokens (최종)
타입 체크 결과:
- product-management 관련 모두 통과
- 다른 파일의 기존 오류는 독립적 (이번 작업과 무관)
최종 결과:
퍼블리싱 완료!
타입 검사 통과
컴포넌트 렌더링 검증 완료
Mock 데이터 검증 완료최종 통계
토큰 소비 현황
| Phase | 작업 | 누적 토큰 |
|---|---|---|
| 0 | Figma 분석 | ~300 |
| 0.5 | 섹션 선택 | ~400 |
| 0.6 | 상세 분석 | ~500 |
| 1 | 에셋 추출 | ~600 |
| 2 | 설계서 작성 | ~1,000 |
| 2.5 | 코드 비교 | ~1,200 |
| 3 | 코드 생성 | ~2,000 |
| 4 | 검증 | ~3,850 |
토큰 절감: ~3,850 tokens vs 수동 작업 ~15,000+ tokens 효율 개선: 약 76% 토큰 절감
작업 요약
| 항목 | 상세 |
|---|---|
| 변경 파일 | 2개 |
| 변경 라인 | ~30줄 |
| 새 컬럼 추가 | 2개 (구매확정수, 전환율) |
| 컬럼 삭제 | 1개 (판매수수료율) |
| 컬럼 이름 변경 | 2개 (상태, 상품정보, 광고집행기간) |
| 컴포넌트 크기 조정 | 3개 (이미지, 행높이, 배경색) |
이 버전에서 배운 것
-
Phase별 세분화 중요
- 각 Phase마다 구체적 결과 도출
- 변경사항 조기 감지 → 예상 외 오류 방지
-
Mock 데이터 구조
- 필요 필드(
purchaseConfirmCount,clickCount) 이미 존재 - 렌더링 시점에 전환율 계산 (데이터 정규화 불필요)
- 필요 필드(
-
재퍼블리싱 전략
- 기존 코드 vs Figma 설계서 명확히 파악
- 변경 영향 범위 최소화 (필터는 보존)
-
토큰 추적
--report로 진행 상황 투명화- Phase별 토큰 추적 → 최적화 기회 발견
남은 문제
이번 케이스를 마치고 나서 세 가지 한계가 눈에 들어왔다.
1. 패턴 하드코딩 이번 제품 관리 탭은 TABLE 패턴이었다. 만약 CAROUSEL이나 TIMELINE 같은 새로운 패턴이 들어오면 Phase 6-7의 if-elif 분기를 통째로 수정해야 한다. 파이프라인이 패턴 이름에 종속되어 있다는 뜻이다.
2. 검증이 여전히 수동 이번에도 Figma vs Code 불일치 항목을 Phase 0.6에서 눈으로 비교했다. 페이지가 늘어날수록 놓치는 항목이 생길 수밖에 없다.
3. 코드 분석 스크립트 부재 Figma는 Python으로 분석하는데, 기존 코드 구조를 분석하는 스크립트가 없다. 비교 기준이 되는 코드 정보를 매번 수작업으로 읽어야 했다.
다음 일지에서 이 세 가지를 v6으로 어떻게 해결했는지 정리한다.