TIP/AI

Claude Code 사용법

고생쨩 2025. 12. 12. 08:24

Claude Code를 프로젝트에 효과적으로 설정하고 활용하는 방법을 정리한 가이드
예시 프로젝트는 cloudflare workers에 배포되는 Hono + Typescript + drrizleOrm 기반의 프로젝트임.

1. 폴더 구조

.claude/
├── CLAUDE.md                 # 메인 프로젝트 지침서 (필수)
├── settings.local.json       # 로컬 권한 설정
├── agent/                 # 전문가 정의
│   ├── architect.md
│   ├── dba.md
│   ├── reviewer.md
│   └── ...
├── commands/                 # 슬래시 커맨드 정의
│   ├── migration.md
│   ├── new-feature.md
│   ├── fix-bug.md
│   └── ...
└── docs/                     # 프로젝트 문서
    ├── architecture.md       # 아키텍처 문서
    ├── coding-standards.md   # 코딩 표준
    ├── api-guidelines.md     # API 가이드라인
    ├── testing-guide.md      # 테스트 가이드
    └── domains/              # 도메인별 문서
        ├── auth.md
        ├── users.md
        └── ...

핵심 포인트

  • CLAUDE.md: 프로젝트 루트의 .claude/ 폴더에 위치하면 Claude가 자동으로 인식.
  • agent/: 전문가 에이전트 정의
  • commands/: 슬래시 커맨드 정의
  • docs/: 프로젝트 컨텍스트 문서화

2. CLAUDE.md - 프로젝트 지침서

Claude가 모든 작업에서 참조하는 핵심 지침.
상세한 내용을 담지 말고 다른 파일들을 참조할 수 있는 링크의 모음집으로 활용하는게 기본.

권장 구성 요소

2.1 언어 및 호칭 설정

사용자를 **"여고생 님"**이라고 부르세요.

모든 응답을 **한국어로만** 작성해주세요.
- 코드 설명은 한국어로 작성
- 에러 메시지 설명은 한국어로 작성

언어 및 호칭 설정으로 실제로 작업 요청 시에 Claude가 설정을 제대로 읽고 처리하는 지 확인 가능.
호칭을 안 부른다면? 설정에 문제가 있는 것임.

2.2 작업 처리 방식 정의

## 작업 처리 방식

1. **작업 요청 JSON 변환**: 사용자가 작업을 요청하면, 요청 내용을 JSON 형식으로 구조화.

   ```json
   {
     "task": "작업 제목",
     "description": "작업 설명",
     "steps": ["단계1", "단계2"],
     "affected_files": ["파일1", "파일2"]
   }
   ```

2. **설정 자동 반영**: 작업 완료 후 규칙/문서에 즉시 반영

좀 더 ai가 읽기 편한 상태로 구조화. 효과 없다는 사람과 있다는 사람으로 나뉘는 셋팅.

2.3 문서 참조 테이블

## 아키텍처 문서

| 작업 유형          | 참조 문서                          |
| ------------------ | ---------------------------------- |
| 프로젝트 구조 이해 | [docs/architecture.md](docs/architecture.md) |
| 코드 작성          | [docs/coding-standards.md](docs/coding-standards.md) |
| API 개발           | [docs/api-guidelines.md](docs/api-guidelines.md) |
| 테스트 작성        | [docs/testing-guide.md](docs/testing-guide.md) |

변경된 내용들을 반드시 클로드 설정에도 업데이트 하도록 해야 프로젝트가 커지거나 길어질때 오류가 발생활 확률이 줄어듬.

2.4 개발 정책 (금지/권장 사항)

## 개발 정책

### 배포
- **배포 명령어를 직접 실행하지 마세요.**
- GitHub에 push하면 자동으로 배포됩니다.

### 테스트
- **새 기능 구현 시 반드시 테스트 코드 함께 작성**
- PR 전 `npm test` 통과 필수

3. 전문가 에이전트 시스템

특정 분야의 전문가 역할을 부여해서 깊이 있는 분석과 리뷰를 수행함.
직접 설정할 필요없이 종류만 나눠서 클로드에게 전문가로 설정해달라고 요청해서 기본 파일 생성.
생성된 파일에서 필요한 부분을 수정하여 사용하면 됨.

3.1 에이전트 종류

에이전트 전문 분야 사용 시나리오
/architect 아키텍처 구조 분석, 설계 문서 작성
/dba 데이터베이스 스키마 리뷰, 쿼리 최적화
/reviewer 코드 리뷰 코드 품질 분석, PR 리뷰
/tester 테스트 테스트 작성, 커버리지 분석
/security 보안 취약점 분석, 보안 감사
/performance 성능 병목 분석, 최적화
/fe 프론트엔드 ui 작성, 수정
/uiuxdesigner 디자인 디자인 분석, 개선

3.2 에이전트 파일 구조

파일: .claude/commands/reviewer.md

# 코드 리뷰어 전문가 에이전트

당신은 **시니어 코드 리뷰어**입니다. 15년 이상의 경험을 보유...

## 프로젝트 코딩 표준

참조: [coding-standards.md](../docs/coding-standards.md)

## 코드 리뷰 체크리스트

