티스토리 뷰
작성일: 2025-11-03
카테고리: Claude AI, 개발 가이드, 최적화, Anthropic Best Practices
난이도: 중급
TL;DR
- 문제: 997줄 CLAUDE.md를 작성했는데도 AI가 패턴을 60%만 준수
- 해결: 파일 참조 전략 + MCP 강제 활성화 + 우선순위 재구조화
- 핵심: "AI에게 코드를 주지 말고, 파일 경로를 알려주라"
- 결과: 997줄 → 593줄 (43% 감축), 패턴 준수율 95%
들어가며
imprun.dev는 "API 개발부터 AI 통합까지, 모든 것을 하나로 제공"하는 Kubernetes 기반 API 플랫폼입니다. 이전 글에서 997줄짜리 CLAUDE.md를 공개했습니다. Container/Presentational 패턴과 Layered Architecture로 일관성 있는 코드를 만들어낸 성공 스토리였죠.
하지만 실제 개발에서는 문제가 있었습니다.
우리가 마주한 질문:
- ❓ 997줄 가이드를 작성했는데 왜 Claude가 패턴을 60%만 따를까?
- ❓ MCP 도구(Serena, Sequential-thinking)가 있는데 왜 직접 검색을 시도할까?
- ❓ 가이드에 코드가 있는데 왜 다른 스타일로 생성할까?
검증 과정:
- Anthropic 공식 Best Practices 분석
- ✅ 공식 문서: claude-code-best-practices
- ✅ 현재 가이드 자체 평가: 약 81/100 (추정)
- ❌ 코드 임베딩 과다, 우선순위 불명확
- 파일 참조 전략 도입
- ✅ 25줄 코드 샘플 → 10줄 패턴 + 파일 경로
- ✅ 997줄 → 537줄 (46% 감축)
- ❌ 하지만 여전히 MCP 미사용 문제
- MCP 강제 활성화 ← 최종 선택
- ✅ Serena + Sequential-thinking 필수 사용
- ✅ 비활성화 시 즉시 경고
- ✅ 우선순위 재구조화 (DESIGN_GUIDELINES 최상단)
결론:
- ✅ 997줄 → 593줄 (43% 감축)
- ✅ Anthropic Best Practices 자체 평가 약 95/100 (추정)
- ✅ 패턴 준수율 약 60% → 95% (실제 개발 경험)
이 글은 imprun.dev 플랫폼 구축 경험을 바탕으로, CLAUDE.md 최적화 과정과 Anthropic 공식 Best Practices 적용 방법을 공유합니다.
배경: 997줄인데 왜 안 따를까?
문제 발견
Part 1 블로그 포스팅 후 실제 개발을 진행하면서 이상한 점을 발견했습니다:
나: "Grant 관리 페이지를 Container/Presentational 패턴으로 만들어줘"
Claude: (997줄 CLAUDE.md를 읽음)
→ ❌ useState + useEffect 사용 (TanStack Query 무시)
→ ❌ 컴포넌트에 비즈니스 로직 혼재 (Hook 분리 안 함)
→ ❌ margin 사용 (flex + gap 규칙 무시)
나: "CLAUDE.md를 읽었잖아? 왜 안 따라?"
Claude: "아, 죄송합니다. 다시 작성하겠습니다."
→ ✅ 이번엔 제대로 작성
패턴을 알고 있는데도 가끔 무시합니다. 왜일까요?
가설 1: 가이드가 너무 길다
frontend/CLAUDE.md: 997줄
DESIGN_GUIDELINES.md: 553줄
합계: 1,550줄
Claude의 컨텍스트 윈도우는 크지만, 997줄을 전부 읽고 기억하기는 어렵습니다.
특히 중요한 규칙이 중간에 묻혀있으면:
- 읽어도 우선순위를 파악하기 어려움
- 가이드를 읽은 후 사용자 요청을 처리하면서 일부 규칙을 잊어버림
가설 2: 코드 샘플이 너무 많다
CLAUDE.md의 코드 샘플 예시:
// ❌ Before: 25줄짜리 완전한 구현
export function useGrantFilters(data: Grant[] | undefined) {
const [envFilter, setEnvFilter] = useState<string>('all')
const [statusFilter, setStatusFilter] = useState<string>('all')
const [syncFilter, setSyncFilter] = useState<string>('all')
const [currentPage, setCurrentPage] = useState(1)
const [pageSize, setPageSize] = useState(10)
const filtered = useMemo(() => {
if (!data) return []
let result = data
if (envFilter !== 'all') {
result = result.filter(g => g.environment === envFilter)
}
if (statusFilter !== 'all') {
result = result.filter(g => g.status === statusFilter)
}
// ... 더 많은 코드
}, [data, envFilter, statusFilter, syncFilter])
return {
filters: { envFilter, statusFilter, syncFilter },
setEnvFilter, setStatusFilter, setSyncFilter,
data: { filtered, stats, paginatedGrants },
pagination: { currentPage, totalPages, pageSize },
setCurrentPage, setPageSize
}
}
문제점:
- 완전한 구현을 보여주려다 보니 25줄이나 차지
- Claude가 코드를 그대로 복사할 가능성 높음
- 패턴의 본질보다 구현 세부사항에 집중
가설 3: 우선순위가 불명확하다
997줄 중 가장 중요한 것은?
- DESIGN_GUIDELINES.md 참조 (디자인 일관성)
- Container/Presentational 패턴 (아키텍처 핵심)
- MCP 서버 활용 (코드 품질)
이 3가지가 가장 중요한데, 가이드 중간에 묻혀있었습니다.
결과: Claude는 모든 규칙을 평등하게 취급 → 핵심을 놓침
해결책 1: Anthropic 공식 Best Practices 분석
Anthropic 공식 문서 발견
공식 문서에서 제시하는 핵심 원칙:
1. 파일 경로 참조 > 코드 임베딩
- ✅ "hooks/use-grants.ts 참고"
- ❌ 25줄짜리 코드 전체 복사
2. 우선순위 명확화
- 최상단에 가장 중요한 규칙 배치
- 섹션별 중요도 표시
3. 실제 파일 구조 반영
- 프로젝트의 실제 디렉터리 구조 사용
- 예시 파일은 실제로 존재하는 파일
4. 외부 도구 활용 명시
- MCP 서버, 커스텀 도구 사용 가이드
- 도구 사용이 필수인 경우 명확히 표시
5. 간결함 유지
- 핵심만 담기
- 상세 내용은 별도 문서로 분리
현재 CLAUDE.md 평가
Anthropic Best Practices 대조표:
| 항목 | Before | 점수 | 문제점 |
|---|---|---|---|
| 파일 참조 전략 | 코드 샘플 중심 | 60/100 | 25줄짜리 코드 다수 |
| 우선순위 명확화 | 중간에 묻힘 | 70/100 | DESIGN_GUIDELINES 언급이 8번째 섹션 |
| 실제 파일 구조 | 잘 반영됨 | 95/100 | ✅ |
| 외부 도구 활용 | 언급 없음 | 0/100 | MCP 서버 가이드 누락 |
| 간결함 | 997줄 | 80/100 | 너무 길지만 구조는 좋음 |
총점: 81/100 (B)
목표: 95/100 (A+)
해결책 2: 파일 참조 전략
Before: 코드 임베딩 (25줄)
### useGrantFilters Hook 예시
```tsx
export function useGrantFilters(data: Grant[] | undefined) {
const [envFilter, setEnvFilter] = useState<string>('all')
const [statusFilter, setStatusFilter] = useState<string>('all')
const [syncFilter, setSyncFilter] = useState<string>('all')
const [currentPage, setCurrentPage] = useState(1)
const [pageSize, setPageSize] = useState(10)
const filtered = useMemo(() => {
if (!data) return []
let result = data
if (envFilter !== 'all') {
result = result.filter(g => g.environment === envFilter)
}
if (statusFilter !== 'all') {
result = result.filter(g => g.status === statusFilter)
}
// ... 더 많은 필터링 로직
}, [data, envFilter, statusFilter, syncFilter])
const stats = useMemo(() => ({
total: data?.length || 0,
approved: filtered.filter(g => g.status === 'approved').length,
pending: filtered.filter(g => g.status === 'pending').length,
}), [data, filtered])
const paginatedGrants = useMemo(() => {
const start = (currentPage - 1) * pageSize
return filtered.slice(start, start + pageSize)
}, [filtered, currentPage, pageSize])
return {
filters: { envFilter, statusFilter, syncFilter },
setEnvFilter,
setStatusFilter,
setSyncFilter,
data: { filtered, stats, paginatedGrants, totalFiltered: filtered.length },
pagination: { currentPage, totalPages: Math.ceil(filtered.length / pageSize), pageSize },
setCurrentPage,
setPageSize
}
}
```
**문제점**:
- 총 40줄 차지
- 패턴보다 **구현 세부사항**에 집중
- Claude가 코드를 **그대로 복사**할 가능성 높음
### After: 파일 참조 (10줄)
```markdown
### useGrantFilters Hook 패턴
**핵심 개념**: 필터링 + 페이지네이션 + 통계 계산
```tsx
export function useGrantFilters(data: Grant[] | undefined) {
const [envFilter, setEnvFilter] = useState('all')
const { filtered, stats } = useMemo(() => {
// 필터링 + 정렬 로직
}, [data, envFilter])
return {
filters: { envFilter },
setEnvFilter,
data: { filtered, stats }
}
}
실제 구현 참고: hooks/use-grant-filters.ts
사용 예시: pages/api-gateways/GrantsPage.tsx
**장점**:
- 총 15줄 (60% 감축)
- **패턴의 본질**만 전달
- 실제 구현은 **파일을 직접 읽도록** 유도
- Claude가 패턴을 **이해**하고 **응용**
### 효과
```tsx
// Before: Claude가 CLAUDE.md의 코드를 그대로 복사
export function useApplicationFilters(data: Application[] | undefined) {
// ... 997줄 가이드의 코드를 복사-붙여넣기
}
// After: Claude가 패턴을 이해하고 응용
export function useApplicationFilters(data: Application[] | undefined) {
const [phaseFilter, setPhaseFilter] = useState<ApplicationPhase | 'all'>('all')
const { filtered, stats } = useMemo(() => {
if (!data) return { filtered: [], stats: defaultStats }
const filtered = phaseFilter === 'all'
? data
: data.filter(app => app.phase === phaseFilter)
return {
filtered: sortBy(filtered, 'createdAt', 'desc'),
stats: calculateApplicationStats(data)
}
}, [data, phaseFilter])
return { filters: { phaseFilter }, setPhaseFilter, data: { filtered, stats } }
}
차이점:
- Before: 코드 복사 → 기계적
- After: 패턴 이해 → 응용 → 도메인에 맞게 수정
해결책 3: MCP 서버 강제 활성화
문제: Claude가 MCP 도구를 안 쓴다
imprun.dev는 3개의 MCP 서버를 사용합니다:
// .mcp.json
{
"mcpServers": {
"context7": {
"type": "http",
"url": "https://mcp.context7.com/mcp",
"headers": {
"CONTEXT7_API_KEY": "ctx7sk-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
},
"sequential-thinking": {
"type": "stdio",
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"@modelcontextprotocol/server-sequential-thinking"
],
"env": {}
},
"serena": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"git+https://github.com/oraios/serena",
"serena",
"start-mcp-server",
"--context",
"ide-assistant"
],
"env": {}
}
}
}
역할:
- Context7: 최신 라이브러리 공식 문서 검색 (MongoDB, React, Next.js 등)
- Serena: 코드베이스 탐색 (파일 찾기, 심볼 검색, 의존성 분석) → Serena MCP 가이드
- Sequential-thinking: 복잡한 설계 계획 (단계별 사고, 문제 해결) → Sequential Thinking MCP 가이드
문제:
나: "GrantsPage에서 environment 필터링을 추가해줘"
Claude: (직접 파일을 열고 수정 시도)
→ ❌ 컴포넌트 구조 파악 실패
→ ❌ useGrantFilters Hook 존재 발견 못 함
→ ❌ 엉뚱한 위치에 코드 추가
이유: Serena로 탐색하지 않고 직접 파일을 읽으려 함
해결책: MCP 강제 활성화 가이드
CLAUDE.md 최상단에 추가:
## ⚠️ MCP 서버 활성화 필수
**Serena + Sequential-thinking MCP가 비활성화된 경우**:
🚨 사용자에게 즉시 알려주세요:
"Serena MCP와 Sequential-thinking MCP가 필요합니다.
.mcp.json을 확인하고 두 MCP 서버를 활성화해주세요.
활성화 전까지 개발을 진행할 수 없습니다."
**필수 사용 시점**:
1. **탐색 단계** (Serena 필수)
- ✅ 파일 구조 파악
- ✅ 심볼 검색 (함수, 타입, 컴포넌트)
- ✅ 의존성 분석
2. **계획 단계** (Sequential-thinking 필수)
- ✅ 복잡한 기능 설계
- ✅ 리팩토링 계획
- ✅ 아키텍처 결정
**MCP 없이 개발 금지**: 탐색/계획 단계 없이 바로 코딩 시작 불가
효과
나: "GrantsPage에서 environment 필터링을 추가해줘"
Claude:
1. ✅ Serena로 GrantsPage.tsx 탐색
2. ✅ useGrantFilters Hook 발견
3. ✅ Sequential-thinking으로 계획:
- Hook에 envFilter 추가
- GrantFilters 컴포넌트에 UI 추가
- 필터링 로직 구현
4. ✅ 계획대로 정확하게 구현
결과: 1회 시도로 정확한 구현
해결책 4: 우선순위 재구조화
Before: 중요한 것이 중간에 묻힘
1. 기술 스택 (100줄)
2. 아키텍처 패턴 (150줄)
3. 프로젝트 구조 (80줄)
...
8. 스타일링 규칙 (120줄) ← DESIGN_GUIDELINES.md 여기서 처음 언급
...
문제점:
- DESIGN_GUIDELINES.md(553줄)가 8번째 섹션에서야 등장
- Container/Presentational 패턴 설명이 너무 길어서 핵심이 묻힘
After: 최상단에 필수 문서 배치
## 📖 필수 문서 (먼저 읽으세요)
### 1. **DESIGN_GUIDELINES.md** (553줄) - UI/UX 디자인 시스템
> **모든 컴포넌트 작성 전에 반드시 참고**
- 타이포그래피 (페이지 헤더, 섹션 제목, 본문)
- 컬러 시스템 (Semantic Colors, 상태 색상)
- 레이아웃 패턴 (페이지 구조, 그리드, 간격)
- 카드 디자인 (기본/호버/선택 상태)
- 버튼 & 인터랙션
- 테이블 디자인
- Empty State, 애니메이션
**디자인 일관성이 최우선입니다.**
### 2. **Container/Presentational Pattern** - 핵심 아키텍처
> **컴포넌트 = Container (로직) + Presentational (UI) + Hooks (비즈니스)**
Container (100줄 이하)
↓ 데이터 페칭
Hooks (150줄 이하)
↓ 비즈니스 로직
Presentational (200줄 이하)
↓ UI 렌더링
**이 패턴을 따르지 않으면 즉시 리팩토링됩니다.**
효과
나: "Database 관리 페이지를 만들어줘"
Claude: (CLAUDE.md를 읽음)
→ ✅ 첫 줄부터 DESIGN_GUIDELINES.md 참조
→ ✅ Container/Presentational 패턴 즉시 적용
→ ✅ Serena로 비슷한 페이지 (GrantsPage) 탐색
→ ✅ 동일한 디자인 패턴으로 구현
결과: 첫 시도부터 일관성 있는 코드
최종 결과: 997줄 → 593줄 (43% 감축)
최적화 타임라인
2025-10-27: CLAUDE.md 초안 작성 (997줄)
→ Part 1 블로그 포스팅
2025-10-30: 문제 발견 (패턴 무시)
→ Anthropic Best Practices 분석
2025-11-01: 1차 최적화 (997 → 741줄)
→ 파일 참조 전략 도입
2025-11-02: 2차 최적화 (741 → 537줄)
→ 코드 샘플 간소화
2025-11-02: MCP 추가 (537 → 561줄)
→ MCP 서버 강제 활성화 가이드 추가
2025-11-03: 우선순위 재구조화 (561 → 593줄)
→ DESIGN_GUIDELINES 최상단 배치
→ 필수 문서 섹션 추가
Anthropic Best Practices 재평가 (자체 평가)
참고: 아래 점수는 Anthropic 공식 Best Practices 문서를 참고하여 자체적으로 평가한 추정치입니다.
| 항목 | Before | After | 개선 |
|---|---|---|---|
| 파일 참조 전략 | ~60/100 | ~95/100 | +35 |
| 우선순위 명확화 | ~70/100 | ~100/100 | +30 |
| 실제 파일 구조 | ~95/100 | ~95/100 | - |
| 외부 도구 활용 | ~0/100 | ~95/100 | +95 |
| 간결함 | ~80/100 | ~90/100 | +10 |
총점 (추정): ~81/100 → ~95/100 (B → A+)
정량적 효과
개발 시 패턴 준수율 (실제 개발 경험):
Before (997줄, 코드 샘플 중심):
첫 시도 패턴 준수: 약 60%
재작성 후 준수: 약 90%
After (593줄, 파일 참조 + 우선순위):
첫 시도 패턴 준수: 약 95%
재작성 필요: 약 5% (거의 없음)
디자인 일관성 (실제 개발 경험):
Before (DESIGN_GUIDELINES 중간에 언급):
디자인 가이드 참조율: 약 40%
After (DESIGN_GUIDELINES 최상단):
디자인 가이드 참조율: 약 95%
MCP 도구 사용률 (실제 개발 경험):
Before (MCP 가이드 없음):
Serena 사용: 약 20%
Sequential-thinking 사용: 약 5%
After (MCP 강제 활성화):
Serena 사용: 약 90%
Sequential-thinking 사용: 약 70%
핵심 교훈: "AI에게 코드를 주지 말고, 파일 경로를 알려주라"
1. 코드 샘플은 독이 될 수 있다
❌ 나쁜 예:
"이렇게 작성하세요"
```tsx
export function useGrantFilters(data: Grant[] | undefined) {
// ... 25줄짜리 완전한 구현
}
→ Claude가 복사-붙여넣기만 함
✅ 좋은 예:
"이런 패턴으로 작성하세요"
export function useGrantFilters(data: Grant[] | undefined) {
const [filter, setFilter] = useState('all')
const { filtered, stats } = useMemo(() => { /* ... */ }, [data, filter])
return { filters: { filter }, setFilter, data: { filtered, stats } }
}
실제 구현: hooks/use-grant-filters.ts
→ Claude가 패턴을 이해하고 응용
### 2. 우선순위를 최상단에
```markdown
❌ Before: 8번째 섹션에서 DESIGN_GUIDELINES.md 언급
→ Claude가 디자인 가이드를 읽지 않음
✅ After: 첫 번째 섹션에 "필수 문서" 배치
→ Claude가 항상 디자인 가이드를 먼저 확인
원칙: 가장 중요한 것부터 보여주기
3. 외부 도구는 강제해야 한다
❌ Before: "Serena를 사용하면 좋습니다"
→ Claude가 가끔만 사용
✅ After: "Serena 없이는 개발 불가, 비활성화 시 즉시 사용자에게 알림"
→ Claude가 항상 사용
원칙: "권장"이 아닌 "필수"로 명시
4. 간결함 > 완벽함
997줄 완벽한 가이드 (패턴 준수율 60%)
<
593줄 간결한 가이드 (패턴 준수율 95%)
원칙: AI가 읽고 기억할 수 있는 분량으로
DESIGN_GUIDELINES.md 통합 논쟁
논쟁: 553줄 디자인 가이드를 CLAUDE.md에 통합?
찬성 의견:
- ✅ 하나의 문서에 모든 규칙
- ✅ Claude가 참조하기 쉬움
반대 의견:
- ❌ 1,146줄 (593 + 553) → 너무 길어짐
- ❌ 아키텍처와 디자인은 다른 관심사
- ❌ AI의 컨텍스트 한계 초과 가능
결론: 별도 유지 + 최상단 참조
## 📖 필수 문서 (먼저 읽으세요)
### 1. **DESIGN_GUIDELINES.md** (553줄) - UI/UX 디자인 시스템
> **모든 컴포넌트 작성 전에 반드시 참고**
[링크와 핵심 요약]
이유:
- CLAUDE.md는 아키텍처 + 개발 워크플로우에 집중
- DESIGN_GUIDELINES.md는 UI/UX 디자인 시스템에 집중
- 최상단 참조로 Claude가 항상 디자인 가이드를 먼저 확인
- 관심사 분리 (Separation of Concerns) 유지
효과:
나: "Database 관리 페이지를 만들어줘"
Claude:
1. ✅ CLAUDE.md 읽음 → "필수 문서" 섹션 확인
2. ✅ DESIGN_GUIDELINES.md 읽음 → 디자인 패턴 파악
3. ✅ Container/Presentational 패턴 적용
4. ✅ 디자인 가이드 준수하며 구현
결과: 아키텍처 + 디자인 모두 일관성 유지
실전 사례: Environment 기반 배포 관리 UI
요구사항
"Environment(dev/staging/prod) 기반 배포 관리 UI를 추가해줘.
각 환경별로 배포 상태를 보여주고, 환경 간 코드 비교(Diff)와
배포 승격(Promote) 기능도 필요해."
Before (997줄 가이드): 3번 재작성
시도 1:
❌ useState로 환경 목록 관리 (TanStack Query 무시)
❌ 컴포넌트에 비즈니스 로직 혼재
나: "CLAUDE.md 패턴으로 다시 작성해줘"
시도 2:
✅ TanStack Query 사용
❌ 하지만 Hook 분리 안 함 (useStages에 모든 로직)
❌ Presentational 컴포넌트 없음
나: "Container/Presentational 패턴으로 분리해줘"
시도 3:
✅ 패턴 준수
✅ Hook 분리
❌ 하지만 디자인이 다른 페이지와 다름 (margin 사용)
나: "DESIGN_GUIDELINES.md 참고해서 스타일 수정"
시도 4:
✅ 최종 완성
소요 시간: 2시간
After (593줄 가이드): 1번에 완성
나: "Environment 기반 배포 관리 UI를 추가해줘"
Claude:
1. ✅ CLAUDE.md 읽음 → MCP 서버 사용 확인
2. ✅ Serena로 비슷한 페이지 탐색 (GrantsPage 발견)
3. ✅ DESIGN_GUIDELINES.md 참고
4. ✅ Sequential-thinking으로 계획:
- DeploymentStatusDto 타입 추가
- function.service.ts에 API 추가
- useStages Hook에 deployment 로직 추가
- DeploymentStepperCard 컴포넌트 생성 (Presentational)
- FunctionDeployments 컴포넌트 생성 (Container)
5. ✅ 계획대로 구현
결과:
✅ 첫 시도부터 패턴 준수
✅ 디자인 일관성 유지
✅ GrantsPage와 동일한 구조
소요 시간: 30분
생성된 파일:
frontend/src/types/function.ts (TDeploymentStatus 타입)
frontend/src/services/function.service.ts (getDeploymentStatus API)
frontend/src/hooks/use-stages.ts (deployment 로직 추가)
frontend/src/components/function-detail/DeploymentStepperCard.tsx (Presentational)
frontend/src/components/function-detail/FunctionDeployments.tsx (Container)
개선 효과:
- 개발 시간: 2시간 → 30분 (75% 단축)
- 재작성: 3회 → 0회
- 첫 시도 완성도: 40% → 95%
다른 프로젝트에 적용하기
1. Anthropic Best Practices 체크리스트
[ ] 파일 참조 전략
- 코드 샘플: 10줄 이하 (패턴만)
- 실제 구현: "파일 경로 참고" 방식
[ ] 우선순위 명확화
- 최상단에 "필수 문서/패턴" 섹션
- 중요도에 따라 ⭐ 표시
[ ] 실제 파일 구조 반영
- 예시 파일 = 실제 존재하는 파일
- 디렉터리 구조 정확히 표시
[ ] 외부 도구 활용
- MCP 서버, 린터, 포매터 명시
- "필수" vs "권장" 구분
[ ] 간결함 유지
- 목표: 600줄 이하
- 상세 내용은 별도 문서
2. 최적화 과정
1단계: 코드 샘플 간소화
- 25줄 → 10줄 (패턴 본질만)
- 실제 구현은 파일 참조
2단계: 우선순위 재구조화
- 최상단에 핵심 패턴 배치
- "필수 문서" 섹션 추가
3단계: MCP/도구 가이드 추가
- 필수 도구 명시
- 비활성화 시 경고 문구
4단계: 간결성 검토
- 중복 제거
- 링크로 대체 가능한 것은 링크로
3. 측정 지표
최적화 전후 비교:
첫 시도 패턴 준수율:
Before: 60%
After: 95%
재작성 빈도:
Before: 3회/기능
After: 0.2회/기능
개발 시간:
Before: 2시간/기능
After: 30분/기능
한계와 향후 개선 방향
현재 한계
- AI는 여전히 완벽하지 않음
- 95% 정확도 = 5%는 여전히 실수
- 복잡한 비즈니스 로직은 사람이 검증 필요
- 프로젝트 성숙도에 따라 효과 다름
- 초기: 가이드 작성 비용 > 효과
- 중기: 가이드 효과 극대화
- 후기: 가이드 유지보수 비용 발생
- 팀 규모에 따라 다름
- 1인 프로젝트: 오버엔지니어링 가능성
- 5인 이상 팀: 필수
향후 개선 방향
1. 자동화된 패턴 검증
// .claude/hooks/pre-commit.ts
export function validatePattern(code: string): ValidationResult {
// Container/Presentational 패턴 자동 검증
// TanStack Query 사용 여부 확인
// DESIGN_GUIDELINES 준수 여부 확인
}
2. 컴포넌트 템플릿 생성기
$ pnpm generate:page Database
→ pages/DatabasePage.tsx (Container)
→ components/database/DatabaseList.tsx (Presentational)
→ hooks/use-databases.ts (Data Hook)
→ services/database.service.ts (API Service)
→ types/database.ts (TypeScript Types)
3. AI 기반 코드 리뷰 자동화
PR 생성 시:
→ Claude가 CLAUDE.md 체크리스트로 자동 리뷰
→ 패턴 위반 항목 코멘트
→ 수정 제안 코드 생성
마무리
핵심 요약
"AI에게 완벽한 코드를 보여주지 말고, 완벽한 패턴을 알려주라"
997줄 → 593줄 (43% 감축) 과정에서 배운 4가지:
- 코드보다 파일 경로: 25줄 코드 < 10줄 패턴 + 파일 참조
- 우선순위가 전부: 최상단에 핵심 배치
- 도구는 강제해야: "권장" < "필수"
- 간결함 > 완벽함: 600줄 간결한 가이드 > 1,000줄 완벽한 가이드
언제 사용하나?
CLAUDE.md 최적화 권장:
- ✅ AI가 패턴을 60% 이하로 따를 때
- ✅ 가이드가 800줄 이상일 때
- ✅ MCP 도구를 제공했는데 안 쓸 때
- ✅ 매번 재작성을 요청하는 경우
Anthropic Best Practices 적용 권장:
- ✅ 새 프로젝트에서 CLAUDE.md를 작성할 때
- ✅ 기존 가이드의 효과가 떨어질 때
- ✅ 팀 규모가 5인 이상일 때
실제 적용 결과
imprun.dev 환경:
- ✅ CLAUDE.md: 997줄 → 593줄 (43% 감축)
- ✅ 패턴 준수율: 약 60% → 95% (실제 경험)
- ✅ 개발 시간: 약 2시간 → 30분 (약 75% 단축, 실제 경험)
- ✅ Anthropic Best Practices: 자체 평가 약 81/100 → 95/100 (추정)
운영 경험:
- 최적화 시간: 약 4시간 (3단계 최적화)
- ROI: 첫 주부터 개발 시간 단축 체감
- 만족도: 매우 높음 😊 (재작성 거의 없음)
전체 가이드 공개
📄 최적화된 CLAUDE.md:
주요 변경사항:
- 997줄 → 593줄 (43% 감축)
- 파일 참조 전략 도입
- MCP 서버 강제 활성화 가이드 추가
- DESIGN_GUIDELINES 최상단 배치
- Anthropic Best Practices 95/100 달성
📖 DESIGN_GUIDELINES.md:
(553줄)
📝 Part 1: Claude AI와 함께하는 프론트엔드 개발
관련 글
AI 개발 가이드
- Claude AI와 함께하는 프론트엔드 개발 (Part 1)
- Serena MCP: AI 코딩 어시스턴트를 위한 시맨틱 코드 분석 도구
- Sequential Thinking MCP: AI의 구조화된 사고 프로세스
Frontend 아키텍처
imprun 플랫폼
태그: Claude, AI, CLAUDE.md, 최적화, Anthropic Best Practices, MCP, 파일참조전략, 개발가이드
"일관성은 공짜가 아니다. AI에게 코드를 주지 말고, 패턴을 알려주라."
🤖 이 블로그는 imprun.dev 플랫폼 구축 과정에서 CLAUDE.md 최적화를 진행한 실제 경험을 바탕으로 작성되었습니다.
질문이나 피드백은 블로그 댓글에 남겨주세요!
'실제 경험과 인사이트를 AI와 함께 정리한 글' 카테고리의 다른 글
| Environment-Agnostic Architecture 구현기: "baseName만 저장한다"는 착각에서 벗어나기 (0) | 2025.11.03 |
|---|---|
| Environment-Agnostic Architecture: Frontend와 Backend의 환경 분리 패턴 (0) | 2025.11.03 |
| MongoDB Aggregation Pipeline로 N+1 문제 해결하기: $lookup과 $facet 활용 (0) | 2025.11.03 |
| MongoDB 인덱스 생성 베스트 프랙티스: 수동 vs 자동, 그리고 Hybrid 접근 (0) | 2025.11.02 |
| MongoDB 연결 타임아웃 50% 해결기: Connection Pool 분리가 부른 나비효과 (1) | 2025.11.02 |
- Total
- Today
- Yesterday
- Rag
- authorization
- Next.js
- Go
- Ontology
- claude code
- troubleshooting
- architecture
- frontend
- api gateway
- AI Development
- authentication
- ai 개발 도구
- Tax Analysis
- AI agent
- LLM
- security
- LangChain
- Kubernetes
- Developer Tools
- 개발 도구
- AI
- backend
- react
- SHACL
- Claude
- knowledge graph
- workflow
- Tailwind CSS
- PYTHON
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |