-
Notifications
You must be signed in to change notification settings - Fork 0
Description
🔄 프로젝트 인식 및 컨텍스트
- 새로운 대화를 시작할 때 항상
PLANNING.md를 읽어 프로젝트의 아키텍처, 목표, 스타일, 제약사항을 이해한다. - 새로운 작업을 시작하기 전에
TASK.md를 확인한다. 작업이 목록에 없다면 간단한 설명과 오늘 날짜를 추가한다. PLANNING.md에 설명된 일관된 명명 규칙, 파일 구조, 아키텍처 패턴을 사용한다.- 개발 서버는 개발자가 직접 로컬에서
npm run dev를 실행한다. Claude Code는 백그라운드에서 서버를 실행하지 않으며, 개발자가 수동으로 서버를 시작하고 관리한다. - 초기 DB 구조는 **
docs/references/db-structure.sql**를 따른다. 만약, 초기 DB구조로 구현이 불가능한 사항이 생기면, 어떤 변경을 해야하며 또 그 이유는 무엇인지를 논리적으로 설명하면서 반드시, 사용자에게 승인을 구해야 한다. /docs/references/database-erd.mdc를 참고하여 database 설계를 이해한다.- **
http://localhost:8000/api/redoc/**의 설계대로 동작하도록 구현해야 한다.
🧱 코드 구조 및 모듈화- 500줄을 초과하는 컴포넌트나 파일을 절대 만들지 않는다. 파일이 이 제한에 근접하면 하위 컴포넌트나 유틸리티 함수로 분할하여 리팩토링한다.
- Feature-based 모듈화를 사용한다.
각 기능은features/폴더 내에 독립적인 모듈로 구성된다:
features/ ├── [feature-name]/ │ ├── components/ # 피처 전용 컴포넌트 │ ├── screens/ # 주요 화면 컴포넌트 │ ├── hooks/ # 커스텀 훅 │ ├── types.ts # 타입 정의 │ ├── constants.ts # 상수 정의 │ ├── utils/ # 유틸리티 함수 │ └── index.ts # 모듈 내보내기 - 공통 컴포넌트는
components/폴더에, 공유 유틸리티는shared/폴더에 배치한다. - 절대 경로 import를 사용한다 (
@/components,@/lib,@/features등). - 각 피처의
index.ts에서 명시적으로 내보내기를 정의한다.
🔨 작업 진행 방식
- 작업을 의미있는 커밋 가능한 단위로 나누어 진행한다
- 한 번에 모든 기능을 구현하지 말고, 논리적 단위로 나누어 작업
- 각 단계가 완료되면 개발 서버에서 테스트하여 정상 동작 확인
- 사용자가 원할 때 커밋할 수 있도록 완성된 상태 유지
- 작업 단위 예시:
- 타입 정의 → 인터페이스 및 스키마 작성
- 컴포넌트 구현 → 기본 UI 구조 작성
- 상태 관리 → React Query 훅 또는 Zustand 스토어 구현
- 비즈니스 로직 → 커스텀 훅으로 로직 분리
- 스타일링 → Tailwind CSS로 디자인 적용
- 테스트 → Playwright E2E 테스트 작성
-
각 작업 단위 완료 시:
-
구현한 내용 요약 제공
-
개발 서버 실행 결과 확인
-
다음 작업 단위 예고
-
절대 하지 말아야 할 것:
-
❌ 여러 기능을 한꺼번에 구현
-
❌ 테스트 없이 다음 단계로 진행
-
❌ 미완성 상태로 다음 작업 시작
🧪 테스트 및 신뢰성
- 새로운 기능에 대해 항상 Playwright E2E 테스트를 작성한다 (사용자 시나리오, 페이지 네비게이션, 폼 제출 등).
- 컴포넌트 로직을 업데이트한 후, 기존 테스트의 업데이트가 필요한지 확인한다.
필요하다면 업데이트한다. - 테스트는
/tests폴더에 위치하며 실제 사용자 워크플로우를 테스트한다. - 최소한 다음을 포함한다:
- 정상 시나리오 테스트 1개
- 에러 처리 테스트 1개
- 반응형 디자인 테스트 1개
🔐 테스트 인증 플로우 (Custom Fixture 시스템)
로그인에서 홈화면까지의 완전한 플로우:
- 테스트 계정 토글 선택 → 데모계정 선택(
demo@example.com) → 로그인버튼 활성화 - 로그인버튼 클릭 → access token 발급 완료
- 사용자 상태 확인:
hasCompletedOnboarding값에 따라
true: 온보딩 패스 → 바로 홈화면false: 온보딩 단계 진행
- 홈화면 진입 → 성과보고서 모달 등장
- 성과보고서 6단계 진행: "다음" 버튼 6번 클릭 → "완료" 버튼 클릭
- 공복체중 입력 모달 등장 → ESC키로 모달 닫기 (개발모드)
- meals 테스트 진행 가능 상태Custom Fixture 사용법:
typescriptimport { test, expect } from '../fixtures/authenticated-page'test('meals API test', async ({ authenticatedPage }) => { // 이미 로그인 완료, 성과보고서 완료, 공복체중 모달 닫기 완료된 상태 await authenticatedPage.goto('/meal-logging') // 실제 테스트 로직...})
관련 파일:-tests/fixtures/authenticated-page.ts: Custom Fixture 구현-tests/helpers/auth-helper.ts: 로그인 플로우 로직
✅ 작업 완료
- 작업을 완료한 직후
TASK.md에 완료된 작업을 표시한다. - 개발 중 발견된 새로운 하위 작업이나 TODO를
TASK.md의 "작업 중 발견 사항" 섹션에 추가한다. - 작업을 완료한 직후 사용한 프롬프트를 prompts/prompt-list.md 위치에 저장한다.
📎 스타일 및 규칙
- TypeScript를 주 언어로 사용한다.
- React 함수형 컴포넌트와 Hooks를 사용한다.
- Tailwind CSS를 사용하여 스타일링한다 (인라인 클래스 사용).
- shadcn/ui 컴포넌트를 우선 사용한다 (Button, Input, Dialog 등).
- 상태 관리는 React Query (서버 상태) + Zustand (클라이언트 상태)를 사용한다.
- 폼 관리는 React Hook Form + Zod를 사용한다.
- 모든 컴포넌트와 함수에 JSDoc 주석을 작성한다:
typescript /** * 사용자 프로필 카드 컴포넌트 * * @param user - 사용자 정보 객체 * @param onEdit - 편집 버튼 클릭 핸들러 * @returns 사용자 프로필 카드 JSX 엘리먼트 */ function UserProfileCard({ user, onEdit }: UserProfileCardProps) { // ... }
🔧 TypeScript 타입 에러 수정 규칙**
타입 에러 발생 시 반드시 docs/development/typescript-error-handling-rules.md의 규칙을 따른다.
🚨 절대 금지 사항
any타입으로 에러를 숨기지 않는다@ts-ignore주석 사용 금지- 타입 단언(
as) 남용 금지
📋 에러 처리 우선순위
- Critical: undefined/null 접근 → 옵셔널 체이닝(
?.) + 기본값 - High: API 메서드 미존재 → 실제 API 인터페이스 확인 후 수정
- Medium: 타입 불일치 → 타입 매핑 함수 또는 유니온 타입 확장
🛠 표준 해결 패턴
typescript// ✅ Undefined 처리const items = response.data?.items || []// ✅ API 메서드 확인// 추측하지 말고 실제 메서드 존재 여부 확인const methods = Object.getOwnPropertyNames(api)console.log('Available methods:', methods)// ✅ 타입 매핑const MAPPING = { 'carbs': 'carbohydrates' } as constconst mappedType = MAPPING[frontendType] || frontendType
📚 문서화 및 설명- 새로운 기능이 추가되거나, 의존성이 변경되거나, 설정 단계가 수정될 때 README.md를 업데이트한다.
- 명확하지 않은 코드에 주석을 달고 모든 것이 중급 React 개발자에게 이해 가능하도록 한다.
- 복잡한 비즈니스 로직을 작성할 때, 인라인 주석을 추가하여 무엇을 하는지가 아닌 왜 하는지를 설명한다.
🎨 UI/UX 가이드라인
- shadcn/ui 컴포넌트를 최대한 활용한다 (일관된 디자인 시스템 유지).
- 반응형 디자인을 항상 고려한다 (모바일 우선 접근).
- 접근성을 고려한다 (ARIA 라벨, 키보드 네비게이션 등).
- 로딩 상태와 에러 상태를 적절히 처리한다.
🔌 API 및 데이터 관리
- React Query를 사용하여 서버 상태를 관리한다.
- API 호출은
/lib/api/폴더에 모듈화한다. - 타입 안전성을 보장하기 위해 API 응답에 대한 타입을 정의한다.
- 에러 처리를 적절히 구현한다 (토스트 메시지, 에러 바운더리 등).
🚨 Mock API 사용 금지 정책
- ✅ 절대 Mock API나 Mock 데이터를 사용하지 않는다
- ✅ 모든 데이터는 Real API에서만 조회한다 (
/lib/api/real/사용) - ✅ Mock 폴더(
/lib/api/mock/)의 파일들은 사용하지 않는다 - ✅ 하드코딩된 값 대신 백엔드 API 응답값을 사용한다
- ✅ 새로운 Mock 데이터를 생성하지 않는다
- ✅ 기존 Mock 데이터 참조를 Real API로 교체한다
🧠 AI 동작 규칙
- 누락된 컨텍스트를 가정하지 않는다. 불확실할 때는 질문한다.
- 라이브러리나 함수를 임의로 만들지 않는다
– 알려진, 검증된 React/Next.js 패키지만 사용한다. - 코드에서 참조하기 전에 파일 경로와 컴포넌트 이름이 존재하는지 항상 확인한다.
- 명시적으로 지시받거나
TASK.md의 작업의 일부가 아닌 한 기존 코드를 삭제하거나 덮어쓰지 않는다.
📝 Git 커밋 컨벤션
"작은 단위로, 명확한 목적을 가진 커밋"
커밋 메시지 형식
<type>(<scope>): <subject><body><footer>
Type (필수)
- feat: 새로운 기능 추가
- fix: 버그 수정
- docs: 문서 수정
- style: 코드 포맷팅, 세미콜론 누락 등 (코드 변경 없음)
- refactor: 코드 리팩토링 (기능 변경 없음)
- test: 테스트 추가 또는 수정
- chore: 빌드 작업, 패키지 매니저 설정 등
- perf: 성능 개선#### Scope (선택)
- ui: UI 컴포넌트
- api: API 관련
- auth: 인증 관련
- test: 테스트 관련
- 기능명: meal-tracking, analytics 등
Subject (필수)
- 50자 이내로 작성
- 명령문으로 작성 (동사원형 사용)
- 마침표 없음
- 한글 사용 가능
Body (선택)
- 무엇을, 왜 변경했는지 설명
- 줄바꿈은 72자마다
- 리스트 사용 가능 (-, *)
커밋 순서 가이드
- 기능 구현: 컴포넌트/로직 먼저
- 테스트 추가: 구현한 기능의 테스트
- 문서화: 필요한 문서 업데이트
- 정리: 불필요한 코드 제거
예시
bashfeat(ui): WheelPicker 컴포넌트에 마우스 휠 이벤트 지원 추가- WheelPicker와 DecimalWheelPicker에 onWheel 핸들러 구현- 마우스 휠로 값을 증가/감소할 수 있도록 개선- 스프링 애니메이션과 햅틱 피드백 지원- E2E 테스트 자동화를 위한 접근성 향상
bashtest: localStorage 인증 토큰 저장 E2E 테스트 추가- 로그인 후 accessToken/refreshToken 저장 확인- JWT 토큰 형식 검증- 페이지 새로고침 후 토큰 유지 확인
커밋 분리 원칙
- 한 커밋에는 하나의 논리적 변경사항만
- 커밋은 독립적으로 실행 가능한 상태 유지
- 테스트가 통과하는 상태로 커밋
- 관련없는 변경사항은 별도 커밋으로 분리
커밋 메시지 제외 사항
- Claude Code 관련 내용을 절대 포함하지 않는다
- 다음과 같은 내용들은 커밋 메시지에서 제외:
🤖 Generated with [Claude Code](https://claude.ai/code)Co-Authored-By: Claude <noreply@anthropic.com>- 기타 Claude Code 도구 관련 언급
📱 모바일 최적화
- 모든 UI는 모바일 우선으로 설계한다.
- 터치 인터페이스를 고려한다 (적절한 터치 타겟 크기, 제스처 지원).
- 성능을 최적화한다 (이미지 최적화, 지연 로딩 등).
중요 지시사항
알림요청받은 것만 한다.
더도 말고 덜도 말고.
목표 달성에 절대적으로 필요한 경우가 아니라면 파일을 생성하지 않는다.
항상 새 파일을 만드는 것보다 기존 파일을 편집하는 것을 선호한다.
사용자가 명시적으로 요청하지 않는 한 문서 파일(*.md)이나 README 파일을 생성하지 않는다.