Skip to main content
Summary

처음 며칠은 정말 마법처럼 보인다

바이브 코딩의 매력은 부정할 수 없다. 자연어로 "로그인 화면 만들어줘", "결제 내역 필터 추가해줘", "에러 고쳐줘"라고 말하면 AI가 코드와 UI와 설명을 한꺼번에 내놓는다. 초보자에게는 이것이 거의 순간이동처럼 느껴진다. 예전 같으면 문법, 프레임워크, 패키지 설정, 에러 로그를 하나씩 통과해야 했던 길이 몇 번의 대화로 압축된다.

이 속도감은 가짜가 아니다. 낮은 난도, 짧은 수명, 명확한 예제 패턴이 있는 작업에서는 실제로 강력하다. 앞에서 보았듯 평균 사용자의 세계에서는 양이 통한다. 많이 묻고, 많이 고치고, 많이 생성하면 적어도 "작동하는 것처럼 보이는" 결과에는 빨리 도착한다.

문제는 바로 그 지점에서 시작된다. 작동하는 것처럼 보이는 코드와 오래 버티는 코드는 다르다. 데모가 되는 코드와 변경 가능한 코드는 다르다. 화면이 뜨는 코드와 팀이 이해하고 고칠 수 있는 코드는 다르다.

바이브 코딩은 이 차이를 잠시 숨긴다. 그래서 더 위험하다.

바이브 코딩의 마법과 기술 부채의 화염AI 생성 이미지

AI는 국소적으로는 그럴듯하게 쓴다

AI가 코드를 못 쓴다는 말은 틀렸다. 오히려 AI는 작은 단위의 코드를 매우 그럴듯하게 쓴다. 함수 하나, 컴포넌트 하나, API 핸들러 하나만 보면 이름도 자연스럽고 형식도 깔끔하다. 테스트를 조금 붙이면 통과할 수도 있다. 그래서 사람은 안심한다.

하지만 소프트웨어의 난도는 코드 조각의 문법이 아니라 조각들 사이의 관계에서 나온다. 어느 모듈이 무엇을 책임지는가. 데이터는 어디서 생성되고 어디서 검증되는가. 예외 처리는 어느 층에서 끝나는가. UI 상태와 서버 상태는 누가 동기화하는가. 같은 개념을 세 군데에서 서로 다른 이름으로 구현하고 있지는 않은가.

AI는 주어진 프롬프트 안에서 최선을 다한다. 그러나 프롬프트가 전체 설계 사상과 모듈 경계를 충분히 담고 있지 않으면, AI는 그 빈칸을 즉흥적으로 메운다. 이 즉흥성은 처음에는 창의성처럼 보인다. 시간이 지나면 불일치가 된다.

한 업계 분석은 AI 생성 코드의 위험을 "각 조각은 지역적으로 일관되어 보이지만, 규모가 커질수록 전역 불일치가 누적되는 문제"로 설명한다. 같은 추상화가 여러 방식으로 반복되고, 에러 처리가 제각각이 되며, 서비스 경계를 우회하는 코드가 테스트 통과를 위해 슬그머니 들어온다는 것이다1. 핵심은 단순하다. AI는 현재 질문에는 답하지만, 별도로 설계된 규칙과 기억 장치가 없으면 시스템의 의도를 안정적으로 보존하지 못한다.

엘리트 빌더가 AI를 켜기 전에 책임 경계를 먼저 긋는 이유가 여기에 있다. 경계가 없으면 AI는 꼭 나쁜 코드를 쓰는 것이 아니다. 오히려 너무 쉽게 "가능한 코드"를 쓴다. 가능한 코드는 많다. 유지 가능한 코드는 적다.

"이거 고쳐줘"는 불을 끄는 말이 아니라 장작이 될 수 있다

바이브 코딩의 붕괴는 대개 극적인 한 번의 실패로 오지 않는다. 작은 수정 요청들이 쌓이며 온다.

처음에는 버튼이 안 눌린다. 사용자는 AI에게 말한다. "이거 고쳐줘." AI는 핸들러를 새로 붙인다. 다음에는 로그인 후 리다이렉트가 이상하다. "이거 고쳐줘." AI는 조건문을 하나 더 넣는다. 다음에는 관리자와 일반 사용자의 화면이 섞인다. "이거 고쳐줘." AI는 권한 체크를 다른 파일에 다시 만든다.

