AI 주도 개발로 하루 만에 한글 퍼지 매칭 알고리즘 구현하기
급박한 요구사항을 AI와 함께 단계별로 해결해나가며, 복잡한 한글 매칭 알고리즘을 빠르게 구현한 실전 경험을 공유합니다.
새로운 회사에 합류한지 어느새 1년이 흘렀고, 새롭게 맡은 프로젝트를 모두 개발하여 드디어 출시하게 되었습니다.
이 시스템은 여러 렌트카 업체가 소유한 차량과 자체적으로 책정한 렌트 요금으로 하나의 플랫폼에 모아, 서비스사가 여기에 연결해 카셰어링 서비스를 할 수 있도록 하는 것입니다.
하지만 서비스 오픈 직후 일부 차량의 가격이 사용자의 기대보다 높게 책정되어 실제 예약 전환율이 다소 떨어진다는 이슈가 발생했습니다. 이에 오늘내에 차량 모델별 추천 가격을 자동으로 제안하는 기능을 구현해야 한다는 요청이 들어오게 되었습니다. 그리고, Cursor claude Agent를 활용하여 성공적으로 하루만에 추천 요금 표시 기능을 성공적으로 구현해내었습니다.
해당 글은 해당 구현 과정에 대해 공유합니다.
현재 상황부터 파악하기
먼저 해당 상황에 대한 도메인 지식부터 파악하는게 중요하다 생각했습니다. 실제 운영중인 사이트에 접근하여 요금제가 어떻게 구성되어있는지 파악해봤습니다.

사용자 행동을 분석한 결과, 렌트카 업체들은 요금제명을 차량 모델명으로 작성하는 경향이 있습니다. 요금제 등록 폼에는 이름
과 가격
만 입력할 수 있으며, 상품 등록 시 차량 모델을 지정하면서 차량 모델명과 동일한 요금제명을 가져오는 방식으로 사용중이였습니다.
이러한 상황에서 가장 큰 문제는 사용자가 입력하는 요금제명과 차량 모델별 데이터를 어떻게 매칭할 것인가입니다. 예를 들어, 사용자가 "뉴 K5(DL3) LPi(24년식)"
이라고 입력했을 때, 이를 "K5"
라는 차량 모델의 데이터와 어떻게 연결할 것인기 고민해야 합니다.
입력패턴도 다양했습니다. 브랜드명을 포함한 입력, 세대 정보, 연료 타입, 발음 기반 입력 (e.g.: 아반떼, 쏘나타, 그렌져) 등 여러 형태로 입력될 수 있습니다. 이런 다양한 입력 패턴에서 데이터를 정확하게 매칭하는 것이 이번 기능 구현의 핵심 과제였습니다.
1단계: 전체 구현 방안 설계

첫 질문으로 얻은 핵심 정보는 다단계 매칭 전략이였습니다.
사용자가 입력한 요금제명을 기반으로 차량 모델명을 매칭하는 함수 구현을 제안받았고, 아래 기능 구현을 제시하였습니다.
- 완전 일치로 먼저 매칭
- 정규화 후 일치로 매칭
- 유사도 기반 매칭
- 키워드 기반 매칭
이를 기반으로 구체적인 매칭 알고리즘을 제안했습니다. 키워드를 추출하고 가중치를 부여하는 방식과 유사도를 측정하는 방식을 포함하고 있었습니다. 시스템 아키텍처 측면에서 DB 연결 + API 구현 및 캐싱 로직을 제안하였지만, 1일이라는 짧은 구현 기간에는 불가능한 부분이었습니다. 그러나 매칭 전략과 알고리즘은 이번 구현 과제의 핵심 아이디어로 자리잡았습니다.
2단계: 한글 퍼지 매칭 구현하기


여기서 사용해볼 수 있어요. Claude Artifacts - 한글 퍼지 매칭 상품 검색
실제 테스트 결과
- "아반때" → "아반떼" 매칭
- "그렌져" → "그랜저" 매칭
- "k5" → "K5" 매칭
- "ㅅㄴㅌ" → "쏘나타" 매칭
이 때 의도했던 함수와 프리뷰가 성공적으로 만들어졌어요. 테스트 케이스가 의도했던 바와 정확히 일치했고, 이를 기반으로 가장 걱정되었던 핵심 로직은 구현이 완료되었어요.
AI가 구현한 핵심 알고리즘


3단계: 현업 데이터를 코드에 적용하기
같은 시각, 급히 요금제 목록을 만들던 다른 팀의 동료분께서 추천 가격을 엑셀로 제공해주셨습니다. 이를 기반으로 데이터 구조를 최적화하는 작업이 필요했습니다. 요금제 등록 API의 Request Body 타입을 참고하여 데이터 구조를 최적화하는 작업이 필요했습니다.
만일 AI를 안썼더라면 .xlsx
를 .csv (comma separated values)
로 변환하고, 이를 Node.js 환경에서 파싱하는 과정을 거쳤을 겁니다.
하지만 Cursor의 Claude Agent가 이를 완벽하게 변환해주었습니다.
기존 타입 정의
AI에게 엑셀 데이터 변환 요청

