리팩터링(refactoring)이란?
리팩터링(refactoring)은 소프트웨어 공학에서 '결과의 변경 없이 코드의 구조를 재조정함'을 뜻한다. 주로 가독성을 높이고 유지보수를 편하게 한다. 버그를 없애거나 새로운 기능을 추가하는 행위는 아니다. 사용자가 보는 외부 화면은 그대로 두면서 내부 논리나 구조를 바꾸고 개선하는 유지보수 행위이다.
리팩터링의 잠재적인 목표는 소프트웨어의 설계, 구조 및 구현을 개선하는 동시에 소프트웨어의 기능을 보존하는 것이다. 리펙터링은 코드의 가독성을 향상시키고 복잡성을 감소시키는 효과를 가지며, 이러한 이점은 소스 코드의 유지 보수성을 개선하고 확장성을 개선하기 위해 더 단순하고, 깔끔하거나, 표현력이 뛰어난 내부 아키텍처 또는 객체 모델을 만들 수 있게 한다. 그리고 소프트웨어 엔지니어는 더 빠르게 수행되거나 더 적은 메모리를 사용하는 프로그램을 작성해야 하는 지속적인 과제에 직면해 있기에 성능 향상이 리팩터링의 또다른 목표가 된다.
일반적으로 리팩터링은 일련의 표준화된 기본 마이크로 리팩터링을 적용하는데, 각 리팩터는 소프트웨어의 동작을 보존하거나 최소한 기능적 요건에 대한 준수를 수정하지 않는 컴퓨터 프로그램의 소스 코드의 작은 변화이다. 많은 개발 환경에서 이러한 기본 리팩터링의 기계적 측면을 수행하기 위한 자동 지원을 제공한다. 코드 리팩터링을 잘 수행하면 소프트웨어 개발자가 기본 논리를 단순화하고 불필요한 수준의 복잡성을 제거하여 시스템의 숨겨진 또는 유휴 버그나 취약성을 발견하고 해결하는 데 도움이 될 수 있다. 그러나 잘못 수행되면 외부 기능을 변경하지 않거나 새로운 버그를 도입하거나 둘 다에 대한 요구 사항을 충족하지 못할 수 있다.
마틴 파울러의 저서 《리팩토링》에 다양한 리팩터링 패턴들이 정리되어 있다. 그중 대표적인 것 몇 가지를 들자면, 필드 은닉, 메서드 추출, 타입 일반화, 메서드 이름 변경 등이 있다.
https://ko.wikipedia.org/wiki/%EB%A6%AC%ED%8C%A9%ED%84%B0%EB%A7%81
위키백과, 우리 모두의 백과사전.
리팩터링은 기존 코드를 변경하지 않으면서 코드의 구조와 디자인을 개선하는 과정입니다.
이는 코드의 가독성, 유지보수성, 확장성을 향상시키고, 버그를 줄이는 등의 목적을 가지며, 기존의 코드를 재작성하는 것보다 효율적이고 안정적입니다.
리팩터링은 프로그램의 요구사항이 변경될 때, 코드의 기능을 추가하거나 수정해야 할 때, 협업 과정에서 코드를 다른 개발자와 공유해야 할 때 등에 유용합니다.
이를 통해 코드의 유지보수성을 높이고, 코드의 복잡도를 낮추어 프로그램을 보다 쉽게 이해하고 수정할 수 있도록 합니다.
리팩터링은 다양한 기법들이 존재하며, 일반적으로는 코드의 중복을 제거하거나, 메서드의 크기를 줄이거나, 변수명을 변경하거나, 클래스를 분리하거나, 인터페이스를 정리하거나, 새로운 메서드를 추가하거나 하는 작업 등이 포함됩니다.
리팩터링의 핵심은 코드를 재작성하는 것이 아니라 기존의 코드를 조심스럽게 개선하는 것입니다.
따라서 코드를 수정할 때는 항상 기존의 코드와 동일한 동작을 보장해야 하며, 테스트 코드를 작성하여 변경 사항이 코드에 영향을 미치지 않도록 하는 것이 좋습니다.
마틴 파울러의 저서 《리팩터링》에서는 "코드에서 나는 악취" 라고 표현하고 해결 방법을 제시하고 있습니다.
기이한 이름(Mysterious Name)
중복 코드
긴 함수
긴 매개변수 목록
전역 데이터
가변 데이터
뒤엉킨 변경
산탄총 수술
기능 편애
데이터 뭉치
기본형 집착
반복되는 switch문
반복문
성의 없는 요소
추측성 일반화
임시 필드
메시지 체인
중개자
내부자 거래
거대한 클래스
서로 다른 인터페이스의 대안 클래스들
데이터 클래스
상속 포기
주석