에이전트 주도 개발에서 발생하는 문제를 해결하고, 컨텍스트를 정밀하게 관리하는 방법
- 바이브 코딩이란?
- Claude Code 5분 만에 시작하기
- 1. 바이브 코딩의 여정: 문제와 해결의 반복
- 2. 왜 이런 문제가 발생하는가?
- 3. 해결책: LLM의 인지적 한계를 시스템으로 보완하기
- 4. 효과적인 프롬프트 작성
- 5. 정리: 바이브 코딩의 핵심 원칙
- 6. 자주 발생하는 문제와 해결
- 마무리: LLM의 한계를 시스템으로 보완한다
작성 환경: Claude Code 2.0.67, Claude Opus 4.5 (claude-opus-4-5-20251101)
Claude Code와 LLM은 빠르게 발전하고 있어 일부 성능, 기능, UI가 변경될 수 있습니다. 최신 정보는 공식 문서를 참고하세요.
바이브 코딩이란?
바이브 코딩(Vibe Coding)은 2025년 2월, Andrej Karpathy가 X(Twitter)에서 처음 사용한 용어다.
"나는 이것을 '바이브 코딩'이라고 부른다. 완전히 바이브에 몸을 맡기고, 지수적 성장을 받아들이며, 코드가 존재한다는 것조차 잊어버리는 방식이다. […] 나는 항상 'Accept All'을 누르고, 더 이상 diff를 읽지 않는다. […] 이건 진짜 코딩이 아니다—그냥 보고, 말하고, 실행하고, 복붙할 뿐인데, 대부분 잘 돌아간다." 원문
Karpathy의 원래 정의는 꽤 극단적이다. 코드를 읽지도 않고, diff도 확인하지 않고, 그냥 분위기(vibe)에 맡기는 방식이다.
하지만 실무에서는 더 넓은 의미로 사용된다. 이 가이드에서는 "코드를 읽되, LLM이 생성을 주도하는" 방식을 다룬다:
- 자연어로 의도를 전달하면
- 에이전트가 코드를 생성하고, 파일을 수정하고, 명령을 실행하며
- 개발자는 결과를 확인하고 방향을 조정한다
용어 정리: 이 글에서 "에이전트"는 Claude Code 등의 프로그램을 의미한다. "LLM"은 일반적인 대규모 언어 모델의 특성을 설명할 때 사용한다.
Karpathy의 정의처럼 "코드를 읽지 않는" 진정한 바이브 코딩에 도달하려면, 에이전트의 결과를 신뢰할 수 있어야 한다. 이 가이드는 그 신뢰를 구축하기 위한 징검다리를 제공한다.
Claude Code 5분 만에 시작하기
이게 전부다. Claude Code가 알아서 계획을 짜고 코드를 작성한다. (물론 파일 수정 권한은 허용해줘야 한다.)
1. 바이브 코딩의 여정: 문제와 해결의 반복
시작: 프롬프트 한 줄의 마법
바이브 코딩은 단순하게 시작했다.
Claude Code가 코드를 뚝딱 만들어낸다. 신기하다. 하지만 곧 문제를 발견한다.
매번 빠진 부분을 발견하고, 프롬프트를 작성하고, 결과를 확인하고, 다시 수정을 요청한다.
첫 번째 시도: "스펙 문서를 통째로 넣으면 되지 않을까?"
개발자들은 자연스럽게 생각했다. PRD나 스펙 문서를 한 번에 넣어주면, 에이전트가 알아서 전체를 구현해주지 않을까?
결과는 실망스러웠다. 뭔가 만들어지긴 하는데, 이상하다. 스펙에 분명히 있던 내용이 빠져있고, 요청하지 않은 기능이 들어가 있고, 전체적으로 방향이 이상하다.
2. 왜 이런 문제가 발생하는가?
Lost in the Middle - 긴 문서에서 중간 정보가 사라진다
에이전트는 긴 컨텍스트를 처리할 때 중간에 위치한 정보를 놓치는 경향이 있다. 이 현상은 "Lost in the Middle" 논문에서 다루고 있다.
이 패턴은 심리학의 서열 위치 효과와 유사하다.
| 초두 효과 (Primacy) | 처음 정보가 장기기억에 저장되어 잘 기억됨 |
| 최신 효과 (Recency) | 최근 정보가 단기기억에 남아 잘 기억됨 |
| 중간 정보 | 반복 기회도 적고, 단기기억에서도 밀려나 누락됨 |
LLM은 사람이 생성한 데이터로 학습되었기 때문에, 인간 인지의 편향이 학습 데이터에 반영되어 있을 가능성이 있다.
학습 데이터의 시점 편향 - 과거 패턴으로 회귀한다
에이전트는 학습 시점에 더 많이 존재했던 패턴을 우선시하는 경향이 있다.
재미있는 썰이 있다. AI에게 "웹사이트 만들어줘"라고 하면 높은 확률로 보라색 그라데이션이 나온다는 것이다. Tailwind CSS 창시자가 5년 전 기본 버튼 색상을 bg-indigo-500으로 설정했고, 이 색상이 수많은 튜토리얼에 퍼졌다. AI는 그 "중앙값"을 학습했고, 결과적으로 AI가 생성한 UI는 전부 비슷한 보라색이 되었다는 이야기다.
코드에서도 비슷한 현상이 나타날 수 있다.
| 1턴 | "Zustand 사용해. Redux 금지" | ✅ Zustand로 작성 |
| 5턴 | "새로운 상태 추가해줘" | ✅ Zustand 유지 |
| 10턴 | "장바구니 기능 만들어줘" | ⚠️ Redux 패턴 섞임 |
| 15턴 | "결제 기능 추가해줘" | ❌ Redux로 회귀 |
Zustand는 2019년에 등장했지만, 학습 데이터에는 Redux 예제가 압도적으로 많다. 컨텍스트의 명시적 지시와 학습된 prior가 경쟁하면서, 대화가 길어질수록 학습된 패턴이 우세해질 수 있다.
스펙 자체의 모호성 - 해석의 여지가 존재한다
완벽한 스펙 문서를 작성하는 것은 본질적으로 어렵다.
모순되는 요구사항
비슷한 사례로 GDPR의 "삭제권"과 "감사 의무" 충돌이 있다. 이 경우는 예외 조항으로 해결 가능하지만, 스펙 문서에서 이런 충돌은 흔하게 발생하고 예외 조항은 놓치기 쉽다.
엔트로피가 높은 표현
정보 엔트로피 관점에서, 여러 의미로 해석될 수 있는 표현은 불확실성이 높다.
동일한 문장도 읽는 사람의 배경지식에 따라 전혀 다르게 해석될 수 있으며, 에이전트도 마찬가지다.
오류 중첩 - 작은 오해가 눈덩이가 된다
에이전트는 자기회귀(autoregressive) 방식으로 작동한다. 앞에서 생성한 내용을 기반으로 다음 내용을 생성하기 때문에, 초반의 작은 오해가 이후 모든 코드에 영향을 미친다.
문제는 이 오류를 나중에 발견할수록 수습 비용이 기하급수적으로 증가한다는 것이다.
작업 기억의 한계 - 저장은 되지만 조작이 어렵다
앞서 살펴본 Lost in the Middle은 내용이 길어질 때 중간 정보가 희석되는 현상이다. 여기서는 다른 문제를 살펴보자: 지시가 길지 않음에도 별개의 항목이 많아지면 일부가 누락되는 현상이다.
인간도 작업 기억 용량에 한계가 있다. Miller(1956)의 고전적 연구는 7±2개의 청크를 제시했지만, 현대 연구(Cowan, 2001)는 새로운 정보의 순수한 작업 기억 용량을 4±1개 항목으로 추정한다. 흥미롭게도 LLM도 유사한 한계를 보인다. Zhang et al.(2024, EMNLP)의 n-back 테스트에서 GPT-4조차 3개 이상의 항목을 동시에 추적할 때 성능이 급격히 저하되었다. 다만 LLM의 메커니즘은 인간의 작업 기억과는 다르다.
인간의 작업 기억 vs LLM의 컨텍스트
인간은 작업 기억(working memory)이라는 별도의 계산 영역이 있다. 복잡한 계산을 할 때 중간 결과를 임시로 저장하고, 필요한 정보만 로드해서 처리하고, 불필요한 정보는 내려놓을 수 있다.
LLM은 이런 별도의 작업 영역이 없다. 어텐션 메커니즘이 "더 주목/덜 주목"을 모방하지만, 컨텍스트 내 모든 토큰에 항상 접근 가능하다. 인간처럼 특정 정보를 명시적으로 "내려놓고" 작업 기억을 비우는 것은 불가능하다.
| 정보 저장 | ✅ | ✅ (컨텍스트에 존재) |
| 특정 정보에 집중 | ✅ (작업 기억에 로드) | ⚠️ (어텐션으로 간접 참조) |
| 중간 결과 보관 | ✅ (임시 저장) | ❌ (출력하지 않으면 사라짐) |
| 불필요한 정보 무시 | ✅ (내려놓음) | ❌ (컨텍스트에 계속 남음) |
이 한계를 극복하기 위한 시도들
이 구조적 한계를 극복하기 위해 여러 방법이 도입되었다:
1. Chain of Thought (2022)
중간 추론 단계를 외부로 출력하게 해서, 출력된 텍스트 자체가 "외부 메모지" 역할을 한다.
2. Extended Thinking / Reasoning Tokens (2024~)
최신 모델의 Extended Thinking 등은 "thinking tokens"를 도입해서 답변 전에 추론 단계를 거친다. 하지만 이것도 본질적으로는 외부 메모지를 추가한 것이다.
3. 에이전트 루프
Plan → Act → Verify를 반복하면서, 파일 시스템이나 Todo 같은 외부 도구를 작업 공간으로 활용한다.
결국 현재까지의 해결책들은 LLM 내부에 작업 기억을 만든 게 아니라, 외부에서 작업 공간을 제공하는 방식이다. Claude Code의 도구들도 이 맥락에서 이해할 수 있다.
3. 해결책: LLM의 인지적 한계를 시스템으로 보완하기
LLM의 작업 기억 한계는 근본적으로 해결되지 않았다. 대신 우리는 시스템 수준에서 이를 우회한다. 인간이 인지 한계를 극복하는 전략을 참고해서, Claude Code가 이를 LLM에게 외부에서 적용해주는 것이다.
| 메모지에 적고 수정 | 작업 공간 부재 (중간 결과 임시 저장 불가) | 파일 시스템으로 외부화 |
| 체크리스트로 진행 관리 | 여러 항목 동시 추적 실패 | Todo |
| 작게 쪼개서 처리 | Lost in the Middle (긴 컨텍스트에서 중간 정보 누락) | 멀티턴 대화 |
| 역할 분담 | 단일 컨텍스트 처리 한계 | 서브에이전트 |
| 실행 전 계획 점검 | 자기회귀로 인한 오류 중첩 | Plan 모드, Extended Thinking |
| 중요사항 주기적 확인 | 긴 대화에서 초기 정보 희석 | CLAUDE.md |
| 불필요한 정보 정리 | 컨텍스트 선택적 비활성화 불가 | Compact + 파일로 백업 |
인간은 작업 기억에서 불필요한 정보를 내려놓으면서도 필요할 때 장기 기억에서 다시 불러올 수 있다. Claude Code의 Compact는 컨텍스트를 요약해서 집중력을 유지하고, 파일 시스템에 기록을 남겨서 필요시 복구할 수 있게 한다.
핵심 원리: 인간이 인지 한계를 극복하는 방식—정보를 쪼개고, 중요한 건 반복하고, 중간중간 점검하고, 불필요한 건 정리하는 것—을 LLM에게도 적용하는 것이다.
방법 1: 작은 요청의 멀티턴 대화
가장 기본적인 해결책은 요청을 작게 나누는 것이다.
각 턴이 짧아서 정보 누락이 없고, 명확해서 오해가 없으며, 매번 확인하므로 오류가 누적되지 않는다.
방법 2: Plan 모드 - 실행 전 방향 검증
Plan 모드는 Claude Code의 파일 수정 권한을 제한하고, 먼저 계획을 수립하도록 강제한다.
Plan 모드 없이 바로 실행하면?
Plan 모드를 사용하면?
Plan 모드의 핵심은 오해가 코드에 반영되기 전에 잡아내는 것이다.
Mode 설정
Shift+Tab 또는 --permission-mode 플래그로 Mode를 설정한다.
| Default | 매번 권한 요청 | 신중한 작업 |
| Auto-accept | 파일 수정 자동 승인 | 반복 작업 |
| Plan | 계획 수립 후 승인 | 복잡한 작업, 방향 검증 |
방법 3: Todo - 빠짐없이 체크리스트로 관리
여러 파일을 수정하거나 참고해야 하는 작업에서는 Todo로 명시적으로 관리하면 누락을 방지할 수 있다.
10개 파일을 한 번에 수정해달라고 하면 중간에 빠지는 파일이 생길 수 있다. Todo로 목록을 먼저 만들고 하나씩 처리하면, 어떤 파일이 남았는지 명확히 보이고 누락 없이 작업을 완료할 수 있다. 이는 Lost in the Middle 문제를 우회하는 효과적인 방법이다.
방법 4: 서브에이전트 - 컨텍스트 분리
서브에이전트는 각각 독립된 컨텍스트를 가진다. 하나의 거대한 요청을 여러 서브에이전트가 나눠서 처리하면, 각 에이전트는 자신의 작업에만 집중할 수 있다.
전체 코드베이스를 한 번에 분석하면 Lost in the Middle 문제가 발생하지만, 도메인별로 분리하면 각 에이전트가 작은 컨텍스트에서 정밀하게 작업할 수 있다.
다양한 퍼소나로 검증도 가능하다:
방법 5: Extended Thinking - 깊이 있는 추론
LLM은 기본적으로 바로 답변을 생성한다. Extended Thinking은 답변 전에 명시적인 추론 단계를 추가한다.
앞서 설명한 것처럼 이것도 본질적으로는 외부 메모지다. 하지만 추론 시간이 늘어날수록 복잡한 문제의 정확도가 향상된다.
복잡한 아키텍처 결정이나 디버깅 시에는 Tab으로 Extended Thinking을 활성화한다.
thinking budget 순서: "think" < "think hard" < "think harder" < "ultrathink"
언제 효과적인가?
Extended Thinking은 모든 작업에 효과적인 것은 아니다. 단순 코드 작성에는 오버헤드만 추가될 수 있고, 특정 유형의 작업에서 큰 차이를 만든다.
효과적인 경우:
- 디버깅: 에러 원인을 추적하고 여러 가설을 검증해야 할 때
- 레거시 코드 분석: 복잡한 의존성과 부작용을 파악해야 할 때
- 아키텍처 결정: 여러 접근 방식의 트레이드오프를 비교해야 할 때
- 엣지 케이스 탐색: "이 코드에서 발생할 수 있는 문제점을 찾아줘"
효과가 적은 경우:
- 단순 CRUD 코드 생성
- 보일러플레이트 작성
- 명확한 스펙의 UI 컴포넌트 구현
- 패턴이 정해진 반복 작업
💡 경험적 팁: "왜?"라는 질문이 필요한 작업에는 Extended Thinking이 효과적이고, "무엇을"만 명확한 작업에는 기본 모드가 더 효율적이다.
방법 6: CLAUDE.md - 컨텍스트를 계층적으로 관리
root/CLAUDE.md - 프로젝트 온보딩용
root의 CLAUDE.md에 금지 사항이나 세부 규칙을 넣으면 대화가 길어질수록 잊혀진다. 대신 프로젝트를 처음 접하는 사람이 알아야 할 내용을 작성한다.
디렉토리별 CLAUDE.md - 해당 영역 특화 컨벤션
디렉토리별 CLAUDE.md는 해당 디렉토리에 접근할 때 자동으로 주입된다. 그 디렉토리에서만 적용되는 컨벤션을 작성한다.
요약: 어디에 무엇을 쓸까?
| root/CLAUDE.md | 프로젝트 온보딩 (구조, 명령어, 흐름) | 항상 |
| src/xxx/CLAUDE.md | 해당 디렉토리 특화 컨벤션 | 디렉토리 접근 시 |
방법 7: Agent Skills - 검사와 워크플로우를 자동화
Skill은 룰을 나열하는 게 아니라, 검사를 수행한다
root/CLAUDE.md에 금지 사항을 넣으면 대화가 길어질수록 잊혀진다. Skill은 단순히 룰을 나열하는 게 아니라, 실제로 검사하고 검증하는 로직을 포함해야 한다.
예시: 프로젝트 룰 검사 Skill
예시: 멀티 퍼소나 코드 리뷰 Skill
MCP vs Skill
| 기반 | 웹/API 기반 도구 | 파일 시스템 기반 도구 |
| 연결 대상 | 외부 서비스 (Slack, GitHub, DB 등) | 로컬 워크플로우, 검사 로직 |
| 설정 | 서버 구성 필요 | SKILL.md 파일 작성 |
| 용도 | 외부 시스템과 통합 | 반복 검증, 워크플로우 자동화 |
MCP가 "외부 세계와 연결하는 도구"라면, Skill은 "내부 작업 방식을 정의하고 검증하는 도구"다.
Skill 구조
방법 8: Compact - 컨텍스트 정리로 집중력 유지
대화가 길어지면 컨텍스트에 불필요한 정보가 쌓인다. 인간이 작업 기억을 비우듯, Claude Code의 Compact는 대화를 요약해서 핵심만 남긴다.
언제 사용하는가?
- 대화가 10턴 이상 지속되었을 때: 초기 지시가 희석되기 전에
- 새로운 작업으로 전환할 때: 이전 작업의 세부사항이 불필요해졌을 때
- 응답 속도가 느려졌을 때: 컨텍스트가 너무 커졌다는 신호
중요한 정보는 파일로 백업
Compact 전에 중요한 결정사항이나 컨벤션은 파일로 저장해두면 나중에 다시 참조할 수 있다.
지금까지 살펴본 도구들은 LLM의 구조적 한계를 시스템 수준에서 보완한다. 하지만 이 도구들의 효과는 입력의 품질에 달려있다. 아무리 Todo로 관리해도 요구사항 자체가 모호하면 누락이 발생하고, Plan 모드를 사용해도 해석의 여지가 있으면 오해가 생긴다.
다음 섹션에서는 도구 활용과 함께 프롬프트 자체를 어떻게 작성해야 하는지 살펴본다.
4. 효과적인 프롬프트 작성
핵심 원칙: "누가 읽어도 같은 것을 상상할 수 있어야 한다"
| "사용자 친화적인 검색 기능" | "검색창에 2글자 이상 입력하면 추천 검색어 5개를 보여줘" |
| "적절한 에러 처리" | "API 호출 실패하면 '서버 연결 실패' 메시지를 빨간색으로 3초간 보여줘" |
| "빠르게 응답해야 해" | "API 응답이 3초 넘으면 타임아웃 처리해줘" |
실전 팁
한 번에 하나만: 복합 요구사항은 쪼개기
숫자로 명확하게: "적당히" 대신 구체적 수치
결과 확인 후 다음 요청: 오류 누적 방지
경계 조건 명시: 예외 상황을 미리 정의
부정문보다 긍정문: 하지 말아야 할 것보다 해야 할 것을 명시
5. 정리: 바이브 코딩의 핵심 원칙
컨텍스트를 작게 나누고 정밀하게 관리하라.
| 요구사항 누락 | Lost in the Middle | Todo로 명시적 관리, 서브에이전트로 분리 |
| 오류 중첩 | 초반 오해가 눈덩이처럼 커짐 | Plan 모드로 사전 검증, 작은 단위로 요청 |
| 컨벤션 망각 | 긴 대화에서 정보 희석 | 디렉토리별 컨벤션 적용 및 CLAUDE.md 작성 |
| 구버전 패턴 | 학습 데이터 편향 | 사용할 패턴을 명시적으로 지정 |
| 반복 검증 필요 | 수동 확인의 한계 | Agent Skills로 검사 자동화 |
한 줄 요약: 작게 나누고, 자주 확인하고, 반복은 스킬로 만들어라.
6. 자주 발생하는 문제와 해결
"분명히 말했는데 빠져있어요"
증상: 스펙에 명시한 내용이 구현에서 누락됨
원인: Lost in the Middle - 긴 컨텍스트에서 중간 정보가 무시됨 → 원인 분석 참조
해결:
"계속 옛날 방식으로 코드를 짜요"
증상: 최신 문법/패턴 대신 구버전 스타일로 작성
원인: 학습 데이터 편향 - 구버전이 더 많이 학습됨 → 원인 분석 참조
해결:
- 디렉토리별 CLAUDE.md에 버전과 패턴을 명시 → 방법 6 참조
- 서브에이전트나 Skill로 컨벤션 검사 자동화 → 방법 4, 방법 7 참조
- "이 패턴으로 작성해줘"라고 명시적 요청
"대화가 길어지니까 처음에 정한 규칙을 안 지켜요"
증상: 초반에 정한 컨벤션이 10턴 이후부터 무시됨
원인: 긴 대화에서 초기 정보가 희석됨 → 원인 분석 참조
해결:
- 디렉토리별 CLAUDE.md로 컨벤션 관리 → 방법 6 참조
- 서브에이전트나 Skill로 컨벤션 검사 자동화 → 방법 4, 방법 7 참조
- 중요한 규칙은 해당 작업 시 다시 언급
- 새 대화 시작 고려 (컨텍스트 리셋)
"엉뚱한 방향으로 10개 파일을 수정했어요"
증상: 의도와 다른 해석으로 대규모 수정 발생
원인: 모호한 요청 + 자동 실행 → 원인 분석 참조
해결:
- Plan 모드로 계획 먼저 확인 → 방법 2 참조
- 복잡한 작업은 단계별로 분리
- "먼저 계획만 보여줘"로 시작
"같은 실수를 반복해요"
증상: 수정해도 다음 작업에서 같은 패턴의 실수 반복
원인: 일회성 피드백은 학습되지 않음
해결:
- Agent Skill로 검사 로직 작성 → 방법 7 참조
- 커밋 전 자동 검사 실행
- CLAUDE.md에 스킬을 사용한 검증 방법 명시
"서브에이전트 결과가 일관성이 없어요"
증상: 여러 서브에이전트의 결과가 서로 충돌
원인: 각 에이전트가 독립된 컨텍스트에서 작업
해결:
- 공통 컨텍스트를 각 서브에이전트에 전달
- 결과를 종합하는 최종 단계 추가
- 충돌 시 "이 두 결과를 통합해줘"로 요청
마무리: LLM의 한계를 시스템으로 보완한다
LLM의 작업 기억 한계는 근본적으로 해결되지 않았다. 대신 우리는 시스템 수준에서 이를 우회하고 있다. 섹션 3에서 살펴본 것처럼, Claude Code의 도구들—Todo, Plan 모드, 서브에이전트, CLAUDE.md, Compact—은 각각 LLM의 특정 인지적 한계를 보완한다.
결국 바이브 코딩의 핵심은 이 균형을 이해하는 것이다:
- LLM이 잘하는 것: 패턴 인식, 코드 생성, 자연어 이해
- LLM이 못하는 것: 긴 정보 추적, 능동적 상태 관리, 자기 검증
- 우리가 할 일: 못하는 것을 시스템으로 보완
LLM은 인간이 만든 데이터로 학습했기 때문에 인간 인지의 편향을 일부 물려받았다. 하지만 인간이 한계를 극복하는 전략—쪼개고, 반복하고, 점검하는 것—은 스스로 실행하지 못한다. Claude Code의 도구들은 이 전략을 외부에서 적용해주는 것이다.
이 관점을 갖추면 Karpathy가 말한 "Accept All, diff 안 읽기" 미래에 더 빨리, 더 안전하게 도달할 수 있다.












English (US) ·