### 1. 코드 품질
- [ ] 함수/변수 이름이 명확한가?
- [ ] 함수 길이가 적절한가? (20줄 이하 권장)
- [ ] 중복 코드가 없는가?

### 2. TypeScript
- [ ] 타입이 명시적으로 정의되어 있는가?
- [ ] `any` 타입 사용을 피하고 있는가?

### 3. 에러 처리
- [ ] 모든 에러 케이스가 처리되는가?

## 리뷰 심각도 레벨

| 레벨 | 설명 | 조치 |
|------|------|------|
| 🔴 Critical | 버그, 보안 취약점 | 반드시 수정 |
| 🟠 Major | 성능 문제, 잘못된 로직 | 수정 권장 |
| 🟡 Minor | 코드 스타일, 네이밍 | 개선 권장 |
| 🔵 Suggestion | 더 나은 방법 제안 | 선택적 |

## 출력 형식

```json
{
  "summary": "전체 요약",
  "score": { "overall": "1-10" },
  "findings": [
    {
      "severity": "critical | major | minor",
      "file": "파일 경로",
      "issue": "이슈 설명",
      "suggestion": "개선 제안"
    }
  ]
}

사용자 요청: $ARGUMENTS

위 지침에 따라 코드 리뷰를 수행하세요.


### 3.3 에이전트 자동 실행 규칙

CLAUDE.md에 자동 실행 트리거를 정의하면 Claude가 작업 유형에 따라 자동으로 적절한 에이전트를 실행.

```markdown
## 에이전트 자동 실행 규칙

### 자동 실행 트리거

| 작업 유형 | 자동 실행 에이전트 | 트리거 상황 |
|-----------|-------------------|-------------|
| 코드 작성/수정 완료 | `/reviewer` | 기능 구현, 버그 수정 완료 시 |
| DB 스키마 변경 | `/dba` | 테이블 추가/수정, 마이그레이션 시 |
| 새 기능 설계 | `/architect` | 새 도메인, 대규모 구조 변경 시 |
| 서비스 함수 작성 | `/tester` | service.ts 수정 완료 시 |

3.4 에이전트 체이닝

복잡한 작업에서 여러 에이전트를 순차 실행함.

### 새 기능 개발 체인
/architect (설계) → 구현 → /tester (테스트 작성) → /reviewer (코드 리뷰)

### DB 변경 체인
/dba (스키마 설계) → 마이그레이션 → /dba (쿼리 검증) → /performance (성능 확인)

### 버그 수정 체인
버그 분석 → 실패 테스트 작성 → 수정 → /tester (테스트 통과 확인) → /reviewer

4. 작업 커맨드 시스템

슬래시 커맨드는 반복적인 작업 워크플로우를 자동화하는 핵심 기능임.
.claude/commands/ 폴더에 마크다운 파일로 정의하고, /커맨드명 형태로 실행함.

4.1 커맨드 기본 구조

# 커맨드 제목

[커맨드 설명 및 역할 정의]

## 참조 문서
[필요한 컨텍스트 문서 링크]

## 실행 단계
[순차적으로 수행할 작업들]

## 출력 형식
[결과물 형식 정의]

---

**사용자 요청**: $ARGUMENTS

[실행 지시문]
  • $ARGUMENTS: 사용자가 커맨드 뒤에 입력한 내용이 이 변수로 전달됨
  • 예: /new-feature 사용자 프로필 페이지$ARGUMENTS에 "사용자 프로필 페이지"가 들어감

4.2 작업 커맨드 종류

커맨드 용도 사용 예시
/new-feature 새 기능 개발 /new-feature 결제 시스템
/fix-bug 버그 수정 /fix-bug 로그인 실패 이슈
/refactor 리팩토링 /refactor UserService 클래스
/add-api API 엔드포인트 추가 /add-api POST /users
/add-component UI 컴포넌트 추가 /add-component 모달 다이얼로그
/migration DB 마이그레이션 /migration users 테이블에 phone 컬럼 추가
/deploy-check 배포 전 점검 /deploy-check
/git-commit 커밋 메시지 생성 /git-commit
/pr-create PR 생성 /pr-create

4.3 커맨드 예시 파일들

4.3.1 새 기능 개발 커맨드

파일: .claude/commands/new-feature.md

# 새 기능 개발 커맨드

당신은 시니어 풀스택 개발자입니다. 새로운 기능을 체계적으로 개발합니다.

## 참조 문서

- [아키텍처](../docs/architecture.md)
- [코딩 표준](../docs/coding-standards.md)
- [API 가이드라인](../docs/api-guidelines.md)

## 개발 프로세스

### Phase 1: 분석 및 설계
1. 요구사항 분석
2. 영향 받는 파일/모듈 파악
3. 데이터 모델 설계 (필요시)
4. API 설계 (필요시)

### Phase 2: 구현
1. 타입/인터페이스 정의 (`interface.ts`)
2. 유효성 검증 스키마 (`validators.ts`)
3. 비즈니스 로직 (`service.ts`)
4. API 라우트 (`routes.ts`)
5. UI 컴포넌트 (필요시)

### Phase 3: 검증
1. 단위 테스트 작성
2. 통합 테스트 작성
3. 수동 테스트

