본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 03. 11:28

대부분의 Claude Code '메모리' 설정은 모든 것을 하나의 파일에 쏟아붓습니다. 실제로 올바른 내용을 회상하는 포맷은 다음과 같습니다.

요약

Claude Code의 메모리 관리 시 발생하는 '컨텍스트 세금' 문제를 해결하기 위한 효율적인 파일 구조를 제안합니다. 단일 거대 파일 대신 하나의 사실을 하나의 파일로 분리하여 선택적 회상을 가능하게 하는 전략을 다룹니다.

핵심 포인트

  • 거대 단일 파일은 불필요한 토큰 소모와 답변 질 저하를 유발함
  • 하나의 사실을 하나의 파일로 분리하여 관리할 것을 권장
  • YAML 프론트매터를 활용해 메모리의 설명과 유형을 정의
  • 인덱스 파일은 항상 로드하되 본문은 필요할 때만 로드하여 효율성 극대화

Claude Code에게 메모리를 부여하는 방법에 대한 게시물은 수백 개가 넘으며, 거의 모든 게시물이 똑같은 말을 합니다. 컨텍스트(Context)를 CLAUDE.md에 넣으면 매 세션마다 불러온다는 것입니다. 맞는 말이지만, 동시에 문제의 시작이기도 합니다.

그 파일이 한두 화면을 넘어가는 순간, 당신은 모델에게 메모리를 주는 것이 아니라 매 대화마다 스스로에게 컨텍스트 세금(Context tax)을 부과하는 셈이 됩니다. CLAUDE.md에 있는 모든 토큰(Token)은 관련 여부와 상관없이 매 턴마다 다시 읽힙니다. 4,000토큰짜리 "메모리" 파일은 모델이 "이 변수 이름 좀 바꿔줘"라는 질문에 답하기 위해 당신의 인생 전체를 헤치며 나아가야 함을 의미합니다.

진정한 메모리는 모든 것을 저장하는(storing) 것이 아닙니다. 적절한 순간에 적절한 것을 회상하는(recalling) 것입니다. 거대한 메모리 파일이 무관한 컨텍스트로 인해 매 세션을 서서히 오염시키는 것을 지켜본 끝에 제가 정착한 포맷은 다음과 같습니다.

하나의 사실, 하나의 파일

메모리의 단위는 단 하나의 사실을 담은 단일 파일입니다. 섹션이 아닙니다. 제목 아래의 불렛 포인트도 아닙니다. 파일 하나입니다.

memory/
├── MEMORY.md                          # 인덱스 (항상 로드됨)
├── user_identity.md                   # 내가 누구인지, 어떻게 일하는지
...

큰 문서 안에 제목을 나누는 대신 왜 파일 하나당 하나의 사실을 담아야 할까요? 몇 주간 사용해 본 후에야 나타나는 세 가지 이유가 있습니다.

  1. 파일을 깔끔하게 삭제할 수 있습니다. 사실이 오래되어 쓸모없어지면 rm으로 삭제하면 됩니다. 600줄짜리 파일에서 특정 섹션을 삭제하는 것은 아무도 하고 싶어 하지 않는 번거로운 작업이기에, 오래된 컨텍스트가 쌓이게 되고 결국 모든 답변의 질을 조용히 떨어뜨립니다.
  2. 파일을 선택적으로 회상할 수 있습니다. 인덱스는 매 세션 로드되지만, _본문(bodies)_은 관련이 있을 때만 로드됩니다. 거대한 단일 파일(Monolith)은 입도(Granularity)가 없습니다. 전부 아니면 전무(All-or-nothing) 방식입니다.
  3. 파일에는 출처(Provenance)가 있습니다. 각 파일에는 언제, 왜 작성되었는지가 포함되어 있으므로, 3월에 사실이었던 정보가 오늘날에도 사실인 것처럼 위장하지 않습니다.

프론트매터(Frontmatter)는 모두가 건너뛰는 부분입니다

모든 메모리 파일에는 작은 YAML 헤더가 붙습니다. 이것이 "노트 폴더"와 "회상하는 시스템"을 가르는 차이점입니다.

---
name: feedback-no-guessing-numbers
description: "Never state a dollar/metric figure without verifying it from a source first."
...

두 필드가 핵심적인 역할을 수행합니다:

  • **description**은 회상 키 (recall key)입니다. 특정 메모리가 현재 작업과 관련이 있는지 결정할 때, 전체 본문이 아닌 바로 이 한 줄이 스캔됩니다. 제목이 아니라 이 메모리가 어떤 도움을 줄 수 있는지를 작성하세요. "numbers rule"보다는 "Never state a figure without verifying"가 더 낫습니다.
  • **type**은 사실을 user, feedback, project, reference 카테고리로 분류합니다. 이 네 가지 유형은 수명이 다르기 때문에 중요합니다. user 사실은 지속적이지만, project 사실은 만료됩니다. 유형을 아는 것은 (사용자와 모델 모두에게) 오래된 정보를 얼마나 신뢰할지 알려줍니다.

인덱스는 로드되지만, 본문은 로드되지 않습니다

