SmellBench: Towards Fine-Grained Evaluation of Code Agents on Refactoring Tasks
이 논문은 실제 코드 스멜(code smells)을 주입하여 리팩토링 작업에 대한 코드 에이전트를 평가하도록 설계된 새로운 벤치마크인 SmellBench를 소개하며, 현재 최고 성능을 보이는 모델들이 파일 간 이해도 측면에서 어려움을 겪고 이러한 유지보수성 문제를 제거하는 데 중간 정도의 성공만을 거둔다는 점을 밝힙니다.
원본 논문은 CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기
큰 그림: "지저분한 방" 문제
여러분에게 코드를 작성하고, 버그를 고치고, 파일을 정리할 수 있는 매우 똑똑한 로봇 비서(코드 에이전트)가 있다고 상상해 보세요. 여러분은 이 로봇에게 지저한 방을 치워달라고(코드 리팩토링) 요청합니다.
대부분의 로봇 테스트는 단지 이렇게만 묻습니다: "의자를 문을 통과할 수 있게 옮겼니?" 만약 로봇이 의자를 옮겨서 사람이 지나갈 수 있게 되었다면, 테스트는 "통과!"라고 말합니다.
하지만 이 논문은 이것만으로는 충분하지 않다고 주장합니다. 로봇이 의자를 옮렸을지는 모르지만, 그 과정에서 램프를 넘어뜨리거나, 바닥에 옷더미를 남기거나, 창문을 가로막았을 수도 있기 때문입니다. 방은 작동하지만(사람이 지나갈 수는 있지만), 장기적으로 살기에는 엉망진 상태인 것이죠. 개발자들은 이것을 **"코드 스멜(Code Smells)"**이라고 부릅니다. 즉, 오늘은 작동하지만 내일은 골칫덩이가 될 수 있는 투박하고, 지저분하거나, 조직이 엉망인 코드를 말합니다.
SmellBench는 이러한 AI 로봇들이 단순히 문을 열어두는 것을 넘어, 상황을 더 악화시키지 않고 실제로 방을 제대로 치울 수 있는지 확인하기 위해 설계된 새로운 테스트입니다.
테스트 구축 방법 (The "Controlled Mess" Factory)
연구진은 현실 세계에서 지저분한 코드의 사례를 찾는 것이 마치 해변에서 특정 모래알 하나를 찾는 것만큼 어렵다는 것을 깨달았습니다. 찾기도 힘들 뿐만 아니라, 그 지저분함이 다른 요소들(새로운 기능 추가나 버그 수정 등)과 뒤섞여 있기 때문입니다.
그래서 그들은 완벽하게 통제된 지저분함을 만들어내는 공장을 세웠습니다:
- 깨끗한 방: 그들은 먼저 7개의 유명하고 깨끗하며 잘 조직된 파이썬 프로젝트(예:
pandas또는numpy)에서 시작했습니다. 이것들은 아주 깔끔하고 완벽하게 정리된 라이브러리라고 생각하면 됩니다. - 스멜 주입: 자연스럽게 지저분해지기를 기다리는 대신, AI를 사용하여 의도적으로 코드를 망가뜨렸습니다. 그들은 7가지 특정 유형의 "스멜"을 주입했습니다 (예: 너무 많은 일을 하려고 하는 "God Class"나 사용되지 않는 "Dead Code").
- 정답지(Ground Truth): 그들이 직접 지저분하게 만들었기 때문에, 코드가 망가지기 전의 깨끗한 버전이 어떤 모습이었는지 정확히 알고 있습니다. 이것이 그들의 "정답지"가 됩니다.
결과: 쉬움부터 매우 어려움까지, 7가지 서로 다른 유형의 코드 추함(ugliness)을 다루는 294개의 구체적인 "지저분한" 시나리오 데이터셋이 만들어졌습니다.
7가지 "코드 스멜" 유형 (지저분한 방 시나리오)
이 논문은 코드가 지저분해지는 7가지 방식에 초점을 맞춥니다. 이를 일상생활로 번역하면 다음과 같습니다:
- 특성 탐닉 (Feature Envy): 자신의 도구를 사용하는 대신 끊임없이 이웃집 물건을 빌려 쓰는 사람. 비유: 집에 공구가 있는데도 불구하고, 이웃의 망치를 계속 빌려 쓰는 상황.
- 갓 클래스 (God Classes): 회사의 모든 직무(요리, 회계, 보안, 인사 등)를 혼자서 다 하려는 한 명의 사람. 비유: 배관 수리, 수학 가르치기, 빵 굽기를 동시에 수행하려는 한 명의 청소부.
- 데이터 뭉치 (Data Clumps): 키, 지갑, 휴대폰 같은 아이템들을 필요할 때마다 매번 함께 들고 다니는 것. 비比: 전구를 갈기 위해서도 공구 상자 전체를 들고 다니는 상황.
- 산탄총 수술 (Shotgun Surgery): 벽지 색깔 같은 작은 것 하나를 바꾸고 싶은데, 그 때문에 10개의 다른 방을 돌아다녀야 하는 상황. 비유: 제품 가격을 바꾸기 위해 영수증, 웹사이트, 인보이스, 배송 라벨을 각각 따로 업데이트해야 하는 상황.
- 죽은 코드 (Dead Code): 방 안에 있지만 아무도 앉거나 사용하지 않는 가구. 비유: 10년 전에 읽고 다시는 손대지 않는 책들로 가득 찬 책장.
- 인터페이스 분리 (Interface Segregation): 리모컨에 버튼이 50개나 있지만, 실제로는 3개만 사용하는 상황. 비유: 물 한 잔을 마시기 위해 스테이크, 샐러드, 디저트를 모두 주문해야만 하는 식당 메뉴.
- 깊은 인라이닝 (Deep Inlining): 레시피에 "1단계를 하세요. 1단계란 2단계를 의미하며, 2단계란 3단계를 의미합니다..."라고 한 문단에 길게 적혀 있는 것. 비유: 경로 안내 안에 또 경로 안내가 들어있어서 따라가기가 불가능한 지도.
실험: 로봇은 청소를 할 수 있을까?
연구진은 이 지저분한 코드 조각들을 6개의 서로 다른 "두뇌"(Claude, GPT, DeepSeek와 같은 대규모 언어 모델)를 탑재한 2개의 인기 있는 AI 에이전트(OpenHands 및 Qwen Code)에게 주었습니다.
규칙:
- AI는 지저분한 부분을 찾아내야 합니다.
- AI는 그 지저분한 부분을 고쳐야 합니다.
- AI는 코드가 여전히 작동하는지(테스트를 통과하는지) 확인해야 합니다.
결과 (충격적인 부분):
최고의 조합인 AI(Qwen Code + Claude Sonnet 4.5)조차 스멜을 제거하는 점수가 **50.34%**에 불-과했습니다.
- "문" 테스트 (기능적 정확성): 로봇들은 이 부분에 강했습니다. 대부분의 경우 "문을 열린 상태로" 유지했습니다(코드가 여전히 실행됨). 그들은 80~90%의 확률로 기본 테스트를 통과했습니다.
- "깨끗한 방" 테스트 (리팩토링 품질): 로봇들은 여기서 실패했습니다. 그들은 당장의 문제는 해결했을지 모르지만, 방을 여전히 지저분하게 남겨두었습니다. 특히 여러 파일이 얽힌 문제(예: "산탄총 수술" 스멜)가 발생했을 때 전체적인 그림을 보는 데 어려움을 겪었습니다.
핵-심 발견: AI는 코드를 작동하게 만드는 데는 뛰어나지만, 코드를 아름답고 유지보수 가능하게 만드는 데는 현재 부족합니다.
이것이 왜 중요한가
이 논문은 우리가 단순히 AI에게 "코드가 실행되는가?"라고 물어서는 안 된다고 결론짓습니다. 대신 "코드가 깨끗한가?"라고 물어야 합니다.
연구진은 다음 사항들을 기준으로 AI를 평가하는 새로운 방식인 "판사 AI(Judge AI)"를 도입했습니다:
- 테스트를 통과했는가? (문이 열리는가?)
- 고칠 위치를 제대로 찾았는가? (제대로 된 방을 보았는가?)
- 실제로 코드가 더 좋아졌는가? (방이 정돈되었는가?)
결론적으로, 현재의 AI 에이전트들은 가구는 옮길 줄 알지만 먼지를 남기고 다니는 열정적인 인턴과 같습니다. 점점 나아지고는 있지만, 복잡한 소프트웨어 시스템을 전문적으로 "리팩토링(청소)"할 수 있을 만큼 신뢰받기까지는 아직 갈 길이 멉니다.
연구 분야의 논문에 파묻히고 계신가요?
연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.