반응형
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 |
코드 스멜 관계 개념도

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)
환경에서 리팩토링은 선택이 아닌 필수 전략이다.
📚 출처
- Martin Fowler, Refactoring: Improving the Design of Existing Code, Addison-Wesley, 1999
- Clean Code – Robert C. Martin
- Working Effectively with Legacy Code – Michael Feathers
- IEEE Software Engineering Body of Knowledge (SWEBOK)
반응형
'정보관리기술사 > SW공학' 카테고리의 다른 글
| DDD(Domain Driven Development) (0) | 2026.03.04 |
|---|---|
| ITSM(Information Technology Service Management) (0) | 2026.03.03 |
| CMMI (Capability Maturity Model Integration) (0) | 2026.03.03 |
| ISO/IEC 12207 (Software Life Cycle Processes) (0) | 2026.02.26 |
| SLM(Service Level Management) (0) | 2026.02.25 |