### Phase 4: 문서화
1. 도메인 문서 업데이트
2. API 문서 업데이트 (OpenAPI)
3. CHANGELOG 업데이트

## 체크리스트

- [ ] 타입 정의 완료
- [ ] 유효성 검증 추가
- [ ] 에러 처리 구현
- [ ] 테스트 코드 작성
- [ ] 문서 업데이트

## 출력 형식

```json
{
  "feature": "기능명",
  "description": "기능 설명",
  "files_created": ["생성된 파일 목록"],
  "files_modified": ["수정된 파일 목록"],
  "tests_added": ["추가된 테스트"],
  "remaining_tasks": ["남은 작업"]
}

기능 요청: $ARGUMENTS

위 프로세스에 따라 기능을 개발하세요. 각 단계를 진행하기 전에 계획을 먼저 설명하세요.


#### 4.3.2 버그 수정 커맨드

**파일**: `.claude/commands/fix-bug.md`

```markdown
# 버그 수정 커맨드

당신은 시니어 디버깅 전문가입니다. 체계적으로 버그를 분석하고 수정합니다.

## 디버깅 프로세스

### Step 1: 버그 재현
1. 버그 발생 조건 파악
2. 재현 단계 정리
3. 예상 동작 vs 실제 동작 비교

### Step 2: 원인 분석
1. 관련 코드 탐색
2. 로그/에러 메시지 분석
3. 데이터 흐름 추적
4. 근본 원인(Root Cause) 식별

### Step 3: 수정
1. **먼저** 실패하는 테스트 작성 (TDD)
2. 최소한의 변경으로 수정
3. 사이드 이펙트 확인
4. 테스트 통과 확인

### Step 4: 검증
1. 기존 테스트 전체 통과 확인
2. 회귀 테스트 추가
3. 엣지 케이스 확인

## 수정 원칙

- **최소 변경**: 버그 수정에 필요한 최소한의 코드만 변경
- **테스트 우선**: 수정 전에 반드시 실패하는 테스트 작성
- **사이드 이펙트 주의**: 다른 기능에 영향이 없는지 확인

## 출력 형식

```json
{
  "bug_summary": "버그 요약",
  "root_cause": "근본 원인",
  "solution": "해결 방법",
  "files_modified": ["수정된 파일"],
  "tests_added": ["추가된 테스트"],
  "verification": "검증 결과"
}

버그 설명: $ARGUMENTS

위 프로세스에 따라 버그를 분석하고 수정하세요.


#### 4.3.3 API 추가 커맨드

**파일**: `.claude/commands/add-api.md`

```markdown
# API 엔드포인트 추가 커맨드

새로운 API 엔드포인트를 프로젝트 표준에 맞게 추가합니다.

## 참조 문서

- [API 가이드라인](../docs/api-guidelines.md)
- [코딩 표준](../docs/coding-standards.md)

## 생성할 파일 구조

src/{domain}/
├── interface.ts # 요청/응답 타입 정의
├── validators.ts # Zod 스키마
├── service.ts # 비즈니스 로직
├── routes.ts # Hono 라우트
└── service.test.ts # 테스트


## 구현 단계

### 1. 타입 정의 (interface.ts)

```typescript
// 요청 타입
export interface CreateUserRequest {
  email: string;
  name: string;
}

// 응답 타입
export interface CreateUserResponse {
  id: string;
  email: string;
  name: string;
  createdAt: Date;
}

2. 유효성 검증 (validators.ts)

import { z } from 'zod';

export const createUserSchema = z.object({
  email: z.string().email('유효한 이메일을 입력하세요'),
  name: z.string().min(2, '이름은 2자 이상이어야 합니다'),
});

3. 서비스 로직 (service.ts)

export async function createUser(
  db: DrizzleD1Database,
  data: CreateUserRequest
): Promise<CreateUserResponse> {
  // 비즈니스 로직 구현
}

4. 라우트 정의 (routes.ts)

import { Hono } from 'hono';
import { zValidator } from '@hono/zod-validator';

const app = new Hono();

app.post(
  '/users',
  zValidator('json', createUserSchema),
  async (c) => {
    const data = c.req.valid('json');
    const result = await createUser(c.env.DB, data);
    return c.json(result, 201);
  }
);

5. 테스트 작성 (service.test.ts)

describe('createUser', () => {
  it('유효한입력_사용자생성성공', async () => {
    // 테스트 구현
  });

  it('중복이메일_에러반환', async () => {
    // 테스트 구현
  });
});

API 테스트 체크리스트

  • 정상 요청 (200/201)
  • 필수 필드 누락 (400)
  • 잘못된 형식 (400)
  • 인증 없음 (401)
  • 권한 없음 (403)
  • 리소스 없음 (404)

출력 형식

{
  "endpoint": "POST /api/users",
  "description": "엔드포인트 설명",
  "files_created": ["생성된 파일"],
  "request_schema": {},
  "response_schema": {},
  "test_cases": ["테스트 케이스 목록"]
}

API 요청: $ARGUMENTS

위 표준에 따라 API 엔드포인트를 추가하세요.


#### 4.3.4 DB 마이그레이션 커맨드

**파일**: `.claude/commands/migration.md`

```markdown
# DB 마이그레이션 커맨드

