10년 차 엔지니어가 '바이브 코딩' 입문자에게 가장 먼저 가르치고 싶은 것: 토큰 비용 0인 도구 만들기
After 10 years as an engineer, the thing I'd teach new vibe coders first: build tools with Claude Code that cost zero tokens to run
핵심 요약
LLM에만 의존하지 말고, Claude Code를 활용해 토큰 비용 없이 영구적으로 실행 가능한 결정론적 코드를 구축하라는 조언입니다.
- 결정론적 코드 — 동일한 입력에 항상 동일한 결과를 내는 효율적인 자동화 방식임
- 토큰 비용 절감 — LLM으로 코드를 한 번만 작성하고 이후에는 무료로 실행함
- 비결정론적 한계 — LLM은 유연하지만 매번 토큰을 소모하고 결과가 달라질 수 있음
- 하이브리드 전략 — LLM의 창의성과 결정론적 코드의 효율성을 조합하여 최적의 도구를 구축함
이런 말이 있지. 손에 망치 하나 들고 있으면 세상 모든 게 못으로 보인다고. 소프트웨어 만들 때 LLM 에이전트만 써본 사람들은 토큰 몇 개 던져서 문제 해결하는 게 세상에서 제일 쉽고 편하겠지. 근데 그게 항상 최고거나 효율적인 방법은 아닐 수도 있어. 뭐, 딱히 잘못된 건 아냐. 이번 글에서 내가 하려는 건 네 연장통에 새로운 도구를 하나 더 넣어주는 거야. 생각보다 훨씬 쓸모가 많을걸. 글 끝부분에는 내가 저녁 준비하는 동안 Claude가 짜준, 토큰 한 개도 안 드는 신경망 모델도 보여줄게.
자, 그럼 LLM이랑 AI 에이전트 나오기 전 코딩을 한번 생각해보자고. 그땐 뭐였냐? 그냥 컴퓨터가 그대로 따라 할 명령어를 짜는 거였지. 사실상 자동화야. 데이터를 저장하고, 옮기고, 장비나 기계를 자동으로 돌리는 거. 그때는 이걸 "결정론적(deterministic)"이라고 불렀어. 똑같은 입력값을 넣으면 (대부분의 경우) 항상 똑같은 결과가 나온다는 뜻이지. 그러니까 어떤 작업을 하는 스크립트를 짰다면, 같은 데이터를 넣었을 때 결과도 똑같이 나와야 정상인 거야. 좀 까다로울 순 있어도, 진짜 대단한 거였지. 예전에 내가 썼던 간단한 예시를 하나 들어볼게.
네가 계산기 앱을 만든다고 치자. 숫자 두 개를 더하는 기능이 필요해. a랑 b를 받아서 a + b를 돌려주는 add()라는 함수가 있겠지. 이걸 add(1, 2)라고 백만 번 연속으로 호출해도 결과는 무조건 3이야. 단 한 번도 안 틀리고. 이게 바로 결정론적이라는 거야.
이제 지금으로 넘어와 보자. LLM이랑 AI 에이전트가 등장했지. 얘네는 코딩의 그 결정론적인 측면을 완전히 뒤집어버렸어. LLM한테 프롬프트를 던지면, 매번 똑같은 결과가 나올 거라는 보장이 전혀 없거든. 재밌는 건 이거야. "1이랑 2를 더해서 결과 알려줘"라는 프롬프트를 LLM한테 백만 번 날린다고 해보자. 매번 똑같은 응답이 올 거라고 얼마나 확신할 수 있어? 대부분은 3이 나오겠지. 어쩌면 매번 그럴 수도 있고. 근데 숫자만 딱 나올까? "네! 알겠습니다! 숫자 더해드릴게요: 정답은 3입니다" 이렇게 나올 수도 있고, 그냥 "3"이라고 할 수도 있겠지 (사실 LLM은 말이 너무 많아서 그냥 3만 뱉을 확률은 낮아). 그리고 프롬프트 짤 때 "결과값만 출력해"라거나 "간결하게 말해"라고 적어본 적 다들 있지? 근데 그게 어느 정도는 먹히는데, 항상 그런 건 아니잖아. 이 얘기는 이미 지겹도록 나왔지만, 확실히 해두자고. LLM은 **비결정론적(non-deterministic)**이야.
근데 한 가지 짚고 넘어갈 게 있어. 비결정론적인 게 나쁜 건 아니야! 오히려 정반대지! 그게 바로 LLM이랑 AI 에이전트를 마법처럼 느껴지게 만드는 핵심이거든. 오타가 섞여 있든, 문법이 개판이든, 말이 애매모호하든, LLM은 대충 알아듣고 네가 원하는 결과를 가져다주잖아. 결정론적인 코드로는 꿈도 못 꿀 일이지. 하지만 이 둘 사이에는 공생 관계가 있어. 음과 양처럼 서로를 기가 막히게 보완해준다고.
이 글의 주제가 바로 그거야. 그 관계를 짚어주고 이름을 붙여보려는 거지. 내 가설은 이거야 (완전히 틀린 소리일 수도 있지만, 뭐 쓰는 동안은 재밌으니까): 바이브 코딩(vibe coding)으로 코딩에 입문한 사람들은 아마 LLM 방식의 코딩만 경험해봤을 거야. 비결정론적인 쪽만 말이지. 만약 이 말이 네 얘기라면, 결정론적인 코딩의 세계를 알려주고 이 둘이 어떻게 서로를 보완하는지 보여주고 싶어.
말만 하지 말고 보여줄게
좋아, 너무 뜬구름 잡는 소리만 했네. 구체적인 예시를 들어보자. 흔한 사례를 하나 잡아서 결정론적인 방식이랑 비결정론적인 방식 둘 다 보여줄게. 네가 '던전 크롤러 칼(Dungeon Crawler Carl)' 시리즈에 엄청 빠져 있다고 치자 (나 그 시리즈 진짜 좋아해... 오디오북으로 다 들었는데, 완전 뽕 뽑았지 :D). 다음 책 언제 나오는지 새로운 정보가 뜰 때마다 자동으로 알림을 받고 싶어.
비결정론적인 방식
가장 먼저 떠오르는 방법은 이거겠지. 어떤 방법이냐고? LLM한테 매일 웹사이트 검색 시켜서 바뀐 거 있는지 알려달라고 하는 거. 이것도 완전히 유효한 접근법이고 장점도 꽤 있어.
- 웹사이트 구조가 바뀌어도 매번 잘 작동함
- 완전 맞춤형 응답을 받을 수 있고, 바뀐 내용을 요약까지 해줌


