일기 slecs

프로젝트별 Claude 지침을 계층화하다

목차

CLAUDE.md 파일의 사이트별 캐스케이드 구조를 추가했다. 단순해 보이지만 문서 관리의 복잡성을 한 차원 낮춘 작업이다.

문제: 전역 지침의 한계

기존에는 서버 전역으로 단 하나의 CLAUDE.md 만 관리했다. 이 파일은 ops 저장소의 central 문서로 symlink 연결되어 있었는데, 모든 프로젝트와 사이트가 이 하나의 문서를 공유하다 보니 여러 제약이 생겼다.

우리 팀은 여러 사이트와 프로젝트를 동시에 운영하고 있다. 각 프로젝트마다 Claude 호출 방식, 토큰 비용 정책, 보안 규칙이 전혀 다르다. 예를 들어 일부 사이트는 prompt caching을 적극 활용하고, 다른 프로젝트는 특정 파일 형식만 처리하거나, 또 다른 서비스는 외부 API 호출을 엄격히 제한한다.

이 모든 조건을 하나의 문서에 섞으면:
- 문서 비대화: 자신과 무관한 규칙이 잔뜩 섞여 있어서 관심사 분리가 어렵다
- 수정 위험성: 한 프로젝트의 규칙을 바꿀 때 다른 곳에 미칠 영향을 매번 신경 써야 한다
- 온보딩 어려움: 새 팀원이 "내 프로젝트에 어떤 규칙이 적용되나" 를 찾기 힘들다
- 변경 추적 혼란: git 히스토리가 무관한 프로젝트들의 변경으로 지저분해진다

해결: 계층적 캐스케이드 구조

이번 작업으로 CLAUDE.md 를 다단계로 구성했다:

레벨 위치 역할
Global ops/docs/server-global-CLAUDE.md 모든 프로젝트 공통 규칙: 출력 포맷, 메타 문구 금지, 기본 제약사항
Site-specific 각 프로젝트 디렉토리의 CLAUDE.md 해당 사이트만의 추가/재정의 규칙

Claude 호출 시 문서 로더는 이제 다음 순서로 작동한다:

1. 글로벌 규칙 로드 (기본값)
    ~/.claude/CLAUDE.md (global)

2. 현재 작업 디렉토리 확인
    /opt/<site>/CLAUDE.md  있다면 로드

3. 충돌  site-specific 규칙이 우선 (override)

실제 예시로 보면:
- Global에서: "출력은 메타 문구 없이" → 모든 사이트가 따름
- Site A에서: "추가로 prompt caching 사용" → A 사이트만 적용
- Site B에서: "외부 API 호출 금지" → B 사이트만 적용
- 우선순위: Site C에서 Global의 규칙을 다르게 정의했다면, C의 설정으로 실행됨

중복을 피하면서도 각 프로젝트의 특수성을 명확히 표현할 수 있다.

서버 검증과 배운 점

이 구조가 이론적으로만 좋은 게 아니라 실제 서버 환경에서 제대로 동작함을 확인했다. Symlink 체계, 파일 로드 순서, 우선순위 해결 로직이 의도대로 작동하는지 테스트했고, 기존 호출들도 여전히 정상이다.

이 작업으로 깨달은 게, 문서 구조도 소프트웨어 설계의 원칙을 따른다는 것이다. 상속, override, 우선순위 같은 개념들이 코드뿐 아니라 규칙 문서에도 중요하다. 특히 여러 팀이 관여하는 환경에서는 "누가 언제 어디서 뭐를 수정할 수 있는가" 를 명확히 하는 것이 실수와 갈등을 줄인다.

이제 각 프로젝트는 필요할 때 자신의 CLAUDE.md 를 만들어 글로벌 규칙을 상속받으면서 독립적으로 확장할 수 있다. ops 저장소의 변경 부담도 줄어들고, 각 팀은 자기 사이트의 규칙에만 집중할 수 있게 됐다. 또한 새로 합류하는 팀원도 "내 작업 디렉토리의 CLAUDE.md 를 보면 된다" 는 단순한 규칙으로 온보딩이 쉬워진다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.