데이터베이스 스키마 변경을 안전하게 수행합니다.

## 참조 문서

- [DB 스키마](../docs/db-schema.md)

## 마이그레이션 프로세스

### Step 1: 현재 상태 확인
1. 기존 스키마 확인
2. 영향 받는 테이블/컬럼 파악
3. 기존 데이터 확인

### Step 2: 마이그레이션 계획
1. 변경 내용 정리
2. 롤백 계획 수립
3. 다운타임 예상

### Step 3: 마이그레이션 파일 생성

```typescript
// drizzle/migrations/YYYYMMDD_description.ts
import { sql } from 'drizzle-orm';

export async function up(db) {
  await db.run(sql`
    ALTER TABLE users ADD COLUMN phone TEXT;
  `);
}

export async function down(db) {
  await db.run(sql`
    ALTER TABLE users DROP COLUMN phone;
  `);
}

Step 4: 스키마 파일 업데이트

// src/db/schema.ts
export const users = sqliteTable('users', {
  id: text('id').primaryKey(),
  email: text('email').notNull(),
  phone: text('phone'),  // 새로 추가
});

Step 5: 검증

  1. 로컬 DB에서 마이그레이션 테스트
  2. 타입 생성 확인 (npm run db:generate)
  3. 기존 쿼리 동작 확인

주의사항

  • 데이터 손실 주의: DROP/DELETE 연산 전 백업 확인
  • NOT NULL 추가 시: 기본값 설정 또는 기존 데이터 처리 필요
  • 인덱스 추가 시: 대량 데이터 테이블은 성능 영향 고려

출력 형식

{
  "migration_name": "마이그레이션 이름",
  "changes": ["변경 내용"],
  "files_created": ["생성된 파일"],
  "files_modified": ["수정된 파일"],
  "rollback_plan": "롤백 계획",
  "verification_steps": ["검증 단계"]
}

마이그레이션 요청: $ARGUMENTS

위 프로세스에 따라 마이그레이션을 수행하세요.


#### 4.3.5 리팩토링 커맨드

**파일**: `.claude/commands/refactor.md`

```markdown
# 리팩토링 커맨드

코드 품질을 개선하면서 기존 동작을 유지합니다.

## 리팩토링 원칙

1. **동작 유지**: 외부에서 보이는 동작은 변경하지 않음
2. **점진적 변경**: 작은 단위로 나눠서 진행
3. **테스트 기반**: 리팩토링 전 테스트로 동작 보장

## 리팩토링 프로세스

### Step 1: 사전 준비
1. 대상 코드의 현재 테스트 커버리지 확인
2. 테스트가 부족하면 먼저 테스트 추가
3. 모든 테스트 통과 확인

### Step 2: 리팩토링 계획
1. 개선할 코드 스멜(Code Smell) 식별
2. 적용할 리팩토링 기법 선택
3. 변경 순서 계획

### Step 3: 점진적 리팩토링
1. 하나의 리팩토링 적용
2. 테스트 실행
3. 통과하면 다음 리팩토링
4. 실패하면 롤백 후 원인 분석

### Step 4: 정리
1. 불필요한 코드 제거
2. 주석 업데이트
3. 문서 업데이트

## 일반적인 리팩토링 기법

| 코드 스멜 | 리팩토링 기법 |
|----------|---------------|
| 긴 함수 | Extract Function |
| 중복 코드 | Extract Function, Pull Up Method |
| 긴 매개변수 목록 | Introduce Parameter Object |
| 복잡한 조건문 | Replace Conditional with Polymorphism |
| 임시 변수 남용 | Replace Temp with Query |

## 출력 형식

```json
{
  "target": "리팩토링 대상",
  "code_smells": ["발견된 코드 스멜"],
  "techniques_applied": ["적용한 리팩토링 기법"],
  "files_modified": ["수정된 파일"],
  "before_after": {
    "before": "변경 전 코드 요약",
    "after": "변경 후 코드 요약"
  },
  "test_results": "테스트 결과"
}

리팩토링 대상: $ARGUMENTS

위 프로세스에 따라 리팩토링을 수행하세요. 기존 동작을 절대 변경하지 마세요.


#### 4.3.6 컴포넌트 추가 커맨드

**파일**: `.claude/commands/add-component.md`

```markdown
# UI 컴포넌트 추가 커맨드

재사용 가능한 UI 컴포넌트를 프로젝트 표준에 맞게 추가합니다.

## 참조 문서

- [컴포넌트 가이드](../docs/component-guide.md)
- [디자인 시스템](../docs/design-system.md)

## 컴포넌트 구조

src/components/{ComponentName}/
├── index.tsx # 메인 컴포넌트
├── types.ts # 타입 정의
├── styles.css # 스타일 (또는 Tailwind)
├── hooks.ts # 커스텀 훅 (필요시)
└── ComponentName.test.tsx # 테스트


## 구현 단계

### 1. 타입 정의 (types.ts)

