본문으로 건너뛰기

Figma 퍼블리싱 파이프라인 05. 실행 예시: 운영 관리 상세 - 제품 관리 탭

·12 min read·5 / 12

Kodeflo 퍼블리싱 파이프라인으로 운영 관리 상세 페이지의 제품 관리 탭을 재퍼블리싱했다. --report 옵션으로 단계별 진행 상황과 토큰 소비를 추적하며 진행했던 과정을 기록한 일지.


사전 준비

# 요청 형식
퍼블리싱해줘 https://www.figma.com/design/MiI74Bwt1BQ89xxzaMQ81u/...?node-id=19838-69031 --report

Figma 정보:

  • 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.json

Phase 0 분석 완료 - 토큰 소비: ~300 tokens

분석 결과 요약:

항목개수
추출된 노드3,285개
이미지 에셋15개
테이블 헤더8개
테이블 바디122개
토큰 매핑112개

감지된 섹션:

  1. LNB (좌측 네비게이션)
  2. 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=20px

2. 테이블 헤더 행 (필터/검색)

필터타입상태
광고 상태Single Select옵션: 전체/진행중/반려/정지/종료
1차 카테고리Single Select-
시작일~종료일Date Range아이콘: C-calendar
상품명 검색Search Input아이콘: MagnifyingGlass
초기화Buttonopacity: 40%

필터는 기존과 동일 (변경 없음)

3. 테이블 컬럼 구조 (핵심 변경 사항)

기존 코드:

#컬럼명너비
1광고 상태120px
2상품명440px
31차 카테고리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 설계서상태
상태 컬럼명"광고 상태""상태"다름
상품정보 너비440px272px다름
상품이미지 크기62x62px40x40px다름
행 높이78px56px다름
행 배경색whitergba(234,255,233,0.3)다름
컬럼 구조7 컬럼8 컬럼완전히 다름

Phase 1 — 에셋 추출

python3 .claude/scripts/figma_analyze.py "<FIGMA_URL>" \
  --app admin --out /tmp/figma_spec.json

Phase 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

주요 변경사항:

  1. 테이블 컬럼 구조 완전 재설계

    • 기존 7컬럼 → Figma 8컬럼
    • "판매 수수료율" → "구매 확정 수"로 변경
    • "노출 시작일" → "광고 집행 기간"으로 변경
    • "전환율" 신규 추가
  2. 상품 정보 셀 크기 변경

    • 이미지: 62px → 40px
    • 행 높이: 78px → 56px
  3. 행 배경색 변경

    • white → rgba(234,255,233,0.3) (연한 녹색)
  4. 필터는 동일

    • 광고상태, 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-check

Phase 4 - 검증 통과 - 누적 토큰: ~3,850 tokens (최종)

타입 체크 결과:

  • product-management 관련 모두 통과
  • 다른 파일의 기존 오류는 독립적 (이번 작업과 무관)

최종 결과:

퍼블리싱 완료!
 
타입 검사 통과
컴포넌트 렌더링 검증 완료
Mock 데이터 검증 완료

최종 통계

토큰 소비 현황

Phase작업누적 토큰
0Figma 분석~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개 (이미지, 행높이, 배경색)

이 버전에서 배운 것

  1. Phase별 세분화 중요

    • 각 Phase마다 구체적 결과 도출
    • 변경사항 조기 감지 → 예상 외 오류 방지
  2. Mock 데이터 구조

    • 필요 필드(purchaseConfirmCount, clickCount) 이미 존재
    • 렌더링 시점에 전환율 계산 (데이터 정규화 불필요)
  3. 재퍼블리싱 전략

    • 기존 코드 vs Figma 설계서 명확히 파악
    • 변경 영향 범위 최소화 (필터는 보존)
  4. 토큰 추적

    • --report로 진행 상황 투명화
    • Phase별 토큰 추적 → 최적화 기회 발견

남은 문제

이번 케이스를 마치고 나서 세 가지 한계가 눈에 들어왔다.

1. 패턴 하드코딩 이번 제품 관리 탭은 TABLE 패턴이었다. 만약 CAROUSEL이나 TIMELINE 같은 새로운 패턴이 들어오면 Phase 6-7의 if-elif 분기를 통째로 수정해야 한다. 파이프라인이 패턴 이름에 종속되어 있다는 뜻이다.

2. 검증이 여전히 수동 이번에도 Figma vs Code 불일치 항목을 Phase 0.6에서 눈으로 비교했다. 페이지가 늘어날수록 놓치는 항목이 생길 수밖에 없다.

3. 코드 분석 스크립트 부재 Figma는 Python으로 분석하는데, 기존 코드 구조를 분석하는 스크립트가 없다. 비교 기준이 되는 코드 정보를 매번 수작업으로 읽어야 했다.

다음 일지에서 이 세 가지를 v6으로 어떻게 해결했는지 정리한다.