1. 개요
요구사항에서 정의되는 기능(function)을 변경하지 않으면서, 해당 기능을 구현하는 코드와 구조를 수정하는 행위, 또는 그러한 작업.2. 종류
- 리네임(rename): 특정 식별자를 코드 구조를 해치지 않고 일괄적으로 수정하는 리팩토링.
- 추상화: parametrization, trait extraction 등을 통해 구체적으로 존재하는 기능과 속성의 집합을 더 적고(=순수하고) 독립적인 상위 특성으로 분리하는 리팩토링. 특히 제네릭, 상속 등이 있다면 추상화가 간편해진다.
- 모듈화
- 죽은 코드 제거(dead code elimination): 제품의 난잡한 개발로 인해 신규 기능 목적으로 개발한 코드가 쓰이지 않게 되거나, 이전의 리팩토링으로 인해 쓸모가 없어졌거나, 코드베이스를 복잡하게 병합하면서 발생한 쓰이지 않고, 쓰이지 않을 코드가 부분적으로 남거나 이곳저곳에 흩어져 있는 경우.
- 개별 UI의 디자인 시스템화
- 도메인, 코어 로직 분리: 특히 UI나 컨트롤러 수준에 핵심적인 로직이 과다하게 집중되어 있을 경우, 재사용성이 떨어지고 스파게티 코드가 되기 십상이므로 종속 도메인을 재정의하고 코드를 분리하는 과정이 필요하다.
- 중복 API 병합 또는 분리: 외부(surface)로 노출된 API를 개발할 때, 레거시 API를 수정하지 않고 시간에 따라 매번 새 기능에 맞게 새 API를 추가하기만 했다면, 동일한 동작에 부여되는 종속 관계가 분할되고 부풀려져(bloat) 레거시를 걷어내기 어렵게 만든다. 이 또한 리팩토링을 통해 중복된 API를 통합하거나 개편하고, 레거시 API를 걷어내는 것이 좋다.
- 스택 전환: 가장 실패하기 쉬운 유형의 리팩토링. 주로 레거시 스택의 생산성 저하, 이해도 및 채용 인력의 부재 등이 원인이 되지만, 일정 산출에 실패하면 시간만 낭비하고 다시 레거시로 돌아가게 된다.
- 언어 전환
- 프레임워크 전환
- 비권장 기능 사용 제거: 흔히 deprecated되었다고 부르는, 외부 종속성이나 API가 어떠한 이유로 사용이 비권장되었을 경우, 이를 사용하는 것이 당장은 문제가 되지는 않으나 장기적으로 보면 기술적 부채에 해당하므로, 시간을 들여 제거하거나 적절한 권장사항으로 대체하는 것이 좋다.
- 엔티티 리팩토링: 스키마 리팩토링이라고도 한다. 데이터베이스 관리 시스템을 장기간 운용하며 생긴 중복된 기능, 쿼리 성능 저하를 발생시키는 테이블 및 관계 구조 등을 개선하고 재설계하는 작업으로, 데이터베이스 구조를 바꾸는 것은 이전에 저장된 모든 데이터들에도 영향이 미칠 수 있고 따라서 마이그레이션을 필요로 하기에, 이 또한 대규모 리팩토링에 포함된다.
- 소스 통합: 같은 기능이나 결과를 유도하는 출처(source)가 하나로 관리되지 않고 여러 군데에서 개별적으로 관리되고 있을 경우, 이를 통합해 단 하나의 원출처(single-source-of-truth)가 다른 여러 중간 데이터와 결과들을 파생 및 유도하도록 만드는 리팩토링. 모델링 영역에서는 생성 유도의 방향에 따라 schema-first냐 code-first냐로 나뉜다.
- 난독화: 주로 인터프리터 언어에서 사용되는 방법으로, 코드를 사람이 읽기 어렵게 하여 유출 시를 대비하는 것이다.
3. 주의
리팩토링은 엔드 제품(end product)의 기능을 전혀 추가하거나 개선하지 못하기 때문에, 리팩토링만 반복하는 것은 제품 출시에 큰 지장이 될 수 있다.특히나 피해야 하는 상황은 스택 전환 같이 큰 규모의 리팩토링을 진행했다가 준비 부족으로 실패하는 경우로, 이 경우 PM쪽은 개발 기간이 낭비된 것에 책임을 져야 하고, 새 스택 도입을 찬성했던 개발자들은 레거시로 돌아가야 하는 아쉬움을, 기존 스택 유지를 찬성했던 개발자들은 새 스택 도입을 위해 배운 지식과 투자한 시간이 물거품이 되게 된다.
리팩토링은 근본적으로 제품 내부 구조와 아키텍처에 접근 가능한 개발자의 시점에서 이루어지는 것이고, 큰 규모의 리팩토링을 진행할 때는 이 작업이 반드시 필요한지, DX를 비약적으로 향상시키는지, 레거시 코드에 대한 현실적인 workaround는 없는지, 내 취향이나 사심이 들어간 것은 아닌지 검토해야 한다.