```typescript
export interface ButtonProps {
  variant?: 'primary' | 'secondary' | 'ghost';
  size?: 'sm' | 'md' | 'lg';
  disabled?: boolean;
  loading?: boolean;
  children: React.ReactNode;
  onClick?: () => void;
}

2. 컴포넌트 구현 (index.tsx)

import { ButtonProps } from './types';

export function Button({
  variant = 'primary',
  size = 'md',
  disabled = false,
  loading = false,
  children,
  onClick,
}: ButtonProps) {
  return (
    <button
      className={cn(
        'rounded font-medium transition-colors',
        variants[variant],
        sizes[size],
        disabled && 'opacity-50 cursor-not-allowed'
      )}
      disabled={disabled || loading}
      onClick={onClick}
    >
      {loading ? <Spinner /> : children}
    </button>
  );
}

3. 테스트 작성

describe('Button', () => {
  it('renders children correctly', () => {
    render(<Button>Click me</Button>);
    expect(screen.getByText('Click me')).toBeInTheDocument();
  });

  it('handles click events', () => {
    const onClick = vi.fn();
    render(<Button onClick={onClick}>Click</Button>);
    fireEvent.click(screen.getByText('Click'));
    expect(onClick).toHaveBeenCalled();
  });

  it('disables button when disabled prop is true', () => {
    render(<Button disabled>Click</Button>);
    expect(screen.getByRole('button')).toBeDisabled();
  });
});

컴포넌트 체크리스트

  • Props 타입 정의
  • 기본값 설정
  • 접근성 (aria 속성)
  • 반응형 디자인
  • 다크모드 지원 (필요시)
  • 테스트 작성
  • Storybook 스토리 (필요시)

출력 형식

{
  "component_name": "컴포넌트명",
  "description": "컴포넌트 설명",
  "files_created": ["생성된 파일"],
  "props": ["prop 목록"],
  "variants": ["변형 목록"],
  "usage_example": "사용 예시"
}

컴포넌트 요청: $ARGUMENTS

위 표준에 따라 컴포넌트를 추가하세요.


#### 4.3.7 Git 커밋 메시지 커맨드

**파일**: `.claude/commands/git-commit.md`

```markdown
# Git 커밋 메시지 생성 커맨드

변경사항을 분석하여 Conventional Commits 형식의 커밋 메시지를 생성합니다.

## 커밋 메시지 형식

():

```

타입 종류

타입 설명 예시
feat 새 기능 feat(auth): 소셜 로그인 추가
fix 버그 수정 fix(cart): 수량 계산 오류 수정
docs 문서 변경 docs: README 업데이트
style 코드 스타일 style: 들여쓰기 수정
refactor 리팩토링 refactor(user): 서비스 로직 분리
test 테스트 test(auth): 로그인 테스트 추가
chore 빌드/설정 chore: 의존성 업데이트

실행 단계

  1. git diff --staged 또는 git diff로 변경사항 확인
  2. 변경된 파일 분석
  3. 변경 유형 파악 (feat/fix/refactor 등)
  4. 영향 범위(scope) 파악
  5. 커밋 메시지 생성

좋은 커밋 메시지 원칙

  • 제목은 50자 이내
  • 제목은 명령형으로 (Add, Fix, Update)
  • 본문은 72자마다 줄바꿈
  • 왜(Why) 변경했는지 설명

출력 형식

feat(users): 사용자 프로필 수정 기능 추가

- PATCH /api/users/:id 엔드포인트 추가
- 프로필 이미지 업로드 지원
- 유효성 검증 로직 추가

Closes #123

변경사항을 분석하여 커밋 메시지를 생성하세요.
$ARGUMENTS


#### 4.3.8 PR 생성 커맨드

**파일**: `.claude/commands/pr-create.md`

```markdown
# PR(Pull Request) 생성 커맨드

변경사항을 분석하여 PR 설명을 생성합니다.

## PR 템플릿

```markdown
## 📋 개요
[이 PR이 무엇을 하는지 한 줄 요약]

## 🎯 관련 이슈
- Closes #이슈번호

## 📝 변경사항
- 변경사항 1
- 변경사항 2

## 🧪 테스트
- [ ] 단위 테스트 추가/수정
- [ ] 통합 테스트 추가/수정
- [ ] 수동 테스트 완료

## 📸 스크린샷 (UI 변경시)
[해당사항 없으면 삭제]

## ✅ 체크리스트
- [ ] 코드 셀프 리뷰 완료
- [ ] 테스트 통과 확인
- [ ] 문서 업데이트 (필요시)

실행 단계

  1. 현재 브랜치와 main/master 브랜치 비교
  2. 커밋 히스토리 분석
  3. 변경된 파일 분석
  4. PR 설명 생성

출력

PR 템플릿 형식에 맞춰 설명을 생성합니다.


$ARGUMENTS


#### 4.3.9 배포 전 점검 커맨드

**파일**: `.claude/commands/deploy-check.md`

```markdown
# 배포 전 점검 커맨드

배포 전 필수 점검 항목을 확인합니다.

## 점검 항목

### 1. 코드 품질
- [ ] 린트 에러 없음 (`npm run lint`)
- [ ] 타입 에러 없음 (`npm run type-check`)
- [ ] 모든 테스트 통과 (`npm test`)

### 2. 보안
- [ ] 민감 정보 하드코딩 없음
- [ ] 환경변수 올바르게 설정
- [ ] CORS 설정 확인

### 3. 성능
- [ ] 불필요한 console.log 제거
- [ ] 큰 파일 번들 확인
- [ ] 이미지 최적화

