10년차 개발자의 흑역사: '커밋 없는 컨텍스트' 외치던 내 첫 웹사이트는 11개월째 고장 나 있었다
2026. 8. 23.
10년차 개발자의 흑역사: '커밋 없는 컨텍스트' 외치던 내 첫 웹사이트는 11개월째 고장 나 있었다
도메인 갱신 알림이 도착했을 때, 저는 더 이상 붙잡지 않고 떠나보내기로 결심했습니다.
threadkeeper.io는 제 첫 아이디어였고, 생애 첫 웹사이트였죠. 2025년 8월, 그러니까 커뮤니티 칼리지 AI 여름 캠프에서 ccc-ai-pdf-project 같은 파일을 만들고 제 README에 '초보 파이썬 프로젝트'라고 적었던 때로부터 약 6주 후에 도메인을 구매했습니다. 그리고 얼마 지나지 않아 도메인, 블로그, CLI, 그리고 매니페스토까지 덜컥 내놨죠.
웹사이트를 놓아주기 전에 마지막으로 한 번 더 들여다봤습니다. 뭔가 뭉클한 기분에 5분 정도. 길어야 5분이었을 겁니다.
그러다 문득 소스 코드가 어디 있는지 찾아보려고 했는데, 깨달았습니다. 소스 코드가 어디에도 없다는 사실을요.
사이트는 Spaceship이라는 플랫폼에서 호스팅 중이었고, 저는 그곳 브라우저 상에서 모든 걸 만들었습니다. 그리고 단 한 번도 버전 관리 시스템에 넣지 않았죠. 저장소도, 로컬 폴더도, 백업도 없었습니다. 세상에 존재하는 제 첫 웹사이트의 유일한 사본은, 앞으로 나흘 후면 사라질 서버 위에서 돌아가고 있는 그 모습뿐이었습니다.
그 웹사이트 페이지 상단에 청록색으로 박혀 있던 태그라인은 이랬습니다. "Don't commit without context." (맥락 없이 커밋하지 마라.)
하지만 저는 정작 단 한 번도 커밋하지 않았습니다. 정말이지 아이러니의 극치였죠.
내 웹사이트의 소스 코드가 없었다니
그래서 첫 임무는 향수에 젖는 것이 아니었습니다. 바로 '추출'이었죠.
저는 서비스가 중단되기 전에 라이브 서버에서 8개 페이지와 모든 자산을 끌어왔습니다. 랜딩 페이지, 블로그, 세 개의 게시물, 닥터 칼로(Dr. Kahlo) 페이지, 그리고 제가 AWS 해커톤에서 만들었던 아리아드네 실타래(Ariadne Clew) 요약 앱까지. 총 19개 파일이었습니다. sitemap.xml은 겨우 4개의 페이지만 언급했는데, 2025년의 제가 제 사이트맵을 얼마나 믿지 못했는지 단적으로 보여주는 대목이죠. 나머지는 링크를 따라가며 겨우 찾아냈습니다.
이제 그 아카이브는 공개되어 있으며, 모든 원본 파일에는 SHA-256 해시값이 있어 구조 과정에서 어떤 것도 변경되지 않았음을 누구나 확인할 수 있습니다.
earlgreyhot1701d.github.io/threadkeeper-archive
이제야 커밋되었습니다. 1년이나 늦었지만요.
파일 이름을 dom_js.js라고 짓고도 아무렇지 않았다니
제 코드를 직접 읽어볼 수 있게 되자마자 가장 먼저 발견한 것이 있었습니다.
아리아드네 실타래 앱에는 7개의 자바스크립트 모듈이 있었습니다. 그중 두 개는 스네이크 케이스에 접미사가 붙어 있었죠: api_js.js, dom_js.js, main_js.js. 나머지 네 개는 카멜 케이스였고 접미사는 없었습니다: utils.js, theme.js, exportMarkdown.js, dragDrop.js.
하나의 폴더 안에 두 가지 네이밍 컨벤션. 총 일곱 개의 파일.
잠시 dom_js.js를 보세요. 이 이름은 "dom, js, 점 js"라고 읽힙니다. 확장자가 접미사로 반복된 거죠. 저는 2025년에 제가 이걸 정말 자주 했다는 걸 알기 때문에, 이 파일명이 어디서 왔는지 정확히 압니다. 채팅창에 dom_js라는 코드 블록이 있었고, 그걸 레이블 그대로 .js를 붙여 저장한 다음, 일단 작동하니까 다음으로 넘어간 겁니다. 제가 실무에서 비슷한 실수를 겪어본 적이 있는데, 데드라인에 쫓기다 보면 임시 파일명으로 기능 구현부터 하고 보게 되죠. 그게 나중에 돌아와 엄청난 기술 부채로 바뀌는 경험을 여러 번 했습니다.
파일 이름은 일종의 영수증입니다. 이 파일들이 프로젝트 내에서 창조된 것이 아니라, 대화 내용에서 복사되어 나왔다는 기록인 셈이죠.
단 한 줄이 페이지의 모든 버튼을 고장 냈다
main_js.js 파일은 6개의 임포트 구문으로 시작합니다. 그중 세 번째 줄은 이렇습니다:
import { getElement, getValue, ... } from './dom.js';
그런데 서버에 올라가 있던 파일 이름은 dom_js.js였습니다.
ES 모듈은 모든 임포트 그래프를 해결한 후에 코드를 실행합니다. 파일 하나가 없으면 해당 모듈은 아예 실행되지 않습니다. 부분 실행도 없고, 문제없이 해결된 다른 다섯 개의 임포트로 폴백하는 일도 없습니다.
그 페이지의 모든 이벤트 리스너는 main_js.js 안에 들어 있었습니다. 폼 제출, 복사 버튼, 내보내기 버튼, 테마 토글, 드래그 앤 드롭, 초기 UI 상태까지. 그 어떤 것도 페이지에 제대로 연결되지 않았습니다.
페이지는 완벽하게 렌더링되었지만, 아무것도 하지 못했습니다.

