2023년 12월 08일
위 이미지는 AI가 생성한 이미지입니다.
최근에 새로운 프로젝트에 참여하면서 리팩토링을 진행했었습니다. 그런데 초기에 계획했던 시간보다 더 많은 시간이 소요되었습니다. 그래서 리팩토링을 한 이후에 시간이 지체된 원인을 분석했고, 리팩토링이 오래 걸렸던 원인 3가지를 발견하였습니다. 이번 글을 통해 원인을 바탕으로 리팩토링을 준비하는 3가지 방법을 공유하려고 합니다.
첫 번째는 리팩토링의 목표를 정하는 것입니다. 저는 한 컴포넌트에 1,500줄이 넘는 코드를 보면서 컴포넌트를 파악하는 것이 어려워 리팩토링을 하고자 했습니다. 그런데 막상 리팩토링을 시작하니 무엇을 수정할지 정하지 못하여 코드를 수정했다가 되돌리는 것을 반복하면서 시간을 허비했습니다.
이 과정에서 “왜?” 리팩토링을 하려고 했는지 생각을 해봤지만 구체적으로 떠오르는 이유가 없었습니다. 그래서 리팩토링을 하려는 이유를 바탕으로 구체적인 목표를 세우고자 했습니다. 한 컴포넌트에 1,500줄이 넘는 코드로 인해 새로운 기능 또는 기존 기능을 수정하는 작업의 시간이 많이 소요되었습니다. 그래서 리팩토링의 목표를 컴포넌트의 규모를 줄이고 가독성을 높이는 것으로 정했습니다.
하지만 목표를 정하는 것만으로는 부족했습니다. 목표를 달성하기 위해 어디서부터 어떻게 시작해야 할지 막막했습니다. 그래서 다음에 이야기할 계획 수립이 필요했습니다.
두 번째는 목표를 달성하기 위한 구체적인 계획을 세우는 것입니다. “컴포넌트의 규모를 줄여 가독성 높이기”라는 목표를 설정했지만 규모를 줄이는 방법과 가독성을 높이는 방법은 다양하기 때문에 “어떻게” 해야 할지 어려웠습니다. (목표를 조금 더 구체적으로 정하지 못한 문제도 있었던 것 같습니다.)
그래서 목표를 달성할 수 있는 방법들을 나열하고, 이 중에서 효과적인 방법들을 선택하여 단계별 목표를 정했습니다. 아래는 간략하게 몇몇 단계들을 나열한 것입니다.
위와 같이 단계 별로 목표를 세웠을 때 이전보다 빠르게 진행되었습니다. 또한 한 번에 많은 양의 리팩토링 결과물을 Git에 Commit하는 것보다 단계 별 결과물을 Commit했을 때 히스토리 파악하는 것이 쉬웠고, 리팩토링 전과 후에 다르게 동작하는 기능이 있을 때 원인을 빠르게 파악할 수 있었습니다.
하지만 리팩토링 전과 후에 기능이 동일하게 동작하지 않은 것들이 있어 원인을 분석하고 해결하는 일이 자주 생겨 시간이 지체되고 피로도가 쌓였습니다. 그래서 단계 별로 진행 중이던 리팩토링을 잠시 중단하고 테스트 코드를 작성하고자 했습니다.
세 번째는 테스트 코드를 작성하는 것입니다. 이번에 참여한 프로젝트는 특수하게 기능이 정리된 기획 문서가 없는 상황이었습니다. 이 부분이 리팩토링을 하기 전부터 가장 걱정되었던 점입니다. 왜냐하면 이미 사용자들이 사용하고 있는 상태에서 리팩토링 후에 이전에 정상적으로 동작하던 기능이 동작하지 않는다면 큰 문제가 될 수 있었기 때문입니다. (이전과 다르게 동작하는 것도 문제입니다.) 그래서 수정하려는 부분의 기능과 사이드 이펙트 등을 정리하면서 진행했습니다. 이로 인해 시간이 지체되었고 일일이 확인하는 것에 대한 한계가 있었습니다.
그래서 단위 테스트 코드를 작성했습니다. 특히 해당 프로젝트는 기획 문서가 존재하지 않았기 때문에 나중에 다른 개발자가 맡았을 때도 분명 초기에 코드를 파악하는 것이 어려울 것이라는 생각이 들었습니다. 그래서 어떤 조건에서 기능이 활성화되고, 이벤트가 발생했을 때 어떤 결과물이 표시되어야 하는지 등을 테스트 케이스로 만들어서 테스트 코드를 작성했습니다.
처음 테스트 코드를 작성해 보는 것이기 때문에 어려웠고 시간도 많이 소요되었지만 효과적이었습니다. 테스트 코드를 작성한 이후에는 기능을 하나씩 파악하지 않아도 됐기 때문에 빠르게 진행될 수 있었고 전체적으로 프로젝트를 빠르게 파악할 수 있었습니다.
처음에 리팩토링을 시작하면서 일주일 동안 작업했던 것을 되돌리기도 하며 어려운 점이 있었지만 위에서 이야기한 3가지를 준비한 이후부터 순조롭게 진행됐습니다. 그리고 이번에 리팩토링을 하면서 깨달은 부분들로 인해 규모에 상관없이 지속적으로 리팩토링을 하는 것을 두려워하지 않게 되었고, 오히려 코드가 조금씩 나아지는 것을 보면서 흥미를 느꼈습니다.