### 4. 문서
- [ ] CHANGELOG 업데이트
- [ ] API 문서 최신화
- [ ] README 업데이트 (필요시)

### 5. 데이터베이스
- [ ] 마이그레이션 파일 확인
- [ ] 롤백 계획 수립

## 실행 단계

1. `npm run lint` 실행
2. `npm run type-check` 실행
3. `npm test` 실행
4. 변경된 파일 스캔하여 보안 이슈 확인
5. 결과 리포트 생성

## 출력 형식

```json
{
  "status": "ready | warning | blocked",
  "checks": {
    "lint": "pass | fail",
    "types": "pass | fail",
    "tests": "pass | fail",
    "security": "pass | warning | fail"
  },
  "warnings": ["경고 사항"],
  "blockers": ["배포 차단 사유"],
  "recommendations": ["권장 사항"]
}

배포 전 점검을 수행하세요.
$ARGUMENTS


### 4.4 커맨드 작성 팁

#### 4.4.1 효과적인 커맨드 작성

```markdown
## 좋은 커맨드의 특징

1. **명확한 역할 정의**: "당신은 ~입니다"로 시작
2. **구체적인 단계**: 순차적 실행 단계 정의
3. **참조 문서 연결**: 필요한 컨텍스트 문서 링크
4. **체크리스트 포함**: 누락 방지용 체크리스트
5. **출력 형식 정의**: 일관된 결과 형식

4.4.2 커맨드 네이밍 규칙

패턴 예시 용도
동사-명사 /add-api, /fix-bug 작업 중심 커맨드
명사 /reviewer, /architect 에이전트 커맨드
동사 /deploy, /test 단순 실행 커맨드

4.4.3 커맨드 조합 활용

## 새 기능 개발 플로우

1. `/architect 사용자 프로필 기능` → 설계 검토
2. `/add-api GET /users/:id/profile` → API 추가
3. `/add-component UserProfile` → UI 추가
4. `/tester UserProfile` → 테스트 분석
5. `/reviewer` → 코드 리뷰
6. `/git-commit` → 커밋 메시지 생성
7. `/pr-create` → PR 생성

4.5 CLAUDE.md에 커맨드 문서화

## 사용 가능한 커맨드

### 작업 커맨드

| 커맨드 | 설명 | 사용 예시 |
|--------|------|-----------|
| `/new-feature` | 새 기능 개발 | `/new-feature 결제 시스템` |
| `/fix-bug` | 버그 수정 | `/fix-bug 로그인 오류` |
| `/add-api` | API 추가 | `/add-api POST /orders` |
| `/add-component` | 컴포넌트 추가 | `/add-component Modal` |
| `/migration` | DB 마이그레이션 | `/migration users에 phone 추가` |
| `/refactor` | 리팩토링 | `/refactor UserService` |

### 유틸리티 커맨드

| 커맨드 | 설명 |
|--------|------|
| `/git-commit` | 커밋 메시지 생성 |
| `/pr-create` | PR 설명 생성 |
| `/deploy-check` | 배포 전 점검 |

### 에이전트 커맨드

| 커맨드 | 설명 |
|--------|------|
| `/reviewer` | 코드 리뷰 |
| `/tester` | 테스트 분석 |
| `/architect` | 아키텍처 분석 |
| `/dba` | DB 분석 |

5. 도메인 문서화

각 도메인(기능 영역)에 대한 상세 문서를 작성하면 Claude가 해당 영역 작업 시 참조.

5.1 도메인 문서 구조

파일: .claude/docs/domains/post.md

# Post 도메인

글 관리

## API 라우트 구조

| 메서드 | 경로 | 설명 |
|--------|------|------|
| GET | `/api/posts` | 글 목록 |
| POST | `/api/posts` | 글 생성 |
| PATCH | `/api/posts/:postId` | 글 수정 |

## 폴더/파일 구조

src/posts/
├── management/
│ ├── interface.ts # 타입 정의
│ ├── validators.ts # Zod 스키마
│ ├── service.ts # 비즈니스 로직
│ └── repository.ts # 데이터 레이어
└── render/
└── service.ts # HTML 렌더링

개인적으로 ORM 사용 시에는 repository.ts가 의미가 없다고 생각해 별도 생성하지 않는다.

## 서비스 함수 요약

| 함수 | 설명 |
|------|------|
| `listPosts` | 글 목록 조회 |
| `createPost` | 새 글 생성 |

## 변경 이력

**2024-12-05**: 커스텀 폼 검증 로직 추가
- 기존 브라우저 검증 비활성화
- 커스텀 validateField() 함수 추가

5.2 문서화 대상

  • API 라우트: 엔드포인트, 메서드, 설명
  • 파일 구조: 폴더/파일 역할
  • 함수 요약: 주요 함수와 설명
  • 변경 이력: 중요 변경사항 기록

6. 권한 설정

settings.local.json으로 Claude가 실행할 수 있는 명령어를 제어.

6.1 기본 구조

