(feat. AI와의 페어 프로그래밍)
"AI 시대를 살아가는 인디 해커의 무기는 속도가 아니라 '방향성'이다."
다니던 회사에서 퇴사를 하고, 무력하게 하루 이틀 시간을 낭비하는 삶을 보내고 있었습니다. 매일 같이 AI를 사용하지만, AI를 뭔가 "정말 필요에 의해서" 사용하는 것이 아닌, 그냥 궁금한 것 물어보면 즉각 답하는 검색 도구와 다를 바 없이 사용하고 있었고, 이렇게 사용하는 것이 제 구독료를 온전히 잘 활용하는 것인지 의문이 들었습니다.
'최근 뉴스를 보니, 확실히 코딩 실력도 좋아지고 이젠 서비스를 만들어 볼 수 있는 시간도 있으니, 한 번 도전해보자' 라는 생각을 가지고 최근 한 달 동안 '연쇄 개발자(Serial Maker)'의 삶을 살았습니다.
제가 몰두한 것은 단 하나였습니다.
"어디까지 AI로 만들 수 있을까?"
처음엔 장난감부터 시작하였습니다.
유튜브 영상을 아이폰 벨소리로 변환해줄 수 있는 TubeTone, 유튜브 영상에서 어려운 단어를 추출하고 알려줄 수 있는 TubeTutor, 음성 녹음된 회의록을 요약하는 MeetingAI, 이력서를 더욱 심도 있게 제안해주는 ResumeAI... (여기 있는 서비스들은 아직 세상에 나오지 못한 불쌍한 아이들입니다)
이 프로젝트들은 저에게 AI 개발의 기초 체력, 즉 '근육'을 키워주는 과정이었습니다. API를 연결하고, 프롬프트를 튜닝하고, 웹 화면을 띄우는 일련의 과정이 손에 익자 욕심이 생겼습니다.
"이제 진짜 문제를 해결해 보자. 남들에게 정말 유용할 '실전 서비스'를 만들어보자."
그렇게 시작된 것이 바로 법률 계약서 검토 AI, 클로즈메이트(ClauseMate)입니다. 오늘은 이 서비스를 개발하며 겪었던 기술적 난관들, 그리고 내 옆의 동료인 AI(Gemini)와 어떻게 싸우고 화해하며 코드를 완성했는지에 대한 아주 상세한 기록을 남기려 합니다.
모든 서비스는 '문제(Problem)'에서 시작합니다. 한국 사회의 고질적인 문제인 '전세 사기'와 프리랜서들의 불공정 계약 관행. 변호사를 찾아가기엔 비용이 부담스럽고, 혼자 검토하기엔 법률 용어가 너무 어렵습니다.
여기서 저는 LLM(거대언어모델)의 한계와 가능성을 동시에 봤습니다.
한계: LLM은 그럴듯한 거짓말(Hallucination)을 잘합니다. 법률 서비스에서 "이 조항은 안전합니다"라고 거짓말을 하면 그건 사고가 아니라 재앙입니다.
가능성: 하지만 정확한 '참조 문서(Reference)'만 쥐여준다면, LLM만큼 뛰어난 분석가는 없습니다.
그래서 도입한 기술이 바로 RAG(Retrieval-Augmented Generation, 검색 증강 생성)입니다. 쉽게 말해, AI에게 오픈북 테스트를 시키는 것입니다.
"네 머릿속에 있는 지식으로 답하지 마. 내가 주는 '주택임대차보호법' 판례집에서만 찾아서 대답해."
이 구조를 잡는 것이 ClauseMate의 핵심이었습니다. 이전의 토이 프로젝트들이 단순히 "AI야, 글 써줘"였다면, ClauseMate는 "AI야, 이 데이터베이스를 검색해서 근거를 찾아와"라는 훨씬 고도화된 아키텍처를 요구했습니다.
개발 과정은 순탄치 않았습니다. 특히 데이터베이스(DB) 선정 과정에서 저는 '로컬 환경'과 '클라우드 환경'의 차이를 뼈저리게 경험했습니다.
초기에는 그나마 구현이 쉬운 ChromaDB 를 사용했습니다. 로컬(제 맥북)에서는 완벽했습니다.
법률 데이터를 벡터(Vector)로 변환해 저장하고 검색하는 속도도 빨랐죠.
하지만 클라우드 서비스인 Render에 배포하자마자 문제가 터졌습니다.
Render의 무료/저가 플랜은 서버가 재부팅될 때마다 저장된 파일들을 초기화(Reset) 시킵니다. 즉, 사용자가 기껏 데이터를 올리고 학습시켜 놔도, 서버가 한 번 깜빡이면 기억상실증에 걸린다는 뜻입니다.
이건 서비스라고 부를 수 없었습니다. 데이터의 '영속성(Persistence)'이 필요했습니다.
결국 로컬 파일 기반인 ChromaDB를 버리고, 클라우드형 벡터 데이터베이스인 Pinecone을 도입하기로 결정했습니다.
ChromaDB: 내 컴퓨터 하드디스크에 저장 (배포 시 휘발됨)
Pinecone: 외부 전문 서버에 저장 (안전함, 확장성 좋음)
이 과정은 단순한 코드 수정이 아니었습니다. 데이터 전처리 파이프라인부터 임베딩(Embedding) 저장 방식, 검색 로직까지 싹 다 뜯어고쳐야 했죠.
이때 저는 처음으로 "인프라 아키텍처"에 대해 깊이 고민하게 되었습니다. 단순히 기능이 돌아가는 것을 넘어, "서비스가 죽지 않고 살아있는 구조"를 활용하게 된 경험이었습니다.
이 모든 과정을 저 혼자 했을까요? 아닙니다. 저에게는 24시간 불평 없이 코드를 짜주는 파트너, Google Gemini가 있었습니다. 하지만 이 파트너가 항상 정답만 주는 것은 아니었습니다.
개발 도중 가장 힘들었던 건 'AI의 코드 환각'이었습니다.
Pinecone으로 DB를 옮기던 중, Gemini가 자꾸 에러가 나는 코드를 제안했습니다.
"이 함수를 쓰면 됩니다"라고 해서 붙여넣으면 AttributeError가 뜨고, 다시 물어보면 *"아, 죄송합니다. 이 함수입니다"*라며 또 다른 틀린 코드를 줬습니다. (가장 흔한 오류는 gemini-2.5-flash 인데 계속 1.5-flash로 기입하는 것이 가장 신경쓰였습니다)
알고 보니 Pinecone 라이브러리가 최근에 대규모 업데이트되면서 문법이 완전히 바뀌었는데, Gemini의 학습 데이터에는 구버전 문법이 남아있었던 겁니다. AI는 자신 있게 틀린 답을 내놓고 있었죠.
이때 제가 깨달은 건 "AI는 조수일 뿐, 선장은 나다"라는 사실입니다.
AI가 엉뚱한 코드를 줄 때, 저는 AI를 탓하며 뺑뺑이를 도는 대신 공식 문서(Official Docs)를 찾아 직접 읽었습니다. 그리고 바뀐 문법을 복사해서 프롬프트에 입력했습니다.
"Gemini야, Pinecone 문법이 이렇게 바뀌었어. 네가 알고 있는 건 구버전이야. 이 새로운 문법을 기준으로 아까 코드를 다시 짜줘."
그러자 거짓말처럼 완벽한 코드가 나왔습니다.
AI와 협업할 때 가장 중요한 역량은 코드를 짜는 능력이 아니라, AI가 틀렸을 때 '팩트 체크'를 하고 올바른 맥락(Context)을 주입해 주는 능력임을 절실히 깨달았습니다.
사람들은 이것을 '맥락 조율(Context Orchestration)'이라고 부르고 있습니다.
기능 구현이 끝났지만, 주소창에 적힌 clausemate.onrender.com이라는 주소는 여전히 '습작'의 냄새를 풍겼습니다.
저는 과감하게 지갑을 열어 clausemate.app 도메인을 구매했습니다.
겨우 7달러, 우리나라 돈으로 약 1만원, 별다방 커피 두 잔 값입니다. 하지만 그 효과는 엄청났습니다.
HTTPS 보안 접속이 붙고,
브라우저 주소창이 깔끔해지고,
무엇보다 "나는 이 서비스를 진지하게 생각한다"는 제 마음가짐이 달라졌습니다.
도메인을 연결하고 파비콘(Favicon)을 심는 그 순간, ClauseMate는 제 하드디스크 속의 코드가 아니라 세상에 존재하는 '프로덕트'가 되었습니다.
ClauseMate는 이전에 만들었던 TubeTone이나 ResumeAI와는 결이 다릅니다.
깊이: RAG 기술을 통해 법률 데이터의 정확도를 확보했고,
안정성: Pinecone 마이그레이션으로 데이터의 영속성을 지켰으며,
협업: AI의 환각을 인간의 리서치로 보완하며 완성했습니다.
개발 기간은 놀랍게도 단 며칠이었습니다. 이것이 가능했던 이유는 제가 천재 개발자라서가 아닙니다. AI라는 강력한 레버리지를 활용했고, 그 레버리지가 삐걱거릴 때 기름칠을 하는 방법(디버깅 및 프롬프트 엔지니어링)을 터득했기 때문입니다.
ClauseMate는 이제 제 포트폴리오의 든든한 맏형이 되었습니다. 그리고 이 경험은 저에게 또 다른 영감을 주었습니다.
"최근 계속 쇼츠 영상을 만드는데, 이것도 AI에게 도움을 받을 수 있는 간편하고 쉬운 서비스를 한 번 만들어 볼까?"
그렇게 저는 또 다른 도전을 시작했습니다. 바로 다음 글에서 소개할 AI 비디오 디렉터, '드래프티(Draftie)'의 이야기로 이어집니다.
ClauseMate는 현재 베타 서비스 중입니다. 법률 검토가 필요한 분들은 https://clausemate.app 에서 AI의 도움을 받아보세요.