각 수정은 당장의 증상을 낮춘다. 그러나 원인을 제거하지 않을 수 있다. 더 나쁜 경우, 같은 로직이 네 군데로 퍼진다. 상태 관리가 컴포넌트 안과 전역 스토어와 서버 응답 처리부에 동시에 존재한다. 예외 처리는 어떤 곳에서는 try-catch, 어떤 곳에서는 빈 배열 반환, 어떤 곳에서는 조용한 무시로 갈라진다.

이것이 기술 부채의 실제 얼굴이다. 기술 부채는 "코드가 지저분하다"는 미적 평가가 아니다. 미래의 변경 비용이 현재의 속도 뒤에 숨는 구조다. 지금은 빨리 붙였지만, 나중에는 한 줄을 바꾸기 위해 다섯 파일을 의심해야 한다. 지금은 에러가 사라졌지만, 나중에는 왜 사라졌는지 아무도 설명하지 못한다.

AI 기반 개발 부채에 관한 한 분석은 이 차이를 중요하게 본다. 전통적인 기술 부채는 대개 누군가가 시간 압박 속에서 내린 결정이므로, 나중에 그 사람의 기억이나 문서에서 의도를 복원할 가능성이 있다. 반면 AI가 만든 코드를 이해 없이 받아들이면 코드의 설계 의도 자체가 비어 있을 수 있다. 프롬프트 기록이 남아 있지 않거나, 남아 있어도 왜 그런 구조가 선택되었는지 설명하지 못한다2.

이 상태를 이해 부채라고 부를 수 있다. 코드가 존재하지만 이해가 없다. 기능은 있지만 소유자가 없다. 통과한 테스트는 있지만 설계 이유가 없다. 이런 코드는 커밋되는 순간부터 레거시가 된다.

Einstellung Effect: 익숙한 해결책에 갇히는 순간

Einstellung Effect는 이미 익숙한 해결 방식이 머리를 점령해 더 나은 해결책을 보지 못하는 현상이다. 바이브 코딩에서는 이 효과가 AI와 결합해 더 강해진다.

사용자는 에러가 나면 원인을 추상화하지 않는다. "상태가 왜 두 군데에서 관리되지?", "권한 검증은 어느 계층이 책임져야 하지?", "이 예외는 비즈니스 규칙 문제인가, 네트워크 문제인가?"라고 묻지 않는다. 대신 익숙한 명령으로 돌아간다.

"이거 에러 나는데?"

AI는 또 답한다. 사용자는 붙여 넣는다. 다시 에러가 난다. 다시 묻는다. 이 루프가 프롬프트 래빗홀이다. 표면적으로는 적극적인 문제 해결처럼 보이지만, 실제로는 판단 능력의 외주화다. 사용자가 배워야 할 것은 정답 코드 하나가 아니라 오류의 형태다. 그런데 매번 AI가 새 코드를 주면 사용자는 오류를 읽는 근육을 쓰지 않는다.

이때 토큰은 학습비가 아니라 마취제가 된다. 고통스러운 이해의 시간을 잠시 지워준다. 그러나 고통이 사라졌다고 병이 나은 것은 아니다. 오히려 시스템은 더 많은 패치, 더 많은 조건문, 더 많은 중복 컴포넌트로 두꺼워진다.

평가 능력 없는 고토큰 사용자는 그래서 위험하다. 토큰을 많이 쓰기 때문만은 아니다. 틀린 후보를 제거하지 못하기 때문이다. AI가 내놓은 세 가지 해결책 중 무엇이 시스템 경계를 지키는지, 무엇이 임시 봉합인지, 무엇이 나중에 장애가 될지 판별하지 못하면 생성량은 곧 폐기량이 된다.

드리프트는 조용히 진행된다

바이브 코딩의 또 다른 문제는 드리프트다. 드리프트는 방향이 조금씩 밀리는 현상이다. 처음 설계한 제품의 모양, 코드의 규칙, 데이터의 의미가 매 세션마다 아주 조금씩 달라진다.

시각적 드리프트는 눈에 먼저 보인다. 버튼 크기가 화면마다 다르다. 색상 토큰을 쓰기로 했는데 어떤 컴포넌트는 임의의 hex 값을 가진다. 모달의 여백과 폼의 에러 메시지 스타일이 제각각이다. 작은 차이처럼 보이지만, 제품은 곧 조각난다.

