TECH 으로 돌아가기
TECH HACKER NEWS 오늘 6분 읽기 48 READS

복붙이 아닌 '의미상 중복' 코드까지 잡아내는 CLI 도구, slopo

복붙이 아닌 '의미상 중복' 코드까지 잡아내는 CLI 도구, slopo

AI 코딩 도구를 쓰다 보면 묘한 문제를 하나 겪게 돼요. 분명히 프로젝트 어딘가에 날짜 포맷 함수가 이미 있는데, AI가 그걸 찾아 쓰는 대신 비슷한 함수를 새로 하나 만들어버리는 거예요. 변수 이름도 다르고 구조도 살짝 다르지만 하는 일은 똑같은 코드가 여기저기 늘어나는 거죠. 사람이 복사-붙여넣기한 중복은 기존 도구로 잡을 수 있는데, 이렇게 '겉모습은 다른데 의미는 같은' 중복은 잡기가 정말 어렵거든요. 오늘 소개할 slopo는 바로 이 문제를 겨냥한 오픈소스 CLI 도구예요. 이름부터 AI가 쏟아내는 저품질 코드를 뜻하는 'slop(슬롭)'에서 따온 것으로 보이고요.

기존 중복 탐지 도구는 뭐가 문제였냐면요

jscpd나 PMD의 CPD 같은 전통적인 중복 탐지 도구들은 기본적으로 토큰 비교 방식이에요. 코드를 단어 단위(토큰)로 쪼갠 다음, 같은 토큰이 같은 순서로 길게 이어지는 구간을 찾는 거죠. 그래서 그대로 복붙한 코드나 변수 이름만 바꾼 코드는 잘 잡아요. 학계에서는 코드 중복을 네 단계로 분류하는데요. Type 1은 완전히 똑같은 복사본, Type 2는 변수·함수 이름만 바꾼 것, Type 3은 몇 줄을 추가하거나 수정한 것, Type 4는 구현 방식은 완전히 다른데 하는 일이 같은 코드예요. 토큰 기반 도구는 Type 1~2까지는 강한데, Type 3부터 급격히 약해지고 Type 4는 사실상 못 잡아요. 그런데 AI가 만들어내는 중복이 바로 이 Type 3~4 영역이거든요.

slopo는 임베딩으로 접근해요

slopo의 아이디어는 임베딩 모델을 쓰는 거예요. 임베딩이 뭐냐면, 텍스트나 코드를 수백~수천 개의 숫자로 이루어진 벡터(좌표)로 바꾸는 기술이에요. 이 좌표의 신기한 점은, 의미가 비슷한 것들이 공간에서 가까운 위치에 놓인다는 거예요. "고양이"와 "냥이"가 가까운 좌표를 갖는 것처럼, 구현이 달라도 하는 일이 비슷한 두 함수는 가까운 좌표를 갖게 되는 거죠. 요즘 검색 서비스나 RAG(질문과 관련된 문서를 찾아서 AI에게 건네주는 기법)에서 널리 쓰이는 바로 그 기술이에요.

slopo는 코드베이스를 훑으면서 함수 같은 코드 조각들을 뽑아내고, 각각을 임베딩 모델로 벡터로 변환해요. 그다음 벡터들 사이의 코사인 유사도(두 벡터가 가리키는 방향이 얼마나 비슷한지를 0에서 1 사이 숫자로 재는 방법)를 계산해서, 설정한 임계값보다 유사도가 높은 쌍들을 "중복 의심"으로 보고해주는 거예요. 토큰이 아니라 의미를 비교하니까, 변수 이름이 다르든 반복문이 재귀로 바뀌었든 상관없이 "이 두 함수, 하는 일이 거의 같은데요?"라고 알려줄 수 있는 거죠.

물론 만능은 아니에요

이 접근에도 한계는 있어요. 첫째, 오탐이 있을 수 있어요. 의미가 비슷해 보여도 실제로는 미묘하게 달라야 하는 코드들이 있거든요. 예를 들어 결제 금액 검증과 포인트 금액 검증은 구조가 거의 같지만 하나로 합치면 안 되는 경우가 많죠. 그래서 도구가 보고한 결과는 결국 사람이 보고 판단해야 해요. 둘째, 임베딩 계산 비용이에요. 코드베이스가 크면 수천 개의 조각을 임베딩해야 하니 API 비용이나 로컬 연산 시간이 들고요. 셋째, 임계값 튜닝이 필요해요. 너무 낮추면 온갖 게 다 중복으로 나오고, 너무 높이면 놓치는 게 많아지거든요.

그래도 지금 시점에 의미 있는 도구예요

비슷한 결의 기술로는 Sourcegraph 같은 시맨틱 코드 검색이 있고, SonarQube 같은 정적 분석 플랫폼도 중복 탐지를 제공하지만 여전히 토큰 기반이 주류예요. 임베딩 기반 중복 탐지를 가볍게 CLI로 돌려볼 수 있게 만든 시도라는 점에서 slopo는 실험해볼 가치가 있어요. 특히 AI 에이전트에게 코드를 많이 맡기는 팀이라면, 주기적으로 돌려서 "AI가 또 바퀴를 재발명했는지" 점검하는 용도로 딱이고요. 리팩토링 대상을 찾을 때, 공통 유틸로 추출할 후보를 모을 때도 쓸 수 있겠죠. CI에 붙여서 새 PR이 기존 코드와 의미상 겹치면 경고를 주는 식의 활용도 상상해볼 수 있어요.

정리하면, "복붙 탐지의 시대에서 의미 중복 탐지의 시대로 넘어가는 신호탄" 같은 도구예요. 여러분 코드베이스에도 이름만 다른 쌍둥이 함수들, 분명히 있지 않나요? AI 도구를 쓰면서 중복 코드가 늘어난 경험이 있다면, 어떻게 관리하고 계신지 이야기 나눠봐요.


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://github.com/rafal-qa/slopo
SHARE
처리 중...