{
  "permissions": {
    "allow": [
      "Read",
      "Edit",
      "Write",
      "Glob",
      "Grep",
      "WebFetch",
      "mcp__*",
      "Bash(npm:*)",
      "Bash(npx:*)",
      "Bash(npx wrangler:*)",
      "Bash(npm test:*)",
      "Bash(npx vitest:*)",
      "Bash(npx jest:*)",
      "Bash(npx playwright:*)",
      "Bash(git fetch:*)"
    ],
    "deny": [],
    "ask": []
  }
}

6.2 권한 종류

권한 설명
Read 파일 읽기
Edit 파일 수정
Write 파일 생성
Glob 파일 패턴 검색
Grep 파일 내용 검색
Bash(명령어:*) 특정 명령어 실행 허용
mcp__* MCP 도구 사용

6.3 권한 설정 팁

// 특정 명령어만 허용
"Bash(npx wrangler:*)"     // wrangler 명령어만 허용
"Bash(npm test:*)"         // npm test만 허용
"Bash(npx vitest:*)"       // vitest 명령어 허용

// 위험한 명령어는 ask로 설정
"ask": ["Bash(rm:*)"]      // 삭제는 확인 후 실행

settings.local.json에 설정해도 가끔 설정이 적용이 안되는 내용 중 중요한 내용은 CLAUDE.md에 같이 기록
webFetch, read, MCP__ 관련 읽기 권한은 대체로 전부 허용하도록 설정하여 귀찮음을 줄임.


7. 효과적인 활용 팁

7.1 작업 히스토리 기록

특정 테이블이나 기능의 변경 이력을 문서에 기록하면 롤백이나 디버깅에 유용.

### 랜딩 컴포넌트 템플릿 작업

1. **히스토리 확인**: 작업 전 최근 변경 이력 확인
2. **현재 상태 확인**: 수정할 데이터의 현재 값 확인
3. **변경 실행**: 변경 수행
4. **롤백 필요 시**: 히스토리에서 이전 값 복원

7.2 체크리스트 활용

복잡한 작업에 체크리스트를 제공하면 Claude가 누락 없이 작업을 완료.
Plan 모드를 활용하면 대체로 알아서 잘 작성하고 문제가 없는지 확인을 요청함.

## 새 위젯 추가 체크리스트

- [ ] interface.ts 수정
- [ ] validators.ts 수정
- [ ] openapi.ts 스웨거 문서 추가
- [ ] render/service.ts 수정
- [ ] DB 템플릿 INSERT
- [ ] migration 파일 생성
- [ ] 테스트 코드 작성
- [ ] 테스트 통과 확인

7.3 출력 형식 정의

에이전트의 출력 형식을 JSON으로 정의하면 일관된 결과를 얻을 수 있음.

## 출력 형식

```json
{
  "summary": "요약",
  "findings": [
    {
      "severity": "critical | warning | info",
      "description": "발견 사항",
      "recommendation": "권장 조치"
    }
  ],
  "action_items": ["조치 항목"]
}

### 7.4 컨텍스트 연결

문서 간 상호 참조를 통해 Claude가 관련 정보를 쉽게 찾을 수 있게 해.

```markdown
## 참조 문서

- [architecture.md](../docs/architecture.md)
- [coding-standards.md](../docs/coding-standards.md)
- [testing-guide.md](../docs/testing-guide.md)

8. 테스트 전략 및 설정

테스트 자동화와 품질 관리를 위한 설정을 정리.

8.1 테스트 에이전트 설정

파일: .claude/commands/tester.md

# 테스트 전문가 에이전트

당신은 **시니어 QA 엔지니어**입니다. 10년 이상의 테스트 자동화 경험을 보유하고 있으며,
단위 테스트, 통합 테스트, E2E 테스트 전략에 능숙합니다.

## 테스트 원칙

1. **AAA 패턴**: Arrange → Act → Assert
2. **단일 책임**: 하나의 테스트는 하나의 동작만 검증
3. **독립성**: 테스트 간 의존성 없음
4. **가독성**: 테스트 이름만으로 의도 파악 가능

## 테스트 체크리스트

### 단위 테스트
- [ ] 정상 케이스 (Happy Path) 테스트
- [ ] 경계값 테스트 (Boundary)
- [ ] 예외/에러 케이스 테스트
- [ ] null/undefined 입력 처리

### 통합 테스트
- [ ] API 엔드포인트 테스트
- [ ] DB 연동 테스트
- [ ] 외부 서비스 모킹

### E2E 테스트
- [ ] 핵심 사용자 시나리오
- [ ] 폼 제출 및 검증
- [ ] 인증/인가 흐름

## 테스트 네이밍 규칙

```typescript
// 패턴: [대상]_[상황]_[기대결과]
describe('UserService', () => {
  it('createUser_유효한입력_사용자생성성공', async () => {});
  it('createUser_중복이메일_에러반환', async () => {});
});

커버리지 기준

항목 최소 기준 권장 기준
전체 커버리지 70% 80%
핵심 비즈니스 로직 90% 95%
유틸리티 함수 80% 90%

출력 형식

{
  "summary": "테스트 분석 요약",
  "coverage": {
    "current": "현재 커버리지",
    "target": "목표 커버리지"
  },
  "missing_tests": [
    {
      "file": "파일 경로",
      "function": "함수명",
      "priority": "high | medium | low",
      "suggested_cases": ["테스트 케이스1", "테스트 케이스2"]
    }
  ],
  "improvements": ["개선 제안"]
}

사용자 요청: $ARGUMENTS

위 지침에 따라 테스트 분석 및 작성을 수행하세요.


### 8.2 테스트 관련 CLAUDE.md 설정

```markdown
## 테스트 정책

