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별 토큰 추적 → 최적화 기회 발견
다음 단계
이 파이프라인은 다음과 같은 상황에서 자동으로 적용됩니다:
# 신규 퍼블리싱 (진행 상황 보고 포함)
퍼블리싱해줘 [Figma URL] --report
# 재퍼블리싱 (기존 코드 비교 자동)
퍼블리싱해줘 [Figma URL] --report파이프라인의 강력함:
- Phase 0~4 자동 실행
- 변경사항 자동 감지
- 코드 자동 생성 및 검증
- 토큰 사용량 추적 및 보고