Learning
토픽 113 / 192·소프트웨어 표준과 법제도

Code Smell (코드 스멜)

Code Smell (코드 스멜)

코드에서 더 깊은 문제(설계 결함, 유지보수 어려움)를 암시하는 표면적인 징후로, 버그는 아니지만 리팩토링이 필요함을 나타내는 신호이며 Martin Fowler의 저서 "Refactoring"에서 체계화됨

목적: 잠재적 문제 조기 발견, 리팩토링 필요성 인식, 코드 품질 향상, 기술 부채 관리

특징: 버그 아님, 설계 문제 징후, 주관적 판단, 리팩토링 대상, 도구로 탐지 가능

대표적인 Code Smell

  • 긴 메서드(Long Method): 20줄 이상, 여러 책임, Extract Method로 해결
  • 큰 클래스(Large Class): 너무 많은 인스턴스 변수/메서드, Extract Class
  • 중복 코드(Duplicated Code): 동일 코드 반복, Extract Method/Template Method
  • 긴 매개변수 목록(Long Parameter List): 3개 이상, Parameter Object 도입
  • 산탄총 수술(Shotgun Surgery): 한 변경에 여러 클래스 수정 필요, Move Method
  • 기능 편애(Feature Envy): 다른 클래스 데이터에 더 관심, Move Method
  • 데이터 뭉치(Data Clumps): 함께 다니는 데이터 그룹, Extract Class
  • 기본 타입 집착(Primitive Obsession): 기본 타입 남용, Value Object 도입
  • Switch 문(Switch Statements): 복잡한 분기, 다형성으로 대체
  • 평행 상속(Parallel Inheritance): 한 클래스 추가 시 다른 클래스도 추가 필요
  • 게으른 클래스(Lazy Class): 하는 일 없는 클래스, Inline Class
  • 추측 일반화(Speculative Generality): 사용되지 않는 추상화, 제거

탐지 도구: SonarQube, PMD, FindBugs, ESLint, Pylint

장점: 문제 조기 발견, 리팩토링 가이드, 코드 품질 개선

단점: 주관적 판단, 맥락 의존, 과도한 적용 위험

비교: 코드 스멜(설계 징후/리팩토링 대상) vs 버그(기능 결함/수정 대상) vs 취약점(보안 결함/패치 대상)

연관: 리팩토링, 기술 부채, 정적 분석, SonarQube, Clean Code