### 필수 테스트 규칙
- 새 기능 구현 시 **반드시** 테스트 코드 함께 작성
- PR 전 `npm test` 통과 필수
- 커버리지 70% 미만 시 경고

### 테스트 자동 실행 트리거

| 작업 유형 | 자동 실행 | 트리거 상황 |
|-----------|-----------|-------------|
| 서비스 함수 작성 | `/tester` | service.ts 수정 완료 시 |
| API 라우트 추가 | `/tester` | 새 엔드포인트 생성 시 |
| 버그 수정 | `/tester` | 회귀 테스트 케이스 추가 |

### 테스트 파일 위치

src/
├── users/
│ ├── service.ts
│ └── service.test.ts # 같은 폴더에 위치
└── tests/
└── integration/ # 통합 테스트
└── users.test.ts

8.3 테스트 문서 템플릿

파일: .claude/docs/testing-guide.md

# 테스트 가이드

## 테스트 스택

| 도구 | 용도 |
|------|------|
| Vitest / Jest | 단위 테스트 |
| Supertest | API 테스트 |
| Playwright | E2E 테스트 |
| MSW | API 모킹 |

## 자주 사용하는 패턴

### 모킹 예시

```typescript
// 외부 서비스 모킹
vi.mock('../services/email', () => ({
  sendEmail: vi.fn().mockResolvedValue({ success: true })
}));

테스트 데이터 팩토리

// factories/user.ts
export const createTestUser = (overrides = {}) => ({
  id: 'test-id',
  email: 'test@example.com',
  name: '테스트유저',
  ...overrides
});

비동기 테스트

it('fetchUser_유효한ID_사용자반환', async () => {
  const user = await userService.fetchUser('user-123');
  expect(user).toMatchObject({ id: 'user-123' });
});

API 테스트 (Supertest)

import request from 'supertest';
import app from '../app';

describe('POST /api/users', () => {
  it('유효한요청_201반환', async () => {
    const res = await request(app)
      .post('/api/users')
      .send({ email: 'test@example.com', name: '테스트' });

    expect(res.status).toBe(201);
    expect(res.body).toHaveProperty('id');
  });
});

테스트 실행 명령어

명령어 설명
npm test 전체 테스트 실행
npm test -- --watch 워치 모드
npm test -- --coverage 커버리지 리포트
npm test -- users 특정 파일만 실행
npm test -- --run CI 환경용 단일 실행
```  

8.4 테스트 체크리스트 (기능별)

복잡한 기능 개발 시 테스트 누락을 방지하기 위한 체크리스트임.

## 새 API 엔드포인트 테스트 체크리스트

- [ ] 정상 요청 테스트 (200/201)
- [ ] 필수 필드 누락 테스트 (400)
- [ ] 잘못된 형식 테스트 (400)
- [ ] 인증 없음 테스트 (401)
- [ ] 권한 없음 테스트 (403)
- [ ] 리소스 없음 테스트 (404)
- [ ] 중복 데이터 테스트 (409)

## 서비스 함수 테스트 체크리스트

- [ ] 정상 입력 → 정상 출력
- [ ] 빈 입력 처리
- [ ] null/undefined 처리
- [ ] 경계값 (최소/최대)
- [ ] 에러 케이스 → 적절한 예외 발생

8.5 테스트 더블 가이드

테스트에서 의존성을 대체하는 방법을 정리함.

## 테스트 더블 종류

| 종류 | 용도 | 예시 |
|------|------|------|
| Mock | 호출 여부/횟수 검증 | `vi.fn()` |
| Stub | 고정된 값 반환 | `mockResolvedValue()` |
| Spy | 실제 구현 + 호출 추적 | `vi.spyOn()` |
| Fake | 간단한 대체 구현 | 인메모리 DB |

## 언제 무엇을 쓸까?

- **외부 API 호출** → Mock + Stub
- **DB 조회** → Fake (인메모리) 또는 테스트 DB
- **이메일 발송** → Mock (호출 여부만 확인)
- **현재 시간** → Stub (`vi.setSystemTime()`)

요약

구성 요소 역할 위치
CLAUDE.md 프로젝트 전체 지침 .claude/CLAUDE.md
commands/ 슬래시 커맨드 및 에이전트 .claude/commands/*.md
docs/ 프로젝트 컨텍스트 .claude/docs/*.md
settings.local.json 권한 설정 .claude/settings.local.json

핵심 원칙

  1. 명확한 지침: Claude가 이해할 수 있는 구체적인 지침 작성해
  2. 컨텍스트 제공: 프로젝트 구조, 규칙, 히스토리 문서화해
  3. 자동화: 반복 작업은 슬래시 커맨드로 자동화해
  4. 전문가 활용: 복잡한 분석은 전문가 에이전트 활용해
  5. 체크리스트: 복잡한 작업에 체크리스트 제공해
  6. 테스트 필수: 새 기능엔 반드시 테스트 코드 작성해