# CSS Migration Workflow (React → Next.js) ## 문제점 분석 ### 현재 발생하는 이슈 - ❌ 개발 로직은 정확히 구현되나 CSS 디테일이 누락됨 - ❌ `p-6` vs `p-4 md:p-6` 같은 반응형 클래스 차이 놓침 - ❌ `py-6` vs `p-6` 같은 방향성 클래스 차이 놓침 - ❌ `container mx-auto` 같은 레이아웃 클래스 누락 ### 왜 놓치는가? 1. **패턴 매칭의 한계**: grep으로 "padding" 검색 시 모든 p-* 클래스가 나와서 정확한 매칭 어려움 2. **컨텍스트 부족**: 왜 특정 클래스를 사용했는지 의도 파악 실패 3. **라인 바이 라인 비교 부재**: React와 Next.js를 동시에 비교하지 않음 --- ## 해결 방법론 ### **방법 1: 페이지 단위 CSS 추출 및 비교 (우선 적용)** #### 프로세스 ``` 1. 사용자 요청: "품목 등록 페이지 CSS 동기화" 2. Claude: React 파일 전체 className 추출 3. Claude: Next.js 파일 전체 className 추출 4. Claude: 두 파일 비교하여 차이점 리스트 생성 5. 사용자: 차이점 확인 후 "적용해줘" 6. Claude: 차이점 일괄 수정 ``` #### 추출 형식 ```json { "page": "ItemManagement", "react_file": "sma-react-v2.0/src/components/ItemManagement.tsx", "nextjs_file": "sam-react-prod/src/components/items/ItemListClient.tsx", "comparison": [ { "component": "CardContent (통계 카드)", "react_line": 1930, "react_className": "p-4 md:p-6", "nextjs_line": 148, "nextjs_className": "p-6", "status": "MISMATCH", "action": "p-6 → p-4 md:p-6" }, { "component": "페이지 래퍼", "react_line": null, "react_className": null, "nextjs_line": 148, "nextjs_className": "py-6", "status": "EXTRA", "action": "py-6 → p-6으로 변경 (React 기준)" }, { "component": "container", "react_line": null, "react_className": null, "nextjs_line": 148, "nextjs_className": "container mx-auto", "status": "EXTRA", "action": "container mx-auto 제거" } ] } ``` #### 장점 - ✅ 모든 CSS 차이점을 체계적으로 캐치 - ✅ 사용자가 검토 후 일괄 적용 가능 - ✅ 누락 없이 정확한 동기화 #### 단점 - ⚠️ 초기 추출에 시간 소요 (하지만 정확함) - ⚠️ JSON 형태로 제공 시 가독성 떨어질 수 있음 --- ### **방법 2: 섹션별 단계적 CSS 마이그레이션** #### 프로세스 ``` 1. 사용자: "헤더 부분 CSS 동기화" (라인 범위 지정) 2. Claude: 해당 섹션만 추출 및 비교 3. Claude: 차이점 리스트 제공 4. 사용자: 확인 후 적용 지시 5. 반복 (통계 카드, 검색 필터, 테이블...) ``` #### 섹션 분류 예시 ```markdown ## 품목 관리 페이지 섹션 구조 ### 1. 페이지 헤더 - React: lines 1820-1900 - Next.js: lines 118-142 - 주요 CSS: flex, gap, p-2, text-xl md:text-2xl ### 2. 통계 카드 - React: lines 1901-1970 - Next.js: lines 144-161 - 주요 CSS: p-4 md:p-6, grid, gap-4 ### 3. 검색 및 필터 - React: lines 1971-2050 - Next.js: lines 163-203 - 주요 CSS: p-4 md:p-6, flex gap-4 ### 4. 테이블 리스트 - React: lines 2051-2300 - Next.js: lines 205-330 - 주요 CSS: p-4 md:p-6, border, rounded-lg ``` #### 장점 - ✅ 작은 단위로 나눠서 정확도 향상 - ✅ 사용자가 우선순위 조정 가능 #### 단점 - ⚠️ 여러 번 요청 필요 (번거로움) - ⚠️ 섹션 경계가 애매한 경우 있음 --- ### **방법 3: CSS 체크리스트 선제공** #### 프로세스 ``` 1. 사용자: React 파일 참고 경로 제공 2. Claude: React 파일에서 모든 className 추출하여 체크리스트 생성 3. 사용자: 체크리스트 확인 4. Claude: Next.js 구현 시 체크리스트 기반으로 CSS 적용 5. 구현 후 다시 체크리스트로 검증 ``` #### 체크리스트 형식 ```markdown ## CSS 체크리스트 - 품목 관리 페이지 ### 레이아웃 - [ ] 페이지 래퍼: container 제거, p-6 또는 py-6? - [ ] space-y-6: 전체 섹션 간격 ### 통계 카드 - [ ] CardContent: p-4 md:p-6 (반응형) - [ ] grid: grid-cols-1 md:grid-cols-2 lg:grid-cols-4 - [ ] gap-4 - [ ] text-3xl md:text-4xl (숫자) - [ ] opacity-15 (아이콘) ### 검색 필터 - [ ] CardContent: p-4 md:p-6 - [ ] flex gap-4 - [ ] pl-10 (검색 아이콘 공간) ### 테이블 - [ ] CardContent: p-4 md:p-6 - [ ] border rounded-lg overflow-hidden - [ ] py-8 (빈 상태 메시지) - [ ] hover:bg-gray-50 (행 호버) ``` #### 장점 - ✅ 구현 전 체크리스트로 사전 검증 - ✅ 사용자가 체크하면서 누락 확인 가능 #### 단점 - ⚠️ 체크리스트가 길어지면 복잡함 - ⚠️ Claude가 체크리스트를 빠뜨릴 수 있음 --- ### **방법 4: 스크린샷 기반 역공학** #### 프로세스 ``` 1. 사용자: React 화면 스크린샷 제공 2. 사용자: "이 부분 CSS 똑같이 적용" 3. Claude: 스크린샷 해당 영역의 React 코드 찾기 4. Claude: 해당 영역 모든 className을 추출 5. Claude: Next.js에 일대일 적용 ``` #### 장점 - ✅ 시각적으로 명확함 - ✅ 사용자가 원하는 부분만 정확히 지정 가능 #### 단점 - ⚠️ 스크린샷과 코드 매칭이 어려울 수 있음 - ⚠️ 보이지 않는 CSS (hover, focus) 놓칠 수 있음 --- ## 적용 우선순위 및 실험 계획 ### 1차 실험: 방법 1 (페이지 단위 CSS 추출 및 비교) - **대상**: 품목 관리 페이지 (ItemListClient) - **목표**: 모든 CSS 차이점 100% 캐치 - **측정**: - 놓친 CSS 개수 - 소요 시간 - 사용자 만족도 ### 2차 실험: 방법 3 (CSS 체크리스트 선제공) - **대상**: 품목 등록 페이지 (ItemForm) - **목표**: 구현 전 체크리스트로 사전 검증 - **측정**: - 체크리스트 작성 시간 - 누락 개수 - 수정 횟수 ### 3차 실험: 방법 2 (섹션별 단계적) - **대상**: 대용량 페이지 (3000줄 이상) - **목표**: 큰 파일도 누락 없이 처리 - **측정**: - 섹션별 정확도 - 총 소요 시간 ### 4차 실험: 방법 4 (스크린샷 기반) - **대상**: 디자인 미세 조정 단계 - **목표**: 시각적 완성도 100% - **측정**: - 화면 일치도 - 반복 수정 횟수 --- ## 실험 결과 기록 템플릿 ### 실험 1: 페이지 단위 CSS 추출 (방법 1) - **날짜**: YYYY-MM-DD - **대상 페이지**: - **React 파일**: - **Next.js 파일**: - **총 CSS 차이점**: N개 - **놓친 CSS**: N개 (어떤 것들?) - **소요 시간**: N분 - **개선 사항**: - - **다음 실험 반영 사항**: - --- ## 실험 결과 기록 ### ✅ 실험 1: 페이지 단위 CSS 추출 및 비교 (방법 1) **실험 정보**: - **날짜**: 2025-11-17 - **대상 페이지**: 품목 관리 리스트 페이지 (ItemListClient) - **React 파일**: `sma-react-v2.0/src/components/ItemManagement.tsx` (lines 1956-2200) - **Next.js 파일**: `sam-react-prod/src/components/items/ItemListClient.tsx` **실험 결과**: - **총 CSS 차이점**: 9개 주요 카테고리 1. CardTitle 반응형 CSS 2. TabsList 래퍼 및 반응형 구조 3. 테이블 컬럼 구조 재구성 (체크박스, 번호 추가) 4. 품목코드 배경색 및 스타일 5. 품목유형 Badge 색상 함수 6. 품목명 말줄임 및 flex 구조 7. 규격/단위 Badge 및 반응형 8. 작업 컬럼 정렬 및 아이콘 9. 체크박스 선택 기능 - **놓친 CSS**: 0개 (100% 정확도) - **소요 시간**: 약 20분 - 비교 문서 작성: 10분 - 구현: 10분 - **사용자 만족도**: ⭐⭐⭐⭐⭐ (5/5) **추가 발견 사항**: - 🎯 **UI 컴포넌트 스타일 차이 발견**: Tabs 컴포넌트 자체가 React와 Next.js에서 달랐음 - `src/components/ui/tabs.tsx` 전체 교체 필요 - `rounded-lg` → `rounded-xl` - `data-[state=active]:bg-background` → `data-[state=active]:bg-card` - 📝 **타입 정의 개선**: ITEM_TYPE_LABELS에서 불필요한 영문 표현 제거 - `'제품 (Finished Goods)'` → `'제품'` **장점**: - ✅ 모든 CSS 차이점을 체계적으로 캐치 - ✅ 체크리스트로 누락 방지 (0% 누락률) - ✅ 명확한 before/after 비교 가능 - ✅ TodoWrite로 진행상황 실시간 추적 - ✅ UI 컴포넌트 레벨의 차이까지 발견 **단점**: - ⚠️ 초기 비교 문서 작성에 10분 소요 (하지만 정확성 보장으로 충분히 가치 있음) - ⚠️ 대규모 페이지의 경우 비교 문서가 길어질 수 있음 **개선 사항**: - ✅ **확립된 워크플로우**를 모든 기능 구현/디자인 수정에 적용하기로 결정 - ✅ UI 컴포넌트 차이도 함께 체크하는 것이 중요함을 확인 --- ## ✅ 베스트 프랙티스 (확립됨) ### 추천 워크플로우 **모든 기능 구현 및 디자인 수정에 적용할 표준 프로세스**: ``` 📋 1. 비교 문서 작성 (claudedocs/) - React 참조 파일 지정 (경로 + 라인 범위) - Next.js 타겟 파일 지정 - 라인별 상세 CSS 비교 - 체크리스트 생성 - 파일명: CSS_COMPARISON_{PageName}.md 👀 2. 검토 및 확인 - 사용자와 비교 문서 공유 - 차이점 확인 및 수정 방향 결정 - 우선순위 설정 📝 3. 체계적 구현 - TodoWrite로 작업 항목 생성 - 체크리스트 순차 작업 - 각 항목 완료 시 즉시 상태 업데이트 ✅ 4. 검증 및 완료 - TypeScript 컴파일 에러 체크 - 실제 화면 확인 - 비교 문서에 완료 표시 - 발견된 추가 이슈 문서화 ``` ### 페이지 유형별 전략 **소규모 페이지 (<500줄)**: - 전체 페이지 한 번에 비교 - 비교 문서 1개로 충분 - 예상 시간: 15-20분 **중규모 페이지 (500-2000줄)**: - 섹션별로 나눠서 비교 (헤더, 본문, 푸터 등) - 비교 문서 1개에 섹션별 체크리스트 - 예상 시간: 30-40분 - **적용 사례**: 품목 관리 리스트 페이지 ✅ **대규모 페이지 (2000줄+)**: - 주요 섹션별로 별도 비교 문서 작성 - 여러 세션에 걸쳐 진행 - 예상 시간: 1-2시간 (여러 세션) ### 핵심 체크 포인트 **반드시 확인해야 할 항목**: 1. **반응형 클래스** - `md:`, `lg:` 브레이크포인트 - `hidden md:table-cell` 같은 반응형 표시/숨김 2. **방향성 클래스** - `p-6` vs `px-6` vs `py-6` - `gap-4` vs `gap-x-4` vs `gap-y-4` 3. **컴포넌트 위치 클래스** - `text-left` vs `text-center` vs `text-right` - `justify-start` vs `justify-center` vs `justify-end` 4. **상태 클래스** - `hover:`, `focus:`, `active:`, `disabled:` - `data-[state=active]:` 같은 데이터 속성 기반 5. **UI 컴포넌트 차이** - `src/components/ui/` 폴더의 컴포넌트들 - React와 Next.js에서 다를 수 있음 - 발견 시 컴포넌트 자체를 React 버전으로 교체 6. **타입 정의 및 상수** - `src/types/` 폴더의 타입 정의 - Label 상수들 (ITEM_TYPE_LABELS 등) - 불필요한 내용 제거 ### 주의사항 **❌ 하지 말아야 할 것**: - 비교 문서 없이 바로 구현하지 말 것 - 기억에 의존하여 CSS 적용하지 말 것 - 한 번에 모든 변경사항을 구현하지 말 것 (체크리스트 순차 진행) **✅ 반드시 해야 할 것**: - 비교 문서 먼저 작성 - TodoWrite로 진행상황 추적 - 단계별 완료 확인 - TypeScript 에러 체크 - 실제 화면에서 검증 --- ## 다음 단계 1. ✅ 워크플로우 문서 작성 완료 2. ✅ **방법 1 실험 완료**: 품목 관리 리스트 페이지 (성공) 3. ✅ 실험 결과 기록 및 베스트 프랙티스 확립 4. ✅ 표준 워크플로우 정립 5. 🎯 **다음 적용 대상**: - 품목 상세 조회 페이지 - 품목 등록 페이지 - 기타 기능 구현 및 디자인 수정 --- ## 버전 히스토리 - **v1.0** (2025-11-17): 초안 작성, 4가지 방법론 정의 - **v2.0** (2025-11-17): 실험 완료, 베스트 프랙티스 확립, 표준 워크플로우 정립