IT Study/SW 공학 및 개발방법론

🧾 리팩토링의 목적과 적용 시점, 코드 스멜의 종류

cs_bot 2025. 4. 8. 12:52

1. 리팩토링(Refactoring)의 개요

  • 리팩토링이란 소프트웨어의 외부 동작은 변경하지 않으면서 내부 구조를 개선하는 일련의 코드 수정 행위
  • 기능 변경 없이 유지보수성, 가독성, 확장성 등의 비기능적 품질 향상을 추구함
  • 주요 목적은 중복 제거, 응집도 증가, 결합도 감소를 통한 코드의 품질 개선임

2. 리팩토링의 목적

유지보수성 향상

  • 코드 구조를 명확하게 하여 수정 및 확장의 용이성 확보
  • 신규 개발자도 빠르게 코드 파악 가능

가독성 및 이해도 향상

  • 함수 분할, 명확한 네이밍 등을 통해 코드의 의도 전달력 향상

버그 발생 가능성 감소

  • 중복된 로직 제거 및 불명확한 흐름 개선을 통해 잠재적 오류 방지

개발 생산성 향상

  • 테스트 용이성 증가 및 코드 재사용성 확보를 통해 개발 시간 단축

기능 추가의 용이성 확보

  • 변경에 강한 구조로 개선함으로써 신기능 추가 시 안정성 확보 가능

기술 부채 해소

  • 급하게 작성된 코드, 과거 설계의 한계를 해소하여 장기적 품질 유지

3. 리팩토링의 적용 시점

코드 변경 이전(사전 리팩토링)

  • 새로운 기능을 추가하기 전, 기존 구조가 확장에 적합하지 않을 때 적용
  • 설계 유연성 확보 후 기능 추가 수행

코드 변경 중간(동시 리팩토링)

  • 기능 개발 중 발견되는 비효율적 구조를 동시에 개선
  • 반복적 코드 개선과 개발을 병행하여 품질 관리

코드 변경 이후(사후 리팩토링)

  • 기능 구현 후 전체 코드 리뷰 과정에서 개선점 발견 시 적용
  • 성능 이슈나 협업 개발자의 이해도 저하를 방지하기 위한 후속 조치

테스트 코드가 충분히 확보된 시점

  • 외부 기능 변경 없이 구조 개선이 가능하려면 자동화된 테스트 필요
  • 테스트 케이스 부재 시 리팩토링 후 기능 손상 가능성 존재

CI/CD 과정에서 정기적으로 수행

  • 빌드 및 배포 파이프라인에 정기 리팩토링 점검을 포함시키는 추세
  • 품질 저하를 방지하고 기술 부채의 누적을 사전에 억제

4. 코드 스멜(Code Smell)의 개요

  • 코드 내부에 존재하는 나쁜 냄새(구조적 결함)의 메타포
  • 즉각적인 오류는 없으나 유지보수 및 확장의 장애 요인으로 작용
  • 리팩토링이 필요한 대표적 신호로 간주됨

5. 코드 스멜의 주요 종류

Duplicated Code (중복 코드)

  • 동일하거나 유사한 코드가 여러 위치에 존재
  • 수정 시 일관성 문제 발생 및 오류 유발 가능

Long Method (너무 긴 함수)

  • 하나의 함수가 너무 많은 일을 담당하고 있어 가독성 저하
  • 분할 및 함수 추출 기법으로 해결 필요

Large Class (너무 많은 책임을 가진 클래스)

  • 클래스가 과도하게 많은 필드와 메서드를 가짐
  • SRP(Single Responsibility Principle) 위배 사례

Feature Envy (다른 클래스 기능에 의존)

  • 특정 클래스가 다른 클래스의 필드나 메서드에 과도한 접근을 시도
  • 적절한 책임 분리 미비

Data Clumps (항상 같이 다니는 데이터 그룹)

  • 반복적으로 묶여 전달되는 데이터 세트
  • 객체 또는 Value Object로 추출하는 것이 바람직

Primitive Obsession (원시 타입 집착)

  • 단순 데이터 타입을 남용하여 복잡한 로직을 처리
  • 도메인 개념에 맞는 클래스로 캡슐화 필요

Switch Statements (과도한 조건문)

  • 동일 조건 분기를 여러 클래스에서 반복적으로 수행
  • 다형성을 활용한 객체 지향적 해결 권장

Speculative Generality (불필요한 일반화)

  • 향후 확장을 고려한 과도한 추상화
  • 실제 사용되지 않는 인터페이스나 추상 클래스가 많음

Lazy Class (게으른 클래스)

  • 정의된 클래스가 충분한 책임을 갖지 않음
  • 기능을 다른 클래스로 통합하여 간소화 가능

Temporary Field (임시 필드)

  • 특정 조건에서만 사용되는 필드가 클래스에 상주
  • 메서드 또는 임시 객체로 대체 필요

6. 리팩토링 기법 예시

  • Extract Method: 긴 메서드를 목적별로 분리
  • Rename Variable: 변수 명확성 제고
  • Move Method/Field: 책임이 적절하지 않은 경우 위치 조정
  • Inline Method: 과도한 위임 제거
  • Replace Magic Number with Symbolic Constant: 가독성과 유지보수성 향상
  • Encapsulate Field: 직접 접근 대신 getter/setter 활용

7. 결론

  • 리팩토링은 소프트웨어 품질을 장기적으로 유지하기 위한 핵심 개발 활동
  • 코드 스멜은 리팩토링의 필요성을 직관적으로 알려주는 지표
  • 체계적인 코드 리뷰, 테스트 기반 리팩토링, 지속적 개선 문화가 병행될 때 효과적으로 작동함