Software Design

[바이브 코더 #6] 어제는 됐는데 오늘 안 돼요, 코드 안 건드렸는데 왜 그럴까

"코드를 한 줄도 안 건드렸는데, 어제까지 잘 되던 앱이 오늘 안 돼요." 바이브 코딩 커뮤니티에서 가장 자주 보이는 하소연이고, 가장 미스터리처럼 느껴지는 상황입니다. 귀신이 곡할 노릇 같지만, 사실 이 사건의 용의자는 몇 명으로 정해져 있습니다. 순서대로 조사하면 대부분 오전…

이석우iOS Developer5분 읽기
[바이브 코더 #6] 어제는 됐는데 오늘 안 돼요, 코드 안 건드렸는데 왜 그럴까 대표 이미지
IT WORKED YESTERDAY WHO CHANGED WHAT 텍스트와 함께 CACHE DEPENDENCIES OUTAGE YESTERDAY YOU 네 용의자가 서 있는 라인업 히어로 이미지
용의자는 늘 이 넷입니다. 순서대로 조사하면 오전 안에 잡힙니다

“코드를 한 줄도 안 건드렸는데, 어제까지 잘 되던 앱이 오늘 안 돼요.” 바이브 코딩 커뮤니티에서 가장 자주 보이는 하소연이고, 가장 미스터리처럼 느껴지는 상황입니다. 귀신이 곡할 노릇 같지만, 사실 이 사건의 용의자는 몇 명으로 정해져 있습니다. 순서대로 조사하면 대부분 오전 안에 잡힙니다.

먼저 전제 하나를 바로잡아야 합니다. “아무것도 안 바꿨다”는 말은 “내 코드를 안 바꿨다”는 뜻일 뿐입니다. 내 앱은 진공 속에서 돌지 않습니다. 브라우저, 수백 개의 외부 라이브러리, 남의 회사 서버(OpenAI·Supabase 같은), 결제 플랜 위에서 돌아가죠. 내가 가만히 있어도 세계는 바뀝니다. 이번 편은 그 바뀌는 것들의 목록입니다.

용의자 1: 브라우저 캐시 — 오래된 사본을 보고 있다

브라우저는 속도를 위해 한 번 받은 파일을 저장해두고 재사용합니다. 이 저장본이 캐시입니다. 문제는 앱이 새 버전으로 바뀌었는데 브라우저가 옛 저장본을 고집할 때 생깁니다. 새 코드와 옛 코드가 뒤섞여 이상하게 동작하는 것이죠.

다행히 확인법이 아주 간단합니다. 시크릿 창(사생활 보호 창)에서 열어보는 것. 시크릿 창은 캐시를 안 쓰므로, 거기서 멀쩡하면 범인은 캐시입니다. 강력 새로고침(Mac은 Cmd+Shift+R, Windows는 Ctrl+Shift+R)으로 캐시를 무시하고 새로 받으면 해결됩니다. 이 30초 테스트를 첫 번째로 하는 이유는 여기서 끝나는 사건이 의외로 많기 때문입니다.

용의자 2: 의존성 — 남의 코드가 바뀌었다

내 앱의 코드 대부분은 사실 내 것이 아닙니다. 로그인, 화면 그리기, 날짜 계산 같은 공통 기능은 전 세계 개발자들이 만들어 공개한 라이브러리를 가져다 씁니다. 보통 수백 개가 얽혀 있고, 이들을 의존성이라고 부릅니다. 프로젝트 폴더의 node_modules라는 거대한 폴더가 바로 그 창고입니다.

문제는 이 라이브러리들이 각자 업데이트된다는 것입니다. 어제와 오늘 사이에 프로젝트를 다른 컴퓨터로 옮겼거나, 뭔가를 재설치했거나, AI가 새 라이브러리를 추가하면서 기존 것들이 딸려 올라갔다면, 내 코드는 그대로여도 발밑의 땅이 바뀐 것입니다. 증상은 보통 갑자기 나타나는 낯선 빌드 에러입니다. 이때는 에러 전문과 함께 “어제 이후로 의존성이 바뀌었을 수 있어. 확인해줘”라고 AI에게 전달하면 됩니다. 5편에서 배운 전달법 그대로요.

용의자 3: 외부 서비스 — 남의 서버가 아프다

내 앱이 기대는 외부 서비스들은 남의 회사 서버입니다. 남의 서버는 고장도 나고 점검도 하고 정책도 바뀝니다.

  • 장애: OpenAI, Supabase, Vercel 같은 서비스는 전부 상태 페이지(status page)를 운영합니다. “OpenAI status”처럼 검색하면 나오는 페이지에서 지금 장애 중인지 즉시 확인할 수 있습니다. 장애라면 내가 할 일은 없습니다. 기다리면 됩니다.
  • 한도와 만료: 더 조용한 범인은 이쪽입니다. 무료 크레딧 소진, 무료 플랜의 월 사용량 초과, 등록해둔 카드 만료. 서비스는 어제까지의 호의를 오늘 조용히 거둡니다. 각 서비스 대시보드의 사용량(Usage)·결제(Billing) 메뉴를 열어보면 바로 보입니다.

용의자 4: 사실은 어제의 나 — 뭔가 바꿨다

마지막 용의자는 인정하기 싫은 그 사람입니다. 어제 자기 전에 “사소한 것 하나만” 고쳤거나, AI에게 시킨 수정에 생각보다 많은 파일이 딸려 갔거나요. 다행히 3편의 Git이 알리바이 대장을 갖고 있습니다. AI에게 “어제 이후 커밋 내역과 바뀐 파일 보여줘”라고 하면 끝입니다. 기록은 기억보다 정직합니다.

시크릿 창 테스트 Git 기록 확인 외부 서비스 상태 확인 에러 수집 순서로 진행하는 어제는 됐는데 오늘 안 될 때 점검 플로차트
수사는 싼 것부터. 시크릿 창 30초 테스트가 언제나 1번입니다

수사 순서: 싼 것부터

핵심은 순서입니다. 싸고 빠른 확인부터, 비싸고 느린 확인으로.

  1. 시크릿 창 테스트(30초): 되면 캐시. 강력 새로고침으로 종결.
  2. Git 기록 확인(1분): “어제 이후 뭐가 바뀌었어?” 바뀐 게 있으면 그게 유력 용의자.
  3. 외부 서비스 상태·사용량(3분): status 페이지와 대시보드의 Usage·Billing 확인.
  4. 에러 수집 후 AI 조사(그 이후): 위 셋이 전부 무혐의면, 5편 루틴대로 브라우저 콘솔과 서버 로그를 걷어 AI에게 조사를 시킵니다.

이 순서를 건너뛰고 4번부터 시작하면, AI가 멀쩡한 코드를 “수리”하다가 진짜 문제를 만들어내는 부작용이 생기기 쉽습니다. 코드를 고치는 것은 언제나 마지막 수단입니다.

NOTHING CHANGED THE WORLD DID 문구와 함께 그대로인 코드 섬 주위로 BROWSER CACHE LIBRARIES EXTERNAL SERVICES BILLING PLAN 지각판이 움직이는 일러스트
내 코드가 가만히 있어도 발밑의 판은 계속 움직입니다

정리

  • “아무것도 안 바꿨는데”는 “내 코드를 안 바꿨는데”일 뿐입니다. 브라우저 캐시, 라이브러리, 외부 서비스, 플랜은 계속 바뀝니다.
  • 시크릿 창에서 되면 캐시입니다. 강력 새로고침으로 끝.
  • 낯선 빌드 에러가 갑자기 나타나면 의존성 변화를 의심합니다.
  • 외부 서비스의 status 페이지와 Usage·Billing 메뉴는 즐겨찾기해둘 가치가 있습니다.
  • 수사는 싼 것부터: 시크릿 창 → Git 기록 → 외부 상태 → 로그 수집 후 AI 조사. 코드 수정은 마지막입니다.

다음 편은 모두가 무서워하는 그 주제, 요금 폭탄입니다. AI API·DB·호스팅 요금이 각각 어떤 구조로 청구되는지, 그리고 폭탄을 원천 차단하는 안전장치 설정법을 다룹니다.

이어서 읽기