엑셀 데이터는 시트를 단순 드래그 복사 붙여넣기만 하였어요.
AI가 생성한 정확한 데이터 구조
아래 데이터는 예시용입니다.
엑셀에 작성된 가격인 숫자 데이터를 정확히 파싱해냈고, 이를 기반으로 코드를 작성하면 되었습니다.
구현 결과
AI의 도움으로 기능을 구현하고 배포까지 완료했습니다. 여기까진 반나절만에 해낼 수 있었습니다.

모든 것이 순조롭게 끝난 줄 알았지만, QA 파트에서 오류를 발견했습니다.
요금제명에 "QM6"
혹은 "K5"
를 입력해도 항상 "eG80"
이라는 다른 차량이 추천되는 문제가 있었습니다.
이 문제를 해결하기 위해 테스트 코드를 작성하고, 문제의 원인을 찾는 과정이 필요했습니다.
테스트 결과 및 검증
한글 매칭 알고리즘의 신뢰를 확보하기 위해 테스트 케이스를 작성했습니다. 테스트 코드 작성해는 Cursor의 claude-4-sonnet
모델을 활용했습니다.
그리고 테스트를 진행하는 과정에서 AI가 작성한 함수에 문제가 있다는 것을 발견했습니다. 메인 함수인 bruteForceMatch
의 검색어 파라미터에 영문을 입력하면, normalizeText
함수가 빈 문자열을 반환하는 문제가 있었습니다.
normalizeText
는 한글을 파싱하는 함수로, 정규식 및 초성 추출 로직을 포함하고 있는데, 이때 한글 파싱 후 남은 문자열은 빈 문자열이 되어 영문 검색에 대응하지 못하는 문제가 있었습니다.
문제의 원인을 찾을 수 있었고, 해당 부분은 직접 코드를 수정하여 해결할 수 있었습니다.

다양한 케이스를 모두 통과하는 것을 확인하였고, 이를 기반으로 다시 배포하여 문제가 해결되었습니다.
AI 주도 개발의 교훈
AI의 도움이 없었더라면 하루만에 이 요구사항을 구현하는 것은 불가능했을 겁니다. 하지만 AI에게 코딩 과정을 맡기고 진행하는게 완전 좋다는 말을 전하고 싶은 것은 아닙니다. 테스트 없이 배포하였다가 기능에 이상이 있다는 것들 전달받았을 때, 다른 동료들에게 죄송한 마음도 들었고, 오류를 찾고 수정하는 과정에서 조바심이 들었거든요.
최근 바이브 코딩에 대한 평가를 보면, 부정적인 의견도 존재합니다.
- 주니어 개발자들의 코드를 PR하는데 본인의 코드를 본인이 모른겠다고 한다. LLM이 이렇게 짜주었다고 한다.
- 피드백을 해주면 원래 코드를 고치기보다, 완전히 새로운 코드를 만들어오기도 한다.
- 주니어 개발자가 코딩에 소요하는 시간보다 시니어 개발자가 PR에 쏟는 시간이 더 길어진다.
- 결국 코드를 깊게 이해하고 신뢰하는 데 까지 드는 비용이 AI 코딩 이전보다 더 높아졌다.
저도 아직 주니어에 해당하는 연차여서, 개발 커뮤니티에서 말하는 평가들을 보고 '난 저렇게 안해야지..'하고 배움이 됐습니다.
이러한 이유로 저는 아직 바이브 코딩이나 Claude Code
같은 프로젝트 전체를 AI에게 맡기는 것은 실제 프로덕션 환경에선 사용해보지 않았습니다.
결국 아직까진 "AI"가 만들어준 코드를 검증해줄 "사람"이 필요해 보인다는게 저의 생각입니다.
마무리
이번에 소중한 경험을 가질 수 있었습니다. 하루만에 요구사항이 나오고 결과물까지 내야하는 것이 평소에 해보기 어려운 경험이었습니다. 이런 과정에서 배운 것들이 있습니다.
AI를 적극 활용할 떄의 장점으로
- 복잡한 알고리즘을 단시간에 구현했고,
- 엑셀 데이터를 TypeScript 타입에 맞게 객체로 변환해준건 큰 도움이 됐습니다.
- 다양한 테스트 케이스또한 빠르게 만들 수 있었습니다.
하지만 AI를 쓸 때 함정에 빠지지 않도록 주의해야 합니다.
- AI가 생성한 코드는 완벽해보이지만 동작하지 않을 수 있습니다.
- 영문 입력 시 빈문자열이 반환되는 경우는, 아마 사람이 코딩했다면 당연히 예외처리가 들어갔을 겁니다.
- 테스트 없이 배포했을 때 리스크가 아주 클겁니다..
- 코드를 이해하는 데에도 시간이 소요됩니다.
- AI가 코드를 빠르게 써주더라도, 본인이 커밋한 코드를 이해하지 못하면 차라리 시니어 개발자가 직접 LLM을 쓰는게 더 빠를겁니다.
가장 중요한 것은 AI는 코드 작성 속도를 높여주지만, 코드 품질과 신뢰는 여전히 개발자의 몫이라는 것입니다. AI는 분명 강력한 도구이지만, 결국 좋은 코드를 만드는 것은 도구를 올바르게 사용하는 개발자의 역량에 달려있다는 것을 깨달은 하루였습니다.