반응형

1. 코드 속 악취 제거를 통한 코드 품질 향상, 리팩토링의 개요

1) 리팩토링(Refactoring)의 정의

Refactoring에서 정의한 바에 따르면,

리팩토링(Refactoring) 이란 *“소프트웨어의 외부 동작은 변경하지 않으면서 내부 구조를 개선하는 일련의 행위”*이다.

즉, 기능(Functional Behavior)은 유지하면서

  • 가독성(Readability)
  • 유지보수성(Maintainability)
  • 확장성(Extensibility)
  • 테스트 용이성(Testability)

을 향상시키는 구조적 개선 활동이다.

 

2) 리팩토링의 목적

구분 설명
가독성 향상 코드 이해 시간 단축
유지보수성 향상 변경 영향 범위 최소화
확장성 확보 신규 기능 추가 비용 절감
기술부채 감소 누적된 구조적 문제 해소
테스트 용이성 개선 단위 테스트 작성 및 자동화 수월

3) 코드 스멜(Code Smell)의 정의

Martin Fowler는 코드 스멜을 다음과 같이 정의하였다.

코드 스멜(Code Smell) 이란 “코드에 잠재된 구조적 문제를 암시하는 징후”이다.
  • 오류(Bug)는 아님
  • 설계상의 취약점 또는 유지보수 위험 신호
  • 방치할 경우 기술부채 증가

즉, 코드 스멜은 리팩토링의 트리거(trigger) 역할을 한다.

 

2. 리팩토링 개념과 주요 기법

1) 리팩토링 개념

리팩토링은 단순한 코드 정리가 아니라,

  • 객체지향 설계 원칙(SOLID)
  • 응집도(Cohesion) 향상
  • 결합도(Coupling) 감소
  • 책임 분리(SRP)

소프트웨어 공학 원칙 기반 구조 개선 활동이다.

 

2) 기능 추가 관점에서의 리팩토링 효과

리팩토링 전 리팩토링 후
기능 추가 시 기존 코드 수정 다수 발생 확장 포인트 명확
버그 발생 가능성 증가 변경 영향 범위 축소
테스트 어려움 모듈 단위 테스트 가능
복잡도 증가 구조 단순화

결론: 리팩토링은 “기능 추가 속도를 높이기 위한 선행 투자”이다.

3) 리팩토링 주요 기법

기법 설명 적용 대상
Extract Method 긴 메소드를 분리 긴 메소드
Extract Class 큰 클래스를 역할별 분리 큰 클래스
Rename Method 의미 명확화 가독성 저하
Move Method 적절한 클래스로 이동 Feature Envy
Introduce Parameter Object 매개변수 객체화 너무 많은 인수
Replace Primitive with Object 기본형을 객체화 Primitive Obsession
Inline Method 불필요한 위임 제거 과도한 추상화
Remove Duplicate Code 중복 제거 중복된 코드

3. 코드 스멜의 종류

분류 코드 스멜 설명 대표 리팩토링
구조적 문제 중복된 코드 (Duplicated Code) 동일 로직 반복 Extract Method
복잡도 문제 긴 메소드 (Long Method) 지나치게 긴 함수 Extract Method
응집도 저하 큰 클래스 (Large Class) 역할 과다 Extract Class
인터페이스 문제 너무 많은 인수 (Long Parameter List) 가독성 저하 Introduce Parameter Object
변경 취약 Divergent Class 변경 이유가 여러 개 Extract Class
변경 파급 Shotgun Surgery 작은 변경에 다수 수정 Move Method
객체 책임 위반 Feature Envy 다른 객체 데이터에 집착 Move Method
데이터 구조 문제 Data Clumps 항상 함께 전달되는 데이터 묶음 Introduce Parameter Object
설계 미성숙 Primitive Obsession 기본형 과도 사용 Replace Primitive with Object

코드 스멜 관계 개념도

Code Smell  관계도

4. Refactoring vs Re-Engineering 비교

구분 Refactoring Re-Engineering
목적 내부 구조 개선 시스템 전면 재구성
기능 변경 없음 가능
범위 모듈/클래스 단위 시스템 단위
위험도 낮음 높음
비용 상대적 저비용 고비용
적용 시점 지속적 시스템 노후화 시

핵심 차이: Refactoring은 점진적 개선, Re-Engineering은 근본적 재구축이다.

 

5. Refactoring 고려사항

1) 테스트 코드 선행 확보

  • 자동화 테스트 없이는 위험
  • 리팩토링 = 테스트 기반 활동

2) 작은 단위로 수행

  • Atomic Refactoring
  • Commit 단위 최소화

3) CI/CD 환경 활용

  • 정적 분석(SonarQube 등)
  • 코드 커버리지 관리

4) 과도한 리팩토링 주의

  • YAGNI 원칙 고려
  • 기능 요구사항 우선

5) 팀 차원의 합의 필요

  • 코딩 컨벤션 통일
  • 설계 원칙 공유

 

결론

코드 스멜은 설계 붕괴의 초기 신호이며, 리팩토링은 지속 가능한 소프트웨어 개발을 위한 구조적 치료 행위이다.

  • 애자일 개발
  • 지속적 통합(CI)
  • 테스트 주도 개발(TDD)

환경에서 리팩토링은 선택이 아닌 필수 전략이다.

 

📚 출처

  1. Martin Fowler, Refactoring: Improving the Design of Existing Code, Addison-Wesley, 1999
  2. Clean Code – Robert C. Martin
  3. Working Effectively with Legacy Code – Michael Feathers
  4. IEEE Software Engineering Body of Knowledge (SWEBOK)
반응형

+ Recent posts