저 스크린샷은 제 웹사이트가 만료되기 며칠 전, 제 브라우저에서 직접 찍은 겁니다. 왼쪽에는 완벽하게 렌더링된 페이지, 오른쪽에는 빨간색 에러 라인 하나.
이건 전체 트레이스인데, 콘솔에서는 실패한 부분만 보여주기 때문이죠:

8개 중 7개는 해결되었습니다. 하지만 모듈이 한 번도 실행되지 않았다는 네 가지 독립적인 확인.
적어도 11개월 동안 이 상태였을 겁니다. 저는 2025년 9월에 제가 앱 링크를 걸었던 블로그 게시물을 기준으로 잡았으니, 실제로는 더 오래되었을 수도 있습니다. 물론 배포 타임스탬프 같은 건 없습니다. 당연히 없을 수밖에요.
이 버그가 실패하는 모습을 직접 확인하실 수 있습니다. 아카이브는 이 버그를 배포 당시 그대로 보존하고 있습니다:
고장 난 버전 열기 (F12를 눌러 네트워크 탭을 확인해 보세요. scripts/dom.js만 8개 요청 중 404 에러를 뿜습니다.)
그다음 수정된 복사본 열기 (상태 줄에 "Ready to generate recap"이라고 뜨는 걸 확인해 보세요.)
이걸 고치려고 PR을 보내지는 말아주세요. 의도적으로 보존된 겁니다.
이 부분에 대해서는 조심하고 싶습니다. 이 이야기의 쉬운 버전은 "내가 코딩을 못했다"겠지만, 사실 그게 전부는 아닙니다. 그 스택에서는 어떤 것도 이 오류를 잡아낼 수 없었습니다. 빌드 스텝도, 번들러도, 임포트 해결 기능이 있는 린터도, 타입스크립트도, 테스트도 없었죠. 이 중 어느 하나라도 있었다면, 서버에 도달하기도 전에 누락된 임포트에 대해 큰 소리로 경고했을 겁니다.
저는 빌드 스텝 없는 CDN 위 바닐라 자바스크립트를 사용했는데, 작은 프로젝트에서는 지금도 그 선택을 옹호할 겁니다. 그 대가는 임포트 그래프를 아무도 검증해주지 않는다는 것이죠. 저는 그 대가가 무엇인지 몰랐습니다. 그래서 11개월 동안 알아채지 못하고 대가를 치렀던 겁니다.
내 첫 AI에게 가짜 박사 학위를 수여했다
제 웹사이트에는 제가 코드를 리뷰하기 위해 만든 커스텀 GPT인 '닥터 칼로(Dr. Kahlo)'를 위한 페이지도 있었습니다. 그녀에게 배경 스토리를 부여했죠. 2025년 페이지에서 그대로 가져온 원문입니다:
그녀의 가상 이력서에는 30년간의 FAANG급 경험, 코드 품질 박사 학위, 그리고 파이썬, 자바스크립트, JSON, 리액트에 대한 원어민 수준의 유창함이 포함되어 있습니다. 그녀의 미학은 프리다 칼로와 포맷터의 만남입니다. 그녀의 사운드트랙은 릴라 다운스입니다.
그리고 한 단락 뒤에는 이렇게 적혀 있습니다:
그녀는 아첨하지 않습니다. 그녀는 환각을 일으키지 않습니다. 그녀는 수술적인 정직함으로 리뷰합니다.
저는 이걸 2025년 8월에 썼습니다. 이 문장을 지금 이 자리에 그대로 두겠습니다.
덧붙이자면, 닥터 칼로는 아직 살아 있습니다. 그녀는 그녀를 소개했던 웹사이트보다 오래 살아남았죠. AI 코드 어시스턴트와의 제 2026년 관계에 대해 더 알고 싶다면, Breaking Build를 참고하세요. 키로(Kiro)와 클로드(Claude)가 제가 요구한 것을 정확히 주었지만, 그것이 제가 원했던 것은 아니었다는 이야기입니다.
막 첫 번째 결과물을 내놓았다면
오늘 당장, 당신의 코드를 저장소에 넣어두세요. 코드가 나쁘더라도, 아니 나쁘기 때문에 더욱이요.
버전 히스토리 때문이 아닙니다. 채용 담당자가 볼까 봐서도 아닙니다. 호스팅은 빌리는 것이지만, 저장소는 온전히 당신의 것이기 때문입니다. 언젠가 당신은 돌아가서 과거의 자신이 무슨 생각을 했는지 보고 싶어질 겁니다. "결제 중단한 서버에 있었다"는 말은 자신의 작업에 대해 말하기에 너무나 슬픈 문장이니까요.
이것이 모든 교훈이며, 당신에게 드는 비용은 약 90초 정도입니다.
아직 이것이 무엇을 의미하는지 말하지 않겠습니다
그 웹사이트를 다시 살펴보는 것이 저에게 어떤 영향을 미쳤습니다. 시간의 거리가 느껴졌죠. 1년 전의 제 글을 읽으면서 그 목소리는 완전히 알아보겠는데, 그 결과물에는 얼굴을 찌푸리게 되는 건 참 묘한 경험입니다.
얼마나 성장했는지 돌아보는 글을 쓰기 시작했다가 멈췄습니다. 왜냐하면, 아무런 증거도 없이 제 성장에 대해 자신감 넘치는 주장을 늘어놓으려 하고 있다는 것을 알아차렸기 때문이죠.
이것은 제가 연구를 통해 피하고자 했던 바로 그 태도입니다.
Clew Chronicles는 2025년 7월부터 2026년 8월까지, AI 어시스트 개발의 첫 13개월에 대한 n=1 종단 연구입니다. 57개의 저장소. 코퍼스는 8월 9일에 마감되었습니다. 가설들은 이미 등록되어 동결되었고, 10개 중 두 가지는 본질적으로 "무엇이 중요했는지에 대한 내 기억은 아마 틀렸을 것이다"와 "데이터는 나에게 반박할 수 있어야 한다"입니다.
그 57개 저장소 중 49개는 아직 분류되지 않은 채 스프레드시트에 제가 처리하기를 기다리고 있습니다. 그 단계는 인간의 코딩 작업입니다. 규칙상 어떤 모델도 여기에 손댈 수 없습니다.
그러니 저는 아직 무엇이 변했는지 말하지 않겠습니다. 데이터가 나오면 그때 말씀드리겠습니다. 제가 틀렸다면, 그것도 말씀드릴 겁니다.
실타래 이야기
ThreadKeeper는 AWS 해커톤 중에 Ariadne Clew로 바뀌었습니다. 프로젝트가 단순히 '무엇을 하는지'를 설명하는 이름을 넘어섰기 때문이죠. '클루(clew)'는 아리아드네가 테세우스에게 미궁에서 빠져나올 길을 찾도록 준 실타래를 의미합니다. 그렇게 Ariadne Clew가 되었고, 그 후 'Clew'라는 이름이 붙은 일련의 도구들이 탄생했습니다.
도메인은 이번 주에 사라집니다. 하지만 아이디어는 그 어느 때보다 크게 성장했습니다.
옛날 푸터에는 "깃발 심은 날: 2025년 8월 26일"이라고 적혀 있었습니다. 기념일을 계획한 건 아니지만, 원본 ThreadKeeper 저장소의 첫 커밋 날짜는 2025년 8월 20일이고, 저는 2026년 8월 20일, 정확히 12개월 만에 그 사이트로 돌아갔습니다. 완전히 우연이었죠.
저는 그 웹사이트를 정말 자랑스러워했습니다. 런칭 게시물에 이렇게 썼죠. "작동하는 스냅샷, 인사이트, 그리고 기능적인 타입스크립트 CLI와 함께 ThreadKeeper를 공식적으로 출시했습니다. 예스!" 저는 여전히 그 당시의 제가 좋습니다. 그녀는 자신이 무엇을 모르는지 전혀 몰랐지만, 그럼에도 불구하고 결과물을 내놓았습니다.
깃발을 다시 심습니다. 데이터와 함께 다시 보고하겠습니다.
처음 방문하신 분들을 위한 간략한 배경: 저는 법정에서 코딩의 세계로 넘어왔습니다. 배심원 업무에서 AI 빌더로, 독학으로, 공개적으로 배우고 있습니다. 제가 지시하고, 에이전트가 생성하며, 제가 검증하고 결정합니다. 저는 Clew Suite와 몇 가지 시민 기술 도구를 만듭니다. 이 글은 그 관점에서 작성되었습니다.
AI Assisted. Human Approved. Powered by NLP.
원문: https://dev.to/earlgreyhot1701d/my-first-website-said-dont-commit-without-context-i-never-committed-it-at-all-5d57 수집일: 2026-08-23 00:32:48