MEMORY.md는 매 세션마다 컨텍스트 (context)에 포함됨이 보장되는 유일한 파일입니다. 따라서 이 파일에는 메모리당 한 줄씩만 포함하며 그 외의 것은 넣지 않습니다:

# Memory Index

## How I work
...

그게 전부입니다. 인덱스는 목차이지 컨테이너 (container)가 아닙니다. 인덱스에 사실의 *내용 (content)*을 붙여넣기 시작하는 순간, 당신은 다시 모놀리스 (monolith) 구조를 재발명하게 되며 컨텍스트 비용 (context tax)이 즉시 다시 발생합니다.

작동 방식은 다음과 같습니다: 모델이 인덱스를 읽고, 자신이 수행하려는 작업과 일치하는 한 줄짜리 훅 (hook)을 발견하면, 그다음에 해당 특정 파일을 엽니다. 본문에 대한 비용은 그것이 관련이 있을 때만 지불합니다. 40개의 메모리를 가진 시스템은 40줄의 인덱스를 가질 수 있으며, 특정 턴에서 본문의 거의 대부분을 로드하지 않은 상태를 유지할 수 있습니다.

연결 (Linking), 회상이 이웃을 찾을 수 있도록

본문 내부에서는 [[name]] (다른 파일의 name: 슬러그)을 사용하여 관련 사실들을 연결하세요. 모델이 하나의 메모리를 가져올 때, 링크는 어떤 이웃 정보가 중요할 수 있는지를 알려줍니다. 예를 들어, 마이그레이션 제약 조건은 마감 기한과 연결되고, 이는 다시 온콜 (on-call) 규칙과 연결됩니다. 아낌없이 연결하세요. 아직 존재하지 않는 [[name]]이라도 괜찮습니다. 그것은 오류가 아니라 나중에 작성할 가치가 있는 메모리를 위한 표시기입니다.

아무도 경고하지 않는 실패 모드: 오래된 메모리는 메모리가 없는 것보다 나쁘다

이것이 저를 괴롭혔던 부분입니다. _"배포 스크립트가 scripts/deploy.sh에 있습니다"_라고 말하는 메모리는 누군가 그 파일을 옮기는 순간 적극적으로 해가 됩니다. 모델은 더 이상 존재하지 않는 경로를 자신 있게 추천할 것이며, 그 말투는 마치 정답을 말하는 것처럼 매우 확신에 차 있을 것입니다.

메모리가 부패하는 것을 방지하기 위한 두 가지 규칙이 있습니다:

  1. 작성할 때 상대적인 날짜를 절대적인 날짜로 변환하세요. "다음 달에 마이그레이션합니다"는 "2026-08-01까지 마이그레이션"으로 바뀌어야 합니다. 10월에 읽은 메모리가 "다음 달"을 11월이라고 생각해서는 안 됩니다.
  2. 추천하기 전에 검증하세요. 회상된 메모리에 파일, 함수 또는 플래그(flag)가 명시되어 있다면, 모델은 이를 실행하기 전에 여전히 존재하는지 확인해야 합니다. 메모리를 _현재 사실인 것_이 아니라, _작성되었을 당시 사실이었던 것_으로 취급하세요.

메모리는 단순히 계속 추가만 되는 진실이 아닙니다. 그것은 타임스탬프(timestamp)가 찍힌 주장입니다. 시스템의 성능은 잘못된 메모리를 삭제하려는 여러분의 의지에 달려 있습니다.

왜 벡터 DB / RAG 설정이 아닌가요?

이 작업에 있어서 그것은 얻는 것 없이 과할 뿐이기 때문입니다. 전체 코퍼스(corpus)는 수십 개의 짧은 마크다운 (markdown) 파일에 불과하며, 이는 목차 하나에 들어갈 정도의 양입니다. 임베딩 (embedding) 서버도 필요 없고, 조정해야 할 유사도 임계값 (similarity threshold)도 없으며, 디버깅해야 할 검색 블랙박스 (retrieval black box)도 없습니다. 일반 파일 형식을 사용하면 에디터에서 AI의 전체 메모리를 읽을 수 있고, git diff로 변경 사항을 확인하며, rm으로 잘못된 사실을 삭제할 수 있습니다. 올바른 컨텍스트 (context)를 회상하는 가장 단순한 것이 승리하며, 이 정도 규모에서는 마크다운 폴더가 바로 그 가장 단순한 것입니다.

시도해 보세요

저는 템플릿(frontmatter schema, 인덱스 형식, 네 가지 유형, 유지 관리 규칙)을 의존성이 없는 무료 리포지토리 (repo)에 보관하고 있습니다. 구조를 복사하고, 에이전트 (agent)가 memory/ 폴더를 가리키도록 설정한 뒤, 여러분이 수정해 주는 대로 에이전트가 스스로 사실을 기록하게 하세요.

github.com/LuciferForge/claude-code-memory

만약 여러분만의 버전을 만드셨다면, 여러분이 결정한 형식을 진심으로 보고 싶습니다 — Discussions board가 열려 있습니다. 현재 저에게 가장 흥미로운 질문은 언제 삭제할 것인가 입니다 — 아직 누구도 메모리 만료 (memory expiry)에 대한 깔끔한 규칙을 가지고 있지 않습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0