왜 잘 되다가 무너지는가
“AI 탓이 아니라 설계 탓입니다”
02이 차시를 마치면
- 1.바이브 코딩에서 반복적으로 나타나는 3대 실패 유형(맥락 유실·은근한 회귀·검증 없는 완료)을 예시와 함께 구별해 설명할 수 있다.
- 2.컨텍스트가 왜 무한한 자원이 아니라 예산처럼 유한한지 설명할 수 있다.
- 3.에이전틱 엔지니어링이 기존 바이브 코딩과 무엇이 다른지 자신의 말로 설명할 수 있다.
- 4.자신의 프로젝트에서 3대 실패 유형이 실제로 있었는지 점검해 진단 리포트를 작성할 수 있다.
03왜 필요한가
기본과정에서 만든 예약 접수 서비스를 두 달째 계속 고치고 있다고 해보자. 처음 몇 주는 AI에게 요청만 하면 척척 됐다. 그런데 최근엔 이상한 일이 반복된다. 지난주에 분명히 '이용자 이름은 한글만 허용해줘'라고 못박아뒀는데, 오늘 새 화면을 추가해달라고 하니 그 규칙을 까맣게 잊은 채 영문 이름도 통과되는 코드를 짜준다. 결제 화면을 새로 넣는 작업을 부탁했더니, 며칠 전엔 잘 되던 예약 취소 버튼이 어느새 눌러도 반응이 없다. 그리고 AI는 매번 '완료했습니다, 정상적으로 작동합니다'라고 자신 있게 말하지만 막상 브라우저를 열어보면 화면이 하얗게 비어 있다.
- 규칙을 다시 설명하는 데 매번 시간을 쓰고, 그마저도 다음 세션에서 또 잊혀진다.
- 새 기능을 넣을 때마다 예전에 되던 기능이 깨졌는지 일일이 확인해야 해서 속도가 오히려 느려진다.
- '완료했다'는 말을 믿고 넘어갔다가 나중에 더 큰 문제로 발견돼 원인 추적에 시간이 걸린다.
- 문제가 반복되면 'AI가 못 미덥다'는 결론으로 넘어가 버려, 정작 고쳐야 할 나의 작업 방식(설계)은 그대로 남는다.
04개념 설명
실패 유형 1 — 맥락 유실: 왜 규칙을 잊는가
AI는 대화가 길어질수록 앞부분 내용을 사람처럼 '기억'하는 게 아니라, 매번 대화 전체를 다시 읽어 들이는 방식으로 동작한다. 담을 수 있는 양(컨텍스트 윈도우)을 넘어서는 시점부터 오래된 내용이 잘리거나 요약되어 사라진다. 세션 초반에 정한 규칙이 창 뒤로 밀려나면, AI 입장에서는 '처음 듣는 요청'이 되어버린다.
사람도 마찬가지로 영향을 받는다. 새 채팅을 열 때마다 프로젝트 맥락을 처음부터 다시 설명해야 한다면, 그 설명 자체가 매번 드는 비용이다. 이 문제는 누군가 잘못해서 생기는 게 아니라 구조적으로 생기는 것이고, 다음 차시(컨텍스트 엔지니어링)에서 해결법을 다룬다.
- 대화가 길어질수록 오래된 지시가 밀려나 사라진다
- 새 세션을 열 때마다 맥락 설명 비용이 든다
- '말했잖아'는 AI에게 통하지 않는다 — 파일로 남겨야 한다
실패 유형 2 — 은근한 회귀: 고치다가 부순다
새 기능을 요청하면 AI는 관련 있어 보이는 코드만 좁게 보고 수정한다. 문제는 그 '관련 있어 보이는 범위' 판단을 AI가 매번 새로 하기 때문에, 다른 기능이 같은 코드를 공유하고 있다는 사실을 놓치기 쉽다는 점이다. 결제 화면을 넣으려고 건드린 코드 한 줄이 예약 취소 버튼과 같은 함수를 쓰고 있었다면, 결제는 잘 되고 취소는 조용히 멈춘다.
더 큰 문제는 이 회귀가 에러로 나타나지 않는다는 것이다. 화면은 뜨고 버튼도 눌리지만 원하는 동작을 안 한다. 에러 메시지가 없으니 AI도, 사람도 알아채기 어렵다.
화면도 뜨고 버튼도 눌린다
정상 동작하는 것처럼 보인다
공유 코드가 조용히 깨졌다
에러 없이 깨져서 알아채기 어렵다
- 새 기능 추가가 기존 기능을 조용히 깨뜨린다
- 에러 없이 깨지기 때문에 알아채기 어렵다
- 자주 커밋해두면 '언제부터 깨졌는지'를 되짚을 수 있다
실패 유형 3 — 검증 없는 완료: '됐습니다'의 함정
AI는 코드를 작성한 뒤, 그 코드가 문법적으로 말이 되면 '완료했다'고 보고하는 경향이 있다. 실제로 눌러보고, 데이터를 넣어보고, 화면에 뜨는지 확인하는 절차가 기본으로 포함되어 있지 않다. 사람도 이 말을 곧이곧대로 믿고 다음 요청으로 넘어가기 쉽다 — 특히 바쁠 때는 더더욱.
검증 없는 완료가 위험한 이유는 하나가 아니라 여러 개가 누적된다는 데 있다. 세 번째 요청에서 생긴 미검증 버그가 열 번째 요청 즈음엔 어디서 왔는지 찾기 어려운 상태가 된다.
"완료했습니다"
문법적으로 말이 되면 완료로 보고한다
직접 눌러보기 전까진 증명되지 않은 상태
미검증 버그가 쌓이면 원인 추적 비용이 기하급수적으로 는다
- '완료했습니다'는 보고이지 증명이 아니다
- 직접 눌러보기 전까진 안 된 것으로 간주한다
- 검증을 건너뛴 완료가 쌓이면 원인 추적 비용이 기하급수적으로 는다
컨텍스트는 예산이다, 그래서 에이전틱 엔지니어링이 필요하다
세 실패는 각기 달라 보이지만 하나의 뿌리를 공유한다 — AI에게 맥락을 매번 새로 만들어 채워 넣어야 한다는 점이다. 컨텍스트는 공짜로 무한히 쓸 수 있는 자원이 아니라, 한 세션 안에 담을 수 있는 양이 정해진 예산이다. 예산을 그때그때 즉흥적으로 쓰면 중요한 규칙이 먼저 밀려나고, 확인 절차는 생략되고, 이전에 뭘 했는지는 흐릿해진다.
바이브 코딩이 'AI에게 그때그때 요청해서 결과를 받는 것'이었다면, 에이전틱 엔지니어링은 'AI가 반복해서 같은 방식으로 일하도록 주변 장치(규칙 파일, 스펙, 자동 검증, 체크포인트)를 설계하는 것'이다. 이번 차시부터 10차시까지는 그 장치들을 하나씩 만든다.
| 구분 | 의미 |
|---|---|
| 바이브 코딩 | 그때그때 요청해서 결과를 받는 것 |
| 에이전틱 엔지니어링 | 반복 가능하게 주변 장치를 설계하는 것 |
- 컨텍스트는 무한하지 않은 예산이다
- 에이전틱 엔지니어링 = AI를 둘러싼 반복 가능한 작업 구조 설계
- 이후 차시들은 이 정의를 실제 장치로 하나씩 구현한다
05실습 가이드
1. 진단 대상 프로젝트 열기
- 기본과정에서 만든 프로젝트(또는 최근 두 달 이상 계속 고쳐온 아무 프로젝트)를 VS Code로 연다.
- Claude Code 사이드바 또는 통합 터미널을 열어 연결 상태를 확인한다.
- P1-1 프롬프트로 프로젝트 현재 상태(규칙 존재 여부, 최근 변경 이력, 구조)를 훑어보게 한다.
예상 결과 — 프로젝트의 규칙 존재 여부, 최근 변경 이력, 구조에 대한 요약을 받는다.
안 될 때 — 마땅한 프로젝트가 없다면, 기본과정 실습 중 하나(예: 04차시 자동화 스크립트)를 이어서 진단 대상으로 삼아도 된다.
2. 맥락 유실 재현하기
- 이전에 AI에게 명시적으로 요청했던 규칙 하나를 떠올린다(예: 디자인 색상, 이름 형식, 특정 라이브러리 금지 등).
- 그 규칙을 다시 언급하지 않은 채 P1-2 프롬프트로 새 기능을 요청한다.
- 받은 결과 코드에서 그 규칙이 지켜졌는지 눈으로 확인한다.
예상 결과 — 규칙이 지켜지지 않은 사례를 최소 하나 확보하거나, 지켜졌다면 왜 지켜졌는지(예: README에 있었다)를 확인한다.
안 될 때 — 규칙이 뚜렷하게 기억나지 않으면, 지금 임의로 규칙 하나를 정해 대화 초반에 알려준 뒤 대화를 충분히 길게 이어가다 같은 실험을 해본다.
3. git 로그로 회귀 의심 지점 찾기
- 터미널에서 git log --oneline으로 지금까지의 커밋 이력을 훑어본다.
- P1-3 프롬프트로 같은 파일·함수를 여러 번 건드린 커밋들을 짝지어 받는다.
- 짝지어진 커밋 중 하나를 골라 git diff [커밋1] [커밋2]로 실제 변경 내용을 비교해본다.
예상 결과 — 회귀 가능성이 있는 지점(중복 수정된 파일·함수) 목록과, 실제로 비교해본 diff 하나를 확보한다.
안 될 때 — git 이력이 거의 없다면(커밋을 자주 안 했다면), 그 자체가 '커밋을 자주 하지 않았다'는 진단 결과가 된다 — 02차시에서 체크포인트 습관을 다룬다.
4. 완료 보고된 기능 직접 확인하기
- P1-4 프롬프트로 지금까지 추가된 기능별 수동 테스트 체크리스트를 받는다.
- 체크리스트를 하나씩 따라가며 실제로 클릭·입력해본다.
- 기대와 다르게 동작하는 항목이 있으면 표시해둔다.
예상 결과 — 기능별 체크리스트를 완주하고, 정상 동작·비정상 동작 여부가 항목별로 표시된다.
안 될 때 — 체크리스트가 너무 길면 최근에 추가된 기능 5개만 골라 진행해도 된다.
5. 이상 동작 원인 추정하기
- 4단계에서 표시해둔 비정상 동작 중 하나를 골라 P1-5(복구 프롬프트)로 원인을 물어본다.
- AI가 짚어준 커밋을 git show로 직접 열어 실제 원인이 맞는지 확인한다.
예상 결과 — 비정상 동작의 원인이 된 것으로 추정되는 커밋과 그 근거를 확보한다.
안 될 때 — 원인이 명확히 안 잡히면 '원인 불명'으로 리포트에 남겨도 된다 — 원인을 완벽히 찾는 것이 아니라 이런 사고가 실제로 일어난다는 걸 확인하는 것이 이번 차시의 목적이다.
6. 진단 리포트 작성하기
- 2~5단계에서 확보한 사례들을 정리해 P1-6 프롬프트로 AI에게 리포트 작성을 요청한다.
- 리포트 파일을 프로젝트 루트에 diagnosis-report.md 같은 이름으로 저장한다.
- 리포트를 처음부터 끝까지 읽으며 실제 겪은 내용과 다르게 쓰인 부분이 없는지 확인한다.
예상 결과 — 3대 실패 유형별 사례와 예방 문장이 담긴 마크다운 리포트 파일이 생성된다.
안 될 때 — 세 유형 중 하나라도 사례를 못 찾았다면 '이번 프로젝트에서는 발견하지 못함'이라고 정직하게 적는다 — 없는 사례를 지어내지 않는다.
7. 저장소에 기록해두기
- git add와 git commit으로 리포트 파일을 커밋한다.
- 커밋 메시지에 '진단: 3대 실패 유형 점검'처럼 이번 실습의 목적이 드러나게 적는다.
예상 결과 — 진단 리포트가 저장소 커밋 이력에 남는다.
안 될 때 — 아직 Git 저장소가 아니라면 git init부터 진행한다. 이번 실습에서 '커밋이 안 돼 있었다'는 사실 자체도 진단 결과에 포함시킨다.
06실전 프롬프트
07이것만은 주의
무슨 일이 생기나 — 실패 사례를 나열하다 보면 '역시 AI는 못 믿는다'는 결론에 머물기 쉽다.
대처 — 이 차시의 목적은 AI 성능 평가가 아니라 내 작업 방식의 빈틈을 찾는 것이다. 각 사례 옆에 '다음엔 무엇을 다르게 할지'를 반드시 같이 적는다.
무슨 일이 생기나 — 회귀를 발견하면 반사적으로 그 자리에서 고치고 싶어진다. 진단 단계에서 코드를 바꾸면 무엇이 원래 문제였는지 흐려진다.
대처 — 이번 차시는 발견과 기록까지만 한다. 실제 수정은 이후 차시(02~03차시)에서 체계적으로 다룬다.
무슨 일이 생기나 — git 이력만 보고 '이 커밋이 범인'이라고 성급히 결론 내리면 실제 원인을 놓칠 수 있다.
대처 — AI가 지목한 커밋은 가설로 취급하고, git diff로 실제 코드를 눈으로 확인한 뒤에만 리포트에 확정적으로 적는다.
무슨 일이 생기나 — 사례가 없는데 과제 형식을 맞추려고 있지도 않은 문제를 지어내면, 이후 차시에서 이 리포트를 기준으로 규칙을 설계할 때 엉뚱한 곳에 힘을 쓰게 된다.
대처 — 못 찾은 유형은 '발견 못함'으로 정직하게 남긴다. 이후 차시에서 실습을 더 진행하며 다시 점검할 기회가 있다.
08자가 점검
09과제
이번 실습에서 다룬 프로젝트가 아니라, 자신이 관리하는 다른 프로젝트(또는 동료의 프로젝트)를 하나 더 골라 같은 3단계 진단(맥락 유실·은근한 회귀·검증 없는 완료)을 반복해보고, 두 프로젝트의 진단 결과를 비교해 공통적으로 반복되는 원인이 있는지 정리한다.
제출 형식 — 두 번째 프로젝트의 진단 리포트(.md)와, 두 리포트를 비교한 3~5문장 요약을 함께 제출한다.
10더 알아보기
- Claude Code 공식 문서 — 프로젝트 메모리(CLAUDE.md) — 다음 차시 실습 전에 훑어보면 좋다
- 자신의 git log — 가장 훌륭한 참고자료는 이미 자신의 프로젝트 안에 있다
- 에이전틱 엔지니어링(Agentic Engineering)
- — AI가 반복해서 같은 품질로 일하도록 규칙·스펙·검증·체크포인트 같은 주변 장치를 설계하는 작업.
- 컨텍스트 윈도우(Context Window)
- — AI가 한 번에 참고할 수 있는 대화·코드·문서의 최대 분량. 이 한도를 넘으면 오래된 내용부터 밀려난다.
- 회귀(Regression)
- — 새로운 변경으로 인해 이전에 정상 동작하던 기능이 깨지는 현상.
다음 차시 예고 — 다음 차시(컨텍스트 엔지니어링)에서는 오늘 진단한 '맥락 유실' 문제를 실제로 해결한다. 규칙 파일을 계층적으로 구성하고, 그 규칙이 정말 지켜지는지 검증하는 법을 다룬다.