CLAUDE.md는 Claude Code가 세션을 시작할 때 자동으로 읽어 들이는 메모리(memory) 파일입니다. 이 수업에서는 사용자·프로젝트·하위 디렉터리 수준의 메모리 파일이 어떤 계층으로 로드되고, 충돌할 때 어떤 우선순위가 적용되는지, 그리고 임포트 문법으로 어떻게 모듈화하는지를 다룹니다.
메모리 파일의 종류와 위치
Claude Code는 매 세션 시작 시 여러 위치의 CLAUDE.md 파일을 찾아 컨텍스트에 포함합니다. 각 위치는 서로 다른 범위(scope)를 가집니다.
| 종류 | 위치 | 범위 | 공유 여부 |
|---|---|---|---|
| 엔터프라이즈 정책 | 시스템 관리 디렉터리 (예: macOS /Library/Application Support/ClaudeCode/CLAUDE.md) | 조직 전체 | 관리자가 배포 |
| 사용자 메모리 | ~/.claude/CLAUDE.md | 모든 프로젝트 | 개인 전용 |
| 프로젝트 메모리 | <저장소 루트>/CLAUDE.md | 해당 저장소 | 커밋하여 팀과 공유 |
| 하위 디렉터리 메모리 | <저장소>/서브디렉터리/CLAUDE.md | 해당 디렉터리 작업 시 | 커밋하여 팀과 공유 |
사용자 메모리에는 개인 취향(코딩 스타일, 언어 설정)을, 프로젝트 메모리에는 팀 공통 규칙(빌드 명령, 아키텍처 규칙, 테스트 실행법)을 둡니다.
# CLAUDE.md (프로젝트 루트)
## 빌드와 테스트
- 빌드: npm run build
- 단위 테스트: npm run test:unit
- 커밋 전 반드시 lint 통과: npm run lint
## 아키텍처 규칙
- API 핸들러는 src/api/ 아래에만 둔다
- 공용 타입은 src/lib/types.ts 에 모은다
중요한 특징 하나: 하위 디렉터리의 CLAUDE.md는 세션 시작 시 전부 로드되는 것이 아니라, Claude가 해당 디렉터리의 파일을 읽거나 수정할 때 필요 시점에(on demand) 로드됩니다. 따라서 모노레포(monorepo)에서 패키지별 규칙을 하위 CLAUDE.md로 분리하면 불필요한 컨텍스트 소비를 줄일 수 있습니다.
계층과 우선순위
여러 CLAUDE.md가 동시에 존재하면 모두 컨텍스트에 포함되지만, 지침이 충돌할 때는 더 구체적인 범위가 우선한다는 원칙으로 이해하면 됩니다. 로드 순서는 상위(일반적)에서 하위(구체적) 방향입니다.
- 엔터프라이즈 정책 — 조직 관리자가 강제하는 규칙
- 사용자 메모리(
~/.claude/CLAUDE.md) — 개인 공통 규칙 - 프로젝트 메모리(저장소 루트) — 팀 공통 규칙
- 하위 디렉터리 메모리 — 특정 패키지·모듈 규칙
예를 들어 사용자 메모리에 "들여쓰기는 탭"이라고 적었더라도, 프로젝트 CLAUDE.md에 "이 저장소는 스페이스 2칸"이라고 적혀 있으면 프로젝트 쪽을 따르는 것이 기대 동작입니다. 시험에서는 이 우선순위의 방향(구체적 > 일반적)을 뒤집어 놓은 선택지가 자주 나옵니다.
또 하나 주의할 점은 CLAUDE.md가 모델에 주는 지침이지 하드 제약이 아니라는 것입니다. 반드시 강제해야 하는 규칙(예: 특정 명령 실행 금지)은 메모리 파일이 아니라 권한 설정(settings.json의 permissions)이나 훅(hooks)으로 걸어야 합니다.
# 현재 세션에 로드된 메모리 파일을 확인
/memory
# 대화 중 즉시 메모리에 규칙 추가 (# 단축키)
# 항상 한국어로 답해줘
/memory 명령으로 어떤 파일이 로드됐는지 확인하고 편집할 수 있으며, 메시지를 #으로 시작하면 해당 내용을 어느 메모리 파일에 저장할지 물어본 뒤 기록합니다.
임포트 문법과 모듈화
CLAUDE.md가 커지면 컨텍스트를 낭비하고 유지보수가 어려워집니다. 임포트(import) 문법 @경로를 사용하면 다른 파일을 참조하여 내용을 분리할 수 있습니다.
# CLAUDE.md
프로젝트 개요는 @README.md 를 참고.
자세한 API 규칙은 @docs/api-guidelines.md 참고.
개인 로컬 설정: @~/.claude/my-project-prefs.md
임포트 규칙은 다음과 같습니다.
- 상대 경로와 절대 경로, 홈 디렉터리(
~) 경로를 모두 쓸 수 있습니다. - 임포트된 파일이 다시 다른 파일을 임포트할 수 있으며, 재귀 깊이는 최대 5단계입니다.
- 코드 스팬이나 코드 블록 안의
@경로는 임포트로 처리되지 않습니다. 예를 들어npm install @types/node같은 패키지명은 안전합니다.
모듈화의 실전 패턴은 이렇습니다. 루트 CLAUDE.md에는 어떤 프로젝트에서도 필요한 핵심 규칙(빌드·테스트 명령, 금지 사항)만 짧게 남기고, 길어지는 상세 규칙은 주제별 파일로 나눈 뒤 임포트합니다. 팀원 개인의 로컬 전용 규칙은 저장소에 커밋하지 않는 홈 디렉터리 파일을 임포트하도록 하면, 과거에 쓰이던 CLAUDE.local.md 방식보다 유연하게 개인 설정을 분리할 수 있습니다.
새 프로젝트에서는 /init 명령을 실행하면 Claude가 코드베이스를 훑어보고 초기 CLAUDE.md 초안을 생성해 줍니다. 생성된 초안은 그대로 두지 말고, 팀이 실제로 강제하고 싶은 규칙 중심으로 다듬는 것이 좋습니다.
효과적인 CLAUDE.md 작성 원칙
CLAUDE.md는 모든 세션의 컨텍스트에 포함되므로, 길이 대비 효과가 높아야 합니다. 잘 작성하는 원칙은 다음과 같습니다.
짧고 구체적으로. "좋은 코드를 작성하라" 같은 일반론은 토큰만 소비합니다. "2칸 들여쓰기 사용", "테스트는 vitest로 실행" 같이 행동을 바꾸는 구체적 지침만 남깁니다.
구조화하라. 마크다운 불릿과 섹션 제목으로 구조화하면 모델이 규칙을 놓치지 않습니다. 서술형 문단보다 목록이 낫습니다.
자주 틀리는 것을 기록하라. Claude가 반복적으로 잘못하는 부분(예: 잘못된 테스트 명령 사용)을 발견할 때마다 # 단축키로 추가하고, 주기적으로 다듬습니다. CLAUDE.md는 한 번 쓰고 끝나는 문서가 아니라 프롬프트처럼 계속 개선하는 살아 있는 문서입니다.
강제가 필요한 것은 메모리 밖으로. 절대 어기면 안 되는 규칙은 permissions나 hooks로 옮깁니다. 메모리는 지침(guidance), 설정은 강제(enforcement)라는 구분이 시험의 단골 주제입니다.
## 나쁜 예
코드를 작성할 때는 항상 모범 사례를 따르고 깨끗하게 작성해 주세요.
## 좋은 예
- 테스트 실행: npm run test (jest 아님, vitest임)
- import 정렬은 eslint가 처리하므로 수동 정렬 금지
- DB 마이그레이션 파일은 절대 수정하지 말고 새 파일 추가
시험 함정
- 하위 디렉터리 CLAUDE.md가 세션 시작 시 전부 로드된다고 착각하기 — 실제로는 해당 디렉터리 파일을 다룰 때 필요 시점에 로드됩니다.
- 우선순위 방향 혼동 — 충돌 시 더 구체적인 범위(프로젝트·디렉터리)가 사용자 전역 설정보다 우선합니다.
- CLAUDE.md를 강제 수단으로 오해하기 — 메모리는 지침일 뿐, 반드시 막아야 하는 동작은 permissions/hooks로 강제해야 합니다.
- 임포트 재귀 깊이 무제한이라고 생각하기 — 최대 5단계까지만 따라갑니다.
- 코드 블록 안의 @경로도 임포트된다고 생각하기 — 코드 스팬·블록 내부는 임포트 처리되지 않습니다.
- /init이 완성본을 만들어 준다고 생각하기 — 초안일 뿐이며 팀 규칙 중심으로 다듬어야 합니다.
실습 시나리오
실제 시험과 같은 형식의 시나리오 문제입니다.
모노레포에서 packages/web 작업 시에만 적용될 프런트엔드 규칙이 있습니다. 루트 CLAUDE.md는 이미 300줄이 넘어 컨텍스트 낭비가 걱정됩니다. 가장 적절한 구성은 무엇입니까?
빌드 연습 · 3계층 메모리 구성 실습
약 40분1./init으로 초안 생성
실습용 저장소에서 /init을 실행해 초기 CLAUDE.md를 생성합니다.
기대 결과 · 저장소 루트에 빌드 명령과 구조 요약이 담긴 CLAUDE.md 초안이 생성됩니다.
2.사용자 메모리와 프로젝트 메모리 분리
개인 취향(응답 언어, 커밋 스타일)은 ~/.claude/CLAUDE.md로, 팀 규칙은 프로젝트 CLAUDE.md로 나눕니다.
기대 결과 · /memory 실행 시 두 파일이 모두 로드된 것이 보이고, 각 파일의 역할이 겹치지 않습니다.
3.하위 디렉터리 메모리 추가
특정 하위 디렉터리에 그 영역 전용 규칙을 담은 CLAUDE.md를 만듭니다.
기대 결과 · 해당 디렉터리 파일을 수정하는 작업을 시키면 규칙이 적용되고, 무관한 작업에서는 로드되지 않습니다.
4.임포트로 모듈화
루트 CLAUDE.md에서 @docs/… 임포트로 상세 규칙 파일을 분리합니다.
기대 결과 · 루트 파일은 30줄 이내로 줄고, 임포트된 파일 내용이 실제로 반영되는지 질문으로 확인됩니다.
5.# 단축키로 규칙 추가
대화 중 #으로 시작하는 메시지를 보내 새 규칙을 저장하고, 저장 위치를 선택합니다.
기대 결과 · 선택한 메모리 파일에 규칙이 추가되고 다음 세션에서도 적용됩니다.
6.충돌 실험
사용자 메모리와 프로젝트 메모리에 서로 충돌하는 규칙을 넣고 어느 쪽이 이기는지 관찰합니다.
기대 결과 · 프로젝트(더 구체적) 규칙이 우선 적용되는 것을 확인합니다.