Claude Code는 .claude/ 폴더를 통해 프로젝트별 동작을 제어할 수 있다. 단순한 프롬프트 파일 하나가 아니라, 규칙·훅·컨텍스트·스킬·에이전트까지 체계적으로 구성하면 일관성 있는 AI 협업 환경을 만들 수 있다.
이 글에서는 실제 프로젝트에서 사용한 .claude/ 구성을 소개한다.
Table of contents
Open Table of contents
전체 디렉토리 구조
.claude/
├── CLAUDE.md # 프로젝트 메모리 (진입점)
├── settings.json # 설정 + 훅 등록
├── settings.local.json # 로컬 환경 오버라이드 (gitignore)
├── rules/ # 도메인별 규칙
│ ├── database.md
│ ├── file.md
│ ├── naming.md
│ ├── mcp.md
│ └── documents-guidelines.md
├── hooks/ # 자동화 스크립트
│ ├── guard-bash.ps1/.sh # 위험 명령 차단
│ ├── guard-edit.ps1/.sh # 민감 파일 수정 차단
│ ├── memory-*.ps1/.sh # 외부 메모리 연동
│ ├── change-tracker.ps1/.sh # 변경 추적
│ └── ...
├── context/ # 환경별 컨텍스트
│ ├── servers/*.md # 서버별 접속/스펙 정보
│ ├── containers/*.md # 컨테이너별 설정 정보
│ ├── project/*.md # 프로젝트별 기술 스택/빌드 정보
│ └── python.md, nodejs.md ... # 언어/도구별 설정
├── skills/ # 커스텀 스킬 (슬래시 명령)
│ ├── deep-think/SKILL.md
│ ├── review/SKILL.md
│ └── ...
├── agents/ # 커스텀 에이전트
│ ├── db-reader.md
│ └── security-reviewer.md
└── shared/ # 공유 참조 문서
└── project-references.md
CLAUDE.md — 프로젝트 진입점
CLAUDE.md는 Claude Code가 세션 시작 시 가장 먼저 읽는 파일이다. 여기에 모든 규칙을 나열하는 것이 아니라, 조건부 로딩 지시를 작성한다.
**최우선 지시: Hooks, Rules, CLAUDE.md 및 context의 모든 지시를 반드시 따를 것.**
### [db-context.md](context/db-context.md)
- 데이터베이스 관련 작업 시
- MariaDB 인스턴스 정보, 활성 작업 반드시 확인할 것
### [python.md](context/python.md)
- Python 관련 작업 시
- 준수 사항, PATH 설정, pyenv-win 환경 변수 반드시 확인할 것
이 방식의 장점:
- 토큰 절약: 모든 컨텍스트를 항상 로딩하지 않는다
- 조건부 참조: 관련 작업 시에만 해당 파일을 읽도록 유도
- 유지보수 용이: 각 도메인별 문서를 독립적으로 관리
rules/ — 도메인별 규칙
rules/ 폴더의 .md 파일은 Claude Code가 항상 로딩한다. 따라서 프로젝트 전반에 적용되는 핵심 규칙만 넣는다.
database.md — 데이터베이스 규칙 예시
## 금지 사항
- WHERE 없는 UPDATE/DELETE
- 프로덕션 DROP TABLE
- 인덱스 없는 UPDATE/DELETE
- SELECT * 프로덕션 사용
- 영향 row 수 미확인 대량 작업
## 작업 규칙
- 모든 작업 파일은 `database/YYYYMMDD_작업명/` 폴더에 보관
- 쿼리 실행 전 반드시 EXPLAIN으로 실행 계획 확인
file.md — 파일 작업 규칙 예시
## MUST NOT (절대 금지)
- 백업 확인 없이 삭제
- 시스템 디렉토리 수동 정리
- root 권한 무분별 사용
## MUST (필수)
- 경로 두 번 확인
- 백업 존재 확인
- 영향 범위 계산
규칙은 MUST NOT > MUST > SHOULD 순으로 우선순위를 명확히 한다.
hooks/ — 자동화의 핵심
hooks는 Claude Code의 특정 이벤트에 셸 스크립트를 연결하는 기능이다. settings.json에서 이벤트별로 등록한다.
주요 이벤트와 활용
| 이벤트 | 용도 | 실제 훅 |
|---|---|---|
| PreToolUse | 도구 실행 전 검증/차단 | guard-bash.ps1 — 위험 명령 차단 |
| PostToolUse | 도구 실행 후 처리 | change-tracker.ps1 — 변경 추적 |
| SessionStart | 세션 시작 시 초기화 | memory-session-start.ps1 — 메모리 로드 |
| UserPromptSubmit | 사용자 입력 시 | memory-user-prompt-submit.ps1 — 컨텍스트 주입 |
| PostToolUseFailure | 도구 실패 시 | memory-post-tool-use-failure.ps1 — 해결책 검색 |
| Notification | 알림 발생 시 | notify-windows.ps1 — Windows 토스트 알림 |
| Stop | 작업 중단 시 | session-summary.ps1 — 세션 요약 |
guard-bash.ps1 — 위험 명령 차단
가장 중요한 훅이다. PreToolUse 이벤트에서 Bash 도구의 명령어를 검사하고, 위험한 패턴을 차단한다.
# mysql CLI 차단 → mariadb CLI 사용 강제
if ($Cmd -match '(^|[|;&])\s*(sudo\s+)?(\S*/)?mysql\b') {
Block-Command "mysql CLI 사용 금지. mariadb CLI를 사용하세요."
}
# 재귀 삭제 차단
if ($Cmd -match 'rm\s+(-[a-zA-Z]*[rR]|--recursive)') {
Block-Command "rm -r 사용 금지. 개별 파일 삭제를 사용하세요."
}
차단 대상:
mysqlCLI (MariaDB에서 미포함)rm -r/rm -rf(재귀 삭제)- 보호 브랜치 force push
- 위험한
chmod 777 - 민감 파일 접근 (
/etc/shadow,.env등)
guard-edit.ps1 — 민감 파일 수정 차단
Edit/Write 도구 사용 시 대상 파일을 검사한다.
# .env 파일 보호
if ($FilePath -match '\.env($|\.)') {
Block-Edit ".env 파일 직접 수정 금지."
}
# lock 파일 보호
if ($FilePath -match '(package-lock|pnpm-lock|yarn\.lock)') {
Block-Edit "lock 파일 직접 수정 금지."
}
외부 메모리 연동 훅
세션의 각 단계에서 외부 지식 그래프 기반 메모리 서비스를 자동으로 활용한다.
- SessionStart: 프로젝트 관련 메모리 노드/팩트를 검색하여 컨텍스트에 주입
- UserPromptSubmit: 사용자 입력에서 키워드를 추출하여 관련 제약/결정 사항 검색
- PostToolUseFailure: 에러 메시지에서 키워드를 추출하여 과거 해결책 검색
- PreCompact: 컨텍스트 압축 전 중요 정보를 메모리 서비스에 저장
크로스 플랫폼 지원
모든 훅은 .ps1(Windows)과 .sh(macOS/Linux) 쌍으로 존재한다. settings.json은 OS별로 분리한다.
settings.json # 공통 (git tracked)
settings.windows.json # Windows 전용 훅 경로
settings.macos.json # macOS 전용 훅 경로
settings.local.json # 로컬 환경 오버라이드 (gitignored)
context/ — 조건부 로딩 컨텍스트
context/는 rules와 달리 항상 로딩되지 않는다. CLAUDE.md의 조건부 지시에 의해 필요할 때만 참조된다.
구성 카테고리
context/
├── servers/ # 서버별: SSH 정보, Docker 경로, 하드웨어 스펙
│ ├── server-a.md
│ ├── server-b.md
│ └── ...
├── containers/ # 컨테이너별: 이미지, 포트, 볼륨, 설정
│ ├── infra.md # nginx, mariadb, redis 등
│ └── ai.md # AI/ML 관련 서비스
├── project/ # 프로젝트별: 기술 스택, 빌드 명령, 주요 설정
│ ├── project-alpha.md
│ ├── project-beta.md
│ └── archive/ # 아카이브된 프로젝트
└── python.md # 언어별: PATH, 버전, 컨벤션
서버 컨텍스트 예시
# server-a
## 접속 정보
- SSH: `ssh server-a`
- Docker 소스: `/data/docker/`
## 하드웨어
- CPU: ARM 8코어
- RAM: 16GB
- Storage: NVMe 1TB
## 실행 중인 서비스
- nginx (리버스 프록시)
- mariadb (메인 DB)
skills/ — 커스텀 슬래시 명령
/review, /deep-think 같은 커스텀 명령을 만들 수 있다. 각 스킬은 SKILL.md 파일에 프롬프트를 정의한다.
skills/
├── deep-think/SKILL.md # 다차원 심층 분석
├── review/SKILL.md # 체계적 코드 리뷰
├── file-context/SKILL.md # 바이너리 파일 읽기 가이드
└── sync-docs/SKILL.md # 문서 동기화
agents/ — 커스텀 서브에이전트
특정 역할에 특화된 에이전트를 정의한다.
# db-reader.md
MariaDB 데이터 분석 및 조회 전문.
데이터베이스 쿼리, 테이블 구조 파악, 데이터 분석 시 사용.
에이전트는 사용 가능한 도구를 제한할 수 있어서, DB 조회 에이전트에는 Write/Edit 도구를 제외하여 실수로 파일을 수정하는 것을 방지한다.
설계 원칙
1. 계층적 분리
항상 로딩: CLAUDE.md + rules/*.md + settings.json
조건부 로딩: context/*.md (CLAUDE.md 지시에 의해)
사용자 호출: skills/ (슬래시 명령)
자동 실행: hooks/ (이벤트 기반)
2. 방어적 자동화
Claude Code에게 bypassPermissions 권한을 주되, hooks로 위험한 작업을 차단한다. “신뢰하되 검증한다(Trust but verify)” 원칙이다.
3. 크로스 플랫폼
Windows와 macOS에서 동일한 프로젝트를 사용하므로, 모든 훅을 .ps1/.sh 쌍으로 관리한다.
4. 외부 메모리 연동
외부 지식 그래프를 hooks로 연동하여, 세션 간 맥락을 유지한다. 이전 세션에서의 결정 사항, 제약 조건, 해결책이 자동으로 다음 세션에 전달된다.
마무리
.claude/ 폴더 구성은 단순히 “프롬프트를 잘 쓰는 것”을 넘어, AI 협업 환경을 체계적으로 설계하는 작업이다. 규칙으로 경계를 설정하고, 훅으로 안전장치를 만들고, 컨텍스트로 지식을 제공하면, Claude Code는 훨씬 일관성 있고 안전하게 동작한다.
참고 자료
- Claude Code Settings — Claude Code 공식 설정 문서
- Claude Code Hooks Guide — Claude Code 공식 hooks 가이드