Claude Code로 제품 전체를 만들었는데, 이제 나를 포함해 아무도 우리가 뭘 만들었는지 모른다.
built our entire product with Claude Code. now nobody, including me, fully understands what we built.
핵심 요약
Claude Code로 SaaS를 개발했으나, 프로젝트가 복잡해지면서 코드베이스를 아무도 이해할 수 없는 상태가 됨.
- 초기 개발 속도 — Claude Code를 활용해 초기 단계에서 빠른 반복과 기능 구현이 가능했음.
- 복잡성 증가 — 프로젝트 규모가 커지면서 Claude Code가 전체 맥락을 파악하지 못하고 오류를 범함.
- 아키텍처 한계 — AI가 아키텍처의 위험성이나 마이그레이션 맥락을 이해하지 못해 기술 부채가 쌓임.
- 도구 활용 전략 — AI는 복잡한 시스템 설계보다는 국소적인 코드 수정에 사용하는 것이 적합함.
지난 한 달 동안 실제 SaaS를 개발해왔다.
Next.js 16, React 19, Drizzle/Postgres, Better Auth, Hono API 마이그레이션, 백그라운드 크론 작업, AI 생성 흐름, 관리자 및 직원 대시보드, 콘텐츠 초안, 브라우즈 큐, 반복 방지 메모리까지. 그야말로 난장판이었다.
초기에는 Claude Code가 정말 인상적이었다. 매일 반복 작업을 하고, 요구 사항을 변경하고, 기능을 추가하고 제거하고 다시 작성하는 등 속도가 빨랐고, 환각 문제에 대해서도 순진하게 굴지 않았다.
claude.md, 마이그레이션 문서, 컨텍스트 및 메모리 플러그인, status.md, handoff.md, API 인벤토리, 명시적인 "건드리지 마시오" 섹션까지. 모든 세션은 동일한 파일을 읽는 것으로 시작했고, 모든 세션에서 핸드오프 노트를 업데이트했다. 우리는 말 그대로 저장소에 이렇게 적어두었다: "Claude Code 세션은 시간이 지남에 따라 대화 컨텍스트를 잃어버리므로, 저장소가 마이그레이션 메모리를 유지해야 하며 채팅이 이를 대신할 수 없다."
한동안은 잘 작동했다. 초기 단계는 빨랐고 솔직히 좀 미친 수준이었다. 문제는 저장소가 더 이상 로컬에서 해결할 수 없을 만큼 복잡해지면서 시작되었다.
이 시점에서 저장소는 엉망이었다. 의도적으로 그랬다. 오래된 Next 라우트, 새로운 Hono 라우트, 마이그레이션된 호출부와 그렇지 않은 호출부, 작성 시점에 따라 세 군데로 나뉜 비즈니스 로직, 프로덕션이 여전히 가리키고 있어서 삭제할 수 없는 크론 라우트, 스키마는 옮겼지만 깨지지 않게 하려고 이전 import 경로를 살려둔 것들까지. 이게 바로 실제 제품을 운영하면서 마이그레이션을 진행할 때 나타나는 모습이다.
Claude는 그걸 이해하지 못했다.
시스템의 한 부분을 보고는 전체가 똑같이 작동한다고 가정해버렸다. 새로운 API 경로를 수정하면서 이전 라우트에 여전히 호출부가 남아있다는 사실을 잊어버렸다. 서비스를 옮기면서 조용히 패키지 경계를 넘어버렸다. 프론트엔드를 업데이트하면서 어딘가 하위 스트림의 세션 동작을 조용히 죽여버렸다. 오래된 파일을 보고는 우리가 아직 전환을 완료하지 않아 일부러 남겨둔 것임에도 불구하고 정리해버렸다.
4.7 업데이트 이후 상황이 눈에 띄게 나빠졌다. 모호함을 처리하는 방식이 뭔가 바뀐 것 같다. 이전에는 우리가 그어놓은 선 안에서 머무르는 느낌이었는데, 이제는 그냥 끝내버리고 싶어 한다. 근처에 있는 무언가와 패턴이 일치하면 파일을 읽었다고 말한다. 워크플로우를 따랐다고 말하지만, 실제로는 중요한 방식은 아니었다. 틀린 결론을 더 자신 있게 내놓는다.
우리의 실수는 프로젝트가 복잡성 임계값을 넘은 후에도 Claude를 중심에 둔 것이었다.
Claude Code는 작업이 제한적일 때 훌륭하다. 스캐폴딩, 기계적인 리팩토링, 알려진 패턴으로 코드 옮기기. 0에서 1로, 혹은 프로덕션 시스템의 1에서 0.7로 만드는 작업에는 좋다. 하지만 수석 엔지니어는 아니다. 아키텍처 메모리를 소유하지도 않고, 위험이 눈앞에 있지 않으면 마이그레이션 위험을 이해하지도 못한다. 프로덕션에서 어떤 호환성 경로가 중요한지도 모른다. 그저 프롬프트를 끝내는 데 최적화되어 있다.
우리는 "Claude가 기능을 만든다"에서 "Claude가 좁은 범위의 패치를 수행한다"로 더 일찍 전환했어야 했다.
지금은 그냥 완전 개판이고, Claude Code 사용을 최소화하면서 맨땅에 헤딩 중이다.
진짜 개판이네.