아키텍처 드리프트는 더 늦게 보인다. 처음에는 authService가 인증을 담당했다. 어느 날 AI가 빠른 수정을 위해 컴포넌트 내부에 토큰 검증을 넣는다. 다음 세션에서는 미들웨어에 또 다른 검증이 생긴다. 이후 관리자 페이지에는 별도 유틸이 만들어진다. 이제 인증은 한 장소의 규칙이 아니라 여러 파일에 흩어진 습관이 된다.

이 단계에 오면 작은 변경도 위험해진다. 어느 파일이 진짜 규칙인지 알 수 없다. 하나를 고치면 다른 하나가 깨진다. 그래서 사람은 다시 AI에게 전체 코드를 먹이고 "어디가 문제인지 분석해줘"라고 묻는다. 이 순간 비용은 구현 비용이 아니라 복원 비용으로 바뀐다. 이미 만든 것을 이해하기 위해 다시 돈과 시간을 쓴다.

한 실무 분석도 AI 생성 코드의 총소유비용이 여기서 커진다고 지적한다. 복사-붙여넣기식 확산, 서비스 계층 우회, 해피패스 중심 테스트, 보안 검토 부재가 겹치면 개발자는 새 기능을 만드는 시간보다 AI의 의도를 역추적하는 데 더 많은 시간을 쓰게 된다3. 이것이 기술 부채의 화염이다. 불길은 처음부터 보이지 않는다. 산소는 반복 프롬프트이고, 장작은 이해 없는 코드다.

빠른 코드는 죄가 아니다, 경계 없는 속도가 문제다

바이브 코딩을 금지해야 한다는 결론은 유치하다. 문제는 AI로 빨리 만드는 행위 자체가 아니다. 문제는 빠른 생성 앞에 느린 판단이 없다는 것이다.

AI에게 맡기기 전에는 최소한 세 가지가 정해져 있어야 한다.

첫째, 책임의 위치다. 이 기능의 핵심 규칙은 어느 모듈이 소유하는가. UI가 알아야 할 것과 서버가 강제해야 할 것은 무엇인가.

둘째, 변경의 방향이다. 이 기능은 앞으로 어떤 요구사항을 만날 가능성이 높은가. 권한이 늘어나는가, 데이터 필터가 복잡해지는가, 외부 API가 바뀔 수 있는가.

셋째, 검증의 기준이다. 성공 화면만 볼 것인가, 실패 입력·권한 없음·네트워크 지연·동시 요청까지 볼 것인가. 테스트가 없다면 AI의 출력은 아직 코드가 아니라 후보일 뿐이다.

엘리트 빌더는 바이브를 죽이지 않는다. 바이브를 경계 안에 가둔다. AI에게 "전체 앱 만들어줘"라고 하지 않고, "이 인터페이스를 만족하는 순수 함수 하나를 작성하라", "이 컴포넌트는 기존 디자인 토큰만 사용하라", "이 서비스 계층 밖에서 데이터베이스에 접근하지 말라"고 말한다. 자유를 줄이는 것이 아니라 실패 공간을 줄이는 것이다.

초기 속도는 누구에게나 열린 보상이다. 그러나 지속 가능한 속도는 구조를 가진 사람에게만 남는다. 빠르게 만들어지는 것은 빠르게 무너질 수도 있다. 그리고 그 붕괴는 운이 나빠서가 아니다. 국소적으로 그럴듯한 코드, 반복 패치, 평가 능력 부재, 드리프트가 결합하면 시스템은 예정된 방향으로 간다.

바이브 코딩의 마법을 쓰고 싶다면 먼저 불이 붙을 위치를 알아야 한다. 프롬프트를 쓰기 전, 한 번 멈춰야 한다. 이 코드는 어디에 붙는가. 무엇을 중복하지 않는가. 어떤 규칙을 절대 넘지 않는가. 나중에 누가 이 의도를 설명할 수 있는가.

그 질문에 답하지 못한 채 토큰을 태우는 순간, 빌더는 창조자가 아니라 화재 관리자에 가까워진다.

참고

1Vibe Code at Scale: Managing Technical Debt When AI Writes Most of Your Codebase

2Technical debt risks from AI-driven development: an evaluation framework for investors and DD practitioners

3AI Technical Debt: How Vibe Coding Increases TCO

책 목록

AI 토큰 경제학과 인지 증폭기 패러다임: 엘리트 빌더는 왜 프롬프트 이전에 승부를 끝내는가

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기