2025년 12월에 Claude Code 를 처음 접했다
CLAUDE.md 는 10줄이었다
# CLAUDE.md
- Python 프로젝트
- 한국어로 대답해줘
- pytest-bdd 사용
3개월 뒤, 506줄이 되었다
왜 늘어나는가
같은 실수가 반복되기 때문이다
Claude Code 는 대화가 끝나면 컨텍스트를 잊는다
"Step 파일에 locator 직접 쓰지 마" 라고 말해도 다음 대화에서 또 쓴다
그래서 CLAUDE.md 에 적는다
❌ 금지: Step 안에 UI 탐색 로직, 폴백 전략, 대기 코드 직접 작성
✅ 필수: Page Object 메서드 호출 + context 관리 + 로깅만
한 번 적으면 매 대화 시작 시 자동으로 읽는다
더 이상 말로 반복할 필요가 없다
규칙이 추가된 실제 과정
Phase 1: 기본 설정 (12월)
- 한국어로 대답
- pytest-bdd, Playwright 사용
- POM 패턴 준수
이 정도면 될 줄 알았다
Phase 2: "이거 하지 마" 가 쌓이기 시작 (1월)
Claude 가 자꾸 하는 것들:
Step 파일에 page.locator() 직접 씀 → 규칙 추가
Page Object 에 셀렉터 문자열 하드코딩 → 규칙 추가
except Exception: pass 로 에러 무시 → 규칙 추가
bool("false") 가 True 되는 버그 → 규칙 추가
커밋 메시지에 Test Case ID 넣음 → 규칙 추가한 건씩 터질 때마다 한 줄씩 추가됐다
Phase 3: 규칙만으로 안 되는 것들 (2월)
규칙을 써놔도 무시하는 경우가 있었다
CLAUDE.md: "XPath 사용 금지"
Claude: (XPath 사용)
나: "왜 XPath 썼어?"
Claude: "죄송합니다, 수정하겠습니다"
(다음 대화)
Claude: (또 XPath 사용)그래서 Hook 으로 강제하기 시작했다
CLAUDE.md 에 규칙 작성 → 읽긴 하는데 가끔 무시
Hook 으로 차단 (exit 2) → 물리적으로 못 씀CLAUDE.md 에는 "왜 안 되는지" 설명, Hook 에는 "차단" 로직
둘이 같이 가야 한다
Phase 4: 구조화 (3월)
500줄이 되니까 Claude 가 필요한 규칙을 못 찾는 문제가 생겼다
# 이전: 규칙이 시간순으로 나열
- 금지 1
- 금지 2
- 금지 3
(200줄 뒤)
- 금지 47
# 이후: 카테고리별 정리 + 문서 분리
## 🔐 보안 규칙
## 🔴 자주 위반하는 규칙
## ✅ Hook 이 자동으로 막아주는 것
## 📝 새 코드 작성 체크리스트
## 📚 상세 문서 (필요할 때 참고)자주 위반하는 규칙은 맨 위로 올렸다
Claude 가 CLAUDE.md 를 읽을 때 앞부분에 더 가중치를 두기 때문이다
상세 규칙은 별도 문서로 분리하고 CLAUDE.md 에서는 참조만 한다
## 📚 상세 문서 (필요할 때 참고)
| 카테고리 | 문서 | 설명 |
|---------|------|------|
| 코드 작성 | docs/LOCATOR_STRATEGY.md | 로케이터 우선순위 |
| 코드 작성 | docs/POM_STRUCTURE.md | Page Object 패턴 |
| 문제 해결 | docs/TROUBLESHOOTING.md | Timeout, Strict Mode 등 |
현재 구조 (v3, 506줄)
| 섹션 | 줄 수 | 역할 |
|---|---|---|
| 보안 규칙 | ~30줄 | API 키, 비밀번호 관련 |
| 작업 시작 전 확인 | ~30줄 | 이슈 목록, data-testid 요청 |
| 자주 위반하는 규칙 | ~150줄 | MCP 먼저, POM 패턴, 로케이터 분리, 디버깅, 컨텍스트 |
| Hook 이 막아주는 것 | ~30줄 | 자동 강제되는 규칙 목록 |
| 품질 게이트 | ~30줄 | 셀프 리뷰 체크리스트 |
| 새 코드 작성 체크리스트 | ~80줄 | Feature/Step/Page Object 별 |
| 기본 규칙 | ~20줄 | 한국어, 코드 스타일 |
| 프로젝트 구조 | ~20줄 | 디렉토리 설명 |
| 상세 문서 참조 | ~30줄 | docs/ 링크 테이블 |
| 스킬 가이드 | ~20줄 | 어떤 상황에 어떤 커맨드 |
| 주요 명령어 | ~30줄 | make, pytest 명령어 |
| 자주 하는 실수 | ~20줄 | Timeout, Strict Mode 해결 |
| Git 작업 규칙 | ~30줄 | 커밋, amend, black |
🐣 나의 CLAUDE.md 작성 요령
1. "하지 마" 와 "해라" 를 같이 쓴다
# ❌ "하지 마" 만 쓰면
- XPath 사용 금지
# ✅ 대안까지 같이 써야 한다
❌ 금지: page.locator("//button[@class='save']")
✅ 필수: page.get_by_role("button", name="저장")
금지만 쓰면 Claude 가 뭘 해야 하는지 모른다
2. 왜 안 되는지도 쓴다
# ❌ 이유 없이
- bool() 함수 금지
# ✅ 이유와 함께
# bool("false") 는 True 가 된다 (버그!)
if headless_str == 'true':
headless = True
else:
headless = False
이유가 있으면 비슷한 상황에서 스스로 판단할 수 있다
3. 자주 위반되는 규칙은 앞으로
Claude 가 컨텍스트 윈도우 앞부분에 더 집중한다
500줄 중 400번째 줄에 있는 규칙은 종종 무시된다
4. Hook 으로 강제할 수 있으면 Hook 으로
CLAUDE.md 규칙은 권고, Hook 은 강제
CLAUDE.md: "Step 에 page.locator() 쓰지 마" → 가끔 무시됨
Hook (exit 2): Step 에 page.locator() 감지 → 편집 차단 → 100% 방어둘 다 쓰되, 중요한 건 Hook 으로 이중 방어한다
5. 문서가 길어지면 분리한다
# CLAUDE.md — 핵심만 (500줄)
# docs/LOCATOR_STRATEGY.md — 상세 (필요할 때만)
# docs/POM_STRUCTURE.md — 상세 (필요할 때만)
CLAUDE.md 는 매 대화 시작 시 전부 읽는다
2000줄이면 토큰 낭비가 심하다
핵심만 남기고 나머지는 docs/ 로 빼야 한다
규칙 추가 기준
아무거나 다 넣으면 안 된다
✅ CLAUDE.md 에 넣어야 하는 것:
- 2회 이상 반복된 실수
- 말로 교정이 안 되는 것 (매번 같은 실수)
- 프로젝트 전체에 적용되는 규칙
❌ CLAUDE.md 에 안 넣어도 되는 것:
- 1회성 실수 (한 번 말하면 고쳐지는 것)
- 특정 파일에만 해당하는 것 (해당 파일 주석으로)
- 코드를 읽으면 알 수 있는 것 (구조, 패턴 등)주의점
- CLAUDE.md 가 너무 길면 오히려 역효과 — 핵심이 묻힌다
- 규칙과 Hook 이 모순되면 안 된다 (CLAUDE.md 는 허용하는데 Hook 이 막으면 혼란)
- 버전을 관리한다 — v1 → v2 → v3 로 구조를 개선하면서 중복/불필요한 규칙을 정리
'TIL > Claude Code' 카테고리의 다른 글
| [TIL][Claude Code] Playwright MCP 로 E2E 디버깅하기 — browser_snapshot 워크플로우 (2) | 2026.04.02 |
|---|---|
| [TIL][Claude Code] "이게 최선이야?" 를 자동으로 묻게 만들기 (0) | 2026.03.30 |
| [TIL][Claude Code] Claude Code 초기 세팅 #3 - 숨겨진 단축키와 기능 (0) | 2026.02.18 |
| [TIL][Claude Code] Claude Code 초기 세팅 #2 - MCP, Hooks, Skills 로 워크플로우 자동화 (0) | 2026.02.17 |
| [TIL][Claude Code] Claude Code 초기 세팅 #1 - 처음 쓰는 사람이 놓치는 것들 (0) | 2026.02.16 |