리팩터링, Refactoring
지속적인 리팩토링
은 코드 품질을 향상시키는 효과적인 수단이다. 하지만 리팩토링
을 하는 것은 단순히 문제를 해결하는 것보다 더 많은 능력이 요구된다.
- 코드를
리팩터링
할 때에는 코드의나쁜냄새
와설계결함
에 대한 통찰력을 기반으로설계원칙
,디자인패턴
,코딩규칙
등을 합리적으로 능숙하게 사용해야한다. - 효율적인
리팩터링
을 진행하기 위해서는왜(Why, 목적)
리팩터링을 해야하는지,무엇(What, 대상)
을 리팩터링 해야하는지,언제(When, 시기)
리팩터링을 해야하는지,어떻게(How, 방법)
리팩터링을 해야하는지 을 알아야한다.
리팩터링의 목적
마틴 파울러가 정의한 리팩토링은 다음과 같다.
- 리팩터링은 코드에 대한 이해를 쉽게 하기 위해 소프트웨어의 내부 구조를 개선하는 것으로, 소프트웨어의
외부동작
을 변경하지 않고 수정 비용을 줄이는 것을 목적으로 한다.
마틴 파울러가 제시한 리팩토링에서의 "외부동작을 변경하지 않는다.
" 에서의 외부는 상대적
임음 알아야 한다.
함수
를 리팩터링한다면,함수의 정의
가 외부적인 동작에 해당하며,클래스 라이브러리
를 리팩터링한다면 클래스 라이브러리에 의해노출된 API 나 메서드
가 외부적인 동작에 해당한다.
따라서 리팩터링은 코드품질
을 보장하는 효과적인 수단이며 코드 품질 저하를 효과적으로 방지할 수 있다.
- 프로젝트의 유지 보수 비용이 새로운 코드를 작성하는 것보다 많이 든다면, 해당 코드는 리팩토링하기 늦은 코드이다.
- 기술의 업데이트, 요구 사항의 변경, 인력 리소스의 이동에 따라 코드 품질이 저하되는 것을 방지한다.
- 제품이 업그레이드되고 프로젝트가 진행되어 시스템이 발전하면 코드 리팩터링은 불가피한 작업이다.
- 일시적으로 불완전한 설계를 덮을 수 있는 과도한 설계를 피하는 효과적인 방법이다.
뿐만아니라 리팩토링을 하는 것은, 코딩규칙
과 같은 이론적 지식 뿐만아니라 설계원칙
과 디자인패턴
을 응용해 볼 수 있는 중요한 기회가 될 수 있다.
- 리팩토링을 통해 소프트웨어 엔지니어의 코딩 능력을 측정하는 중요한 수단이 될 수 있다.
- 수석 소프트웨어 엔지니어는 코드의 품질을 책임지며, 적시에 코드에서 문제를 찾고, 목표를 가지고 코드를 리팩터링하며, 항상 코드 품질을 보증 관리한다.
리팩터링의 대상
리팩토링은 규모에 따라 대규모 고수준
의 리팩토링과 소규모 저수준
의 리팩토링으로 나눠진다.
대규모 리팩터링
시스템
, 모듈
, 코드구조
, 클래스 간 관계
의 리팩토링을 포함하여 최상위 코드설계
를 리팩토링 하는 것을 말한다.
- 코드 변경이 많고 영향이 크기 때문에 작업이 어렵고 시간이 많이걸리며, 버그가 발생할 위험이 크다.
- 설계원칙과 디자인 패턴을 활용한다.
- 계층화, 모듈화, 분리, 재사용 가능한 구성요소 추상화를 통해 진행한다.
소규모 리팩터링
표준 명명
, 표준 주석
, 초대형 클래스
와 함수제거
, 중복 코드 추출
과 같이 주로 클래스, 함수, 변수 수준에서 코드 세부 정보를 리팩토링한다.
- 주로 코딩 규칙을 통해 이뤄진다.
- 수정이 집중적으로 이뤄지며, 프로세스가 간단하고, 조작성이 강하며, 소요 시간이 짦고, 버그가 발생할 위험이 낮다.
리팩터링의 시기
간혹 리팩터링 을 코드가 이미 망가진 후에 해야하는 것으로 생각하는 사람이 있는데, 이것은 잘못된 것 이다. 코드를 유지 관리하기 어려움이 있고, 버그가 빈번하게 발생하는 등 심각한 문제가 있다면 리팩터링 하기에는 너무 늦었다고 볼 수 있다.
- 코드가 이미 망가진 후에 모든 문제를 한꺼번에 해결하려는수단으로 리팩터링을 사용하는 것이 아닌, 지소 가능하고 진화적인 리팩터링 계획을 탐구해야 한다.
- 단위 테스트와 코드 리뷰를 개발의 일부로 취급해야한다.
리팩터링의 방법
리팩터링의 방법은 어떤종류의 리팩터링(대규모
혹은 소규모
)이냐에 따라 다르게 접근해야 한다.
대규모 리팩터링
대규모 리팩터링은 많은 양의 코드수정을 수반하며, 기존의 코드의 품질이 좋지 않을 가능성이 높다. 코드를 변경할 때, 전체에 영향을 줄 것이며(높은 결합도) 이로인해 코드를 많이 리팩터링할 수록 문제가 많아져 짧은 시간에 리팩터링을 완료하지 못하고 새로운 비즈니스 개발일정과 리팩터링 일정이 충돌 할 수 있다. 그리고 결국 리팩터링이 완료되지 못할 가능성이 높다.
- 대규모 리팩터링를 수행할 때에는 사전에 종합적인 리팩터링 계획을 수립해, 질서 있고 단계적으로 진행해야 한다.
- 코드 저장소의 코드가 항상 실행 가능한 상태가 되도록 한다.
- 리팩터링의 각 단계에서 리팩터링의 영향을 받는 코드의 범위를 제어하고 기존 코드와의 호환성을 고려하고 필요할 때 호환성을 달성하기 위해 변경 코드를 제공해야한다.
소규모 리팩터링
소규모 리팩터링은 영향을 미치는 범위가 작고, 변경 사항이 적기 때문에 원한다면 시간이 있을 때마다 소규모 리팩터링을 할 수 있다.
- 코드품질 문제를찾는 방법외에도 코드 분석 도구(Checkstyle, FindBugs, PMD 등) 을 활용하여 코드의 문제를 자동으로 찾고 해당 부분을 리팩터링 할 수 있다.
'개인공부' 카테고리의 다른 글
[ 개인공부 ] 코드 설계 원칙, 데메테르의 법칙, LoD (0) | 2023.11.02 |
---|---|
[ 개인공부 ] 코드설계원칙, KISS 원칙에 관하여 (0) | 2023.11.01 |
[ 개인공부 ] DRY 원칙 (0) | 2023.10.25 |
[ 개인 공부 ]단위테스트에 관하여 (0) | 2023.10.23 |
[ 코드 설계 ] 의존성 역전 원칙 과 의존성 주입 프레임 워크 (0) | 2023.10.06 |