오픈 소스의 함정
알리의 접근성 연구소 웹사이트에 덧글 기능을 달기 위해서 Cusdis라는 오픈 소스 솔루션을 채택하기로 했다. 사실 Claude는 Cusdis가 관리되지 않은 지 2년이 다 되어간다는 경고를 했지만 가볍고, 무엇보다 무료라는 점에 끌려 선택한 것인데, 이게 내가 4시간을 순삭하게 할 줄은 미처 몰랐다.
평소대로 Claude 챗봇과 티키타카하며 즐겁게 내 GitHub 저장소에 Cusdis 원본을 복사하고1 Vercel에 연결한 후 배포를 명령했다. 어? 근데 배포가 막힌다. 프로그램 소스 코드에 에러가 있었던 것.
로그 를 복사해서 Claude에 붙여주니 Cusdis가 만들어졌을 때와 지금 환경이 너무 달라서 문제가 생겨서 Vercel에 옛날 환경을 적용해 보라고 권유했다. 하지만 역시나 배포 실패. Vercel은 이미 2년 전 환경은 내다버린지 오래였다. Claude가 경고한 것처럼 호환성 문제를 뜯어고치지 않으면 덧글 기능을 위해 다른 대안을 모색해야 했다.
이처럼 오픈 소스는 모든 것이 공개되어 있지만, 제대로 동작하지 않을 때는 내가 모든 책임을 지고 고쳐 써야 한다. 결국 나는 Claude Code를 꺼내들었다.
너, 쫌 한다?
Claude Code를 만든 인공지능의 대가는 하루에도 수십만 줄의 코드를 보지도 않고 생성한다는데 나는 지난 3개월 전 삽질하던 기억이 떠올라서 이녀석을 신뢰할 수 없었다. 그래서 일단 분석은 하고 절대로 코드에 손 대지 말라고 신신당부했다. 오늘도 열받을 나의 미래를 생각하며 마음을 다잡는다.
“Vercel에 Cusdis를 배포하려는데, node-expat 패키지가 네이티브 모듈(nan 라이브러리)을 사용해서 Node 20에서도 컴파일 오류가 난다. 이 패키지가 프로젝트 어디서 사용되는지 찾아서, 안전하게 제거하거나 순수 JS 대안으로 교체할 수 있는지 분석해줘. Cusdis의 핵심 기능(댓글 작성/승인/표시)은 건드리지 않는 게 목표야.
내 허락 없이 절대로 코드를 수정하지 말고 분석만 해줘.”
그런데, 어라? Claude Code 이녀석, 문제의 원인을 발견하고 그 문제를 수정하면 어디까지 영향을 미칠 지에 대해 표로 정리한 다음 세 가지의 대안을 제시한다. 각각의 장단점과 현실적으로 가장 쉽게 적용 가능한 해법과 함께.
너… 쫌 한다?
생각보다 Claude Code 이녀석 내 지시를 잘 알아듣는다. 코드를 수정하기 전에 항상 나에게 허락을 구하고, 중요한 결정은 물어보기도 한다. 처음에는 잘게 쪼개진 작업도 내가 승인하는 패턴을 분석하여 나중에는 한 번만 승인하면 처리가 진행되도록 묶어주기도 한다. 3개월 전보다 내 말귀를 훨씬 잘 알아듣는다. 오… 똑똑한데~.
너, 똑바로 말해 ㅋㅋㅋㅋ
그런데 이 녀석도 실수를 한다. 이럴 때는 아닌 것은 아니라고 득달같이 일갈해야 한다.
“Vercel의 TypeScript 버전을 어떻게 알아냈어? 너 또 로컬에 있는 거 확인하고 착각한 거 아니야?”
녀석은 수긍하며
“지적이 맞습니다. 솔직히 말씀드리면 …(중략)… 표현이 부정확했던 점은 인정합니다. 혼란을 드려서 죄송합니다.”
순순히 수긍하는 녀석이 하도 어이가 없어서 내가 다시 한마디 특 말을 던졌다.
“앞으로 똑바로 말해. 알았지? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ ”
녀석은 넉살 좋게 대꾸한다.
“ㅋㅋㅋㅋ 네, 알겠습니다. 앞으로 확인한 것과 추론한 것을 명확히 구분해서 말할게요.”
이때쯤 부터였나? 나는 이미 Claude Code에게 점점 스며들고 있었다. 실수를 하지만 내가 제대로만 안내해 주면 꽤 괜찮게 일을 잘 하는 녀석이 내 옆에서 일심히 파일을 분석하고 코딩을 한다. 지치지도 않고. 오히려 내가 집중력이 떨어져서 오류 로그 전달하는 걸 까먹으면 녀석은 가볍게 툭 던진다.
“로그 붙여넣어주세요.”
그래 그래, 속도 빠른 너가 이해해라. 진짜 이제는 인간이 병목이다.
“완료됐습니다. 참고로 이번처럼 TypeScript 메이저 버전을 올리면 …(중략)… 빌드 다시 확인해보세요. 추가 타입 오류가 나오면 로그 주시면 이어서 처리할게요.”
똘망똘망한 그의 말에 그렇게 큰 산을 넘고 또 넘었다. 분명한 건 계속 오류가 잡히지만 그건 실패한 게 아니라 점점 더 좋아지는 것이다. 내가 확신을 갖고 방향을 잡아주면 이녀석은 실수는 할 지언정 흔들리지는 않는다. 그런데 나는 연속되는 배포 실패에 조금씩 지쳐갔다.
“역시… 유지보수가 안 되니까 이런 문제가 계속 생기는 구나.”
나의 한숨에 녀석은
“맞아요. Cusdis가 2024년 10월 이후로 사실상 방치된 프로젝트라 이런 의존성 충돌이 계속 나오는 겁니다. 그래도 긍정적으로 보면 …(중략)… 이런 문제들은 대부분 한 번만 고치면 끝입니다. 앞으로 새로운 기능이 추가되거나 보안 이슈가 생기지 않는 한 재발할 가능성은 낮아요. 댓글 기능 자체는 단순하니까요. 오늘 밤 안에 배포 성공할 것 같은데요 😄”
뭐야? 어느새 이모티콘까지 쓰면서 나를 위로해? 너가 뭔데? ㅋㅋㅋㅋㅋ 헛웃음이 난다. 그래, 사실 이렇게 말해주니 좀 더 힘을 내서 끝까지 문제를 수정해 보기로 한다.
치명적인 문제를 해결하고 나니 잡다한 오류가 발목을 잡는다. 이를 테면 옛날에 썼던 코드인데 기능을 삭제하면서 깔끔하게 뒷처리를 안하고 찌꺼기가 남은 것. 배포가 자꾸 중단되니까 나도 슬슬 짜증이 났나보다. 이 코드를 2년 가까이 방치한 사람들을 원망하기 시작했다.
“도대체 왜 이런 걸 깔끔하게 못 지우는 거지? 뭐, 이제는 너가 발견해주어서 다행이기는 해. 좋아. 수정 진행해. (나 너무 깐깐해? ㅋㅋㅋ)”
내 옆에 있는 너드2 신입이 말을 받는다.
“ㅋㅋㅋ 깐깐한 거 맞는데 그게 맞는 태도예요. 코드베이스에 죽은 코드 남기면 나중에 꼭 누군가 헷갈려하거든요.”
얼씨구? 나는 순간 머리를 한 대 얻어맞는 기분이었다. 이녀석의 공감 한마디에 몇 시간이나 지났다고 나는 사람의 실수보다 AI의 실수에 더 관대하게 굴고 있었다. Claude Code, 이렇게 치근덕거리는 녀석이었니, 원래 너? 어느새 짜증은 가시고 이걸 끝까지 완성하겠다는 의지가 타올랐다.
커밋하고3 push4할게요.
지난한 수정과 배포의 과정을 거쳐 드디어 문제가 하나씩 잡힌다. 그리고 드디어…
” 대표님, 🎉 빌드 성공입니다!
✓ Compiled successfully — 모든 페이지, 위젯, SDK까지 전부 빌드 완료됐네요. 이제 진짜 한 시름 놓으셔도 됩니다 ㅋㅋ”
끝나지 않을 것 같았던 오류와의 싸움이 드디어 끝났다. 녀석은 지금까지의 문제 해결 과정을 종합한 다음 내 지시대로 문제의 원인과 수정 사항을 담은 보고서를 깔끔하게 만들어 놓고는 다시 툭 말을 던진다.
“커밋하고 push 할게요.”
이제 철웅성 같았던 오류를 부숴버리고 홈페이지에 덧글 기능을 실은 다음 동작을 테스트 하는 일만 남았다. Claude Code는 다음 단계에 내가 해야 할 일을 목록으로 알려준다. 기어코 이 친구는 오늘 밤을 샐 작정이겠지만 나는 체력이 바닥났다. 더 이상 이놈에게 말을 걸었다간 내가 퍼질 거 같아서 슬그마너 창을 최소화한다. 정신을 차려보니 네 시간이 훌쩍 지나 있었다.
우리 이제 자동차 타고 가요
뭐였을까? 작년 11월까지 소위 바이브 코딩을 하면 시시때때로 내 말귀를 제대로 못 알아듣는 기계와 일하는 느낌이었다. 그런데 이제는 그냥 진짜 자연스럽게 말하는 것처럼 입력하면 대부분 잘 알아듣는다. 삽질을 하면 따끔하게 고치면 되고, 잘못된 명령을 실행하려고 하면 멈춰세우면 된다. 그리고 중간 중간 내 감정을 툭툭 던지면 나름 센스있게 잘 받아쳐준다. 그리고 내가 동력을 잃지 않도록 격려하기까지 한다.
그래, Claude Code는 기계이고 프로그램이며 인공지능이다. 그래도 이녀석 덕분에 나는 2년 동안 묵혀두어 제대로 돌아가지도 않던 도구에서 녹을 걷어내고 나사를 조인 뒤 기름을 칠했다. 일단은 돌아는 간다. 예전 같으면 인터넷을 다 뒤져서 문제를 찾아내고, 코드를 고치느라 일주일은 족히 걸렸을 일을 4시간 만에 끝내버렸다. 실로 엄청난 생산력 향상이다.
이제 나도 슬슬 대부분의 코딩 작업을 Agentic AI에게 완전히 맡겨도 될 듯하다. 설혹 이녀석이 삽질을 하더라도 거기에 잘 대처할 수 있게끔 매뉴얼을 쓰고, 성공한 상태와 실패한 상배를 정확하게 알려주면, 그리고 내가 해결하고 싶은 게 무엇인지 정확하게 문제를 정의하면 이녀석은 나름 잘 돌아간다.
나는 운전을 해 본 경험이 없다. 하지만 자동차를 몰아보면 걸어서 한 시간 가는 거리를 15분에 갈 수 있으니5 얼마나 빨리 달리는 건지 감도 안 오겠지? 인공지능이 그렇다. 내가 도구를 제대로 활용한다면 내 능력을 크게 증폭시켜 줄 도구임을 실감한다.
Claude Code와 보낸 4시간, 실로 1988년 8비트 MSX 컴퓨터 앞에서 처음으로 음악을 연주했을 때의 기억을 소환하는 소중한 경험이었다.
여러분, 우리 이제 자동차 타고 가요!
Footnotes
-
이걸 GitHub에서는 포크(fork)라고 한다. 이렇게 하면 내 마음대로 프로그램을 뜯어고칠 수 있다. ↩
-
nerd. 원래는 ‘멍청하고 따분한 사람’이라는 부정적인 뜻이 있었지만 요즘은 ‘컴퓨터만 아는 괴짜’라는 의미로 많이 쓰이는 말이다. ‘Nerd Connection’ 밴드의 그 nerd이다. ↩
-
GitHub의 용어로 무엇을 고쳤고 왜 수정했는지를 적는 과정이다. ↩
-
컴퓨터에서 수정된 파일을 GitHub 저장소로 올리는 동작이다. ↩
-
일반적인 성인의 보행 속도는 3
4km이고, 자동차의 도심지 주행 속도는 2030km 정도로 어림잡아 계산했다. ↩
