토비님께서 리팩터링 읽기 모임을 진행하신다는 얘기를 들었습니다.
사놓고 끝까지 읽지 못했던 리팩터링을 완독할 좋은 기회라고 생각하여 참여하게 되었습니다.
바쁘신 분들은 아래 3줄 요약만 읽고 가셔도 좋습니다.
코드를 확인하고 싶으신 분들은 GitHub를 참고해주세요.
3줄 요약
- Refactoring 1장에서 보여주는 예시를 자바로 재현했다.
- 언어적 차이와 설계 패턴의 차이로 인해 어려움을 느꼈다.
- 그 덕분에 단계를 분리하는 것이 왜 중요한지 더 깊이 고민할 수 있었다.
마틴 파울러의 Refactoring 1장에서는 소규모 예시 코드를 통해
“테스트 코드 작성, 함수 쪼개기, 계산 단계와 포맷팅 단계 분리, 다형성 활용” 같은 리팩터링 기법을
순차적으로 적용하는 모습을 시연합니다.
저는 이 예시 코드를 자바로 재현해보면서 다음 과정을 거쳤습니다.
- 테스트 코드 만들기 (1.3절)
- 함수 쪼개기 (1.4절)
- 단계 쪼개기 (1.6절)
- 다형성 활용하기 (1.8절)
언어적 차이와 설계 패턴의 차이로 인해 책에서 시연하는 리팩터링 과정을 그대로 따라가기는 쉽지 않았습니다.
특히 3단계(1.6절)에서 계산 단계와 포맷팅 단계를 분리하기 위해
enrichPerfomance 함수를 사용하는 순간엔, 이걸 자바로 어떻게 구현해야하나 막막하게 느껴졌습니다.
책에서 원래 예시 코드의 사용 언어는 자바스크립트입니다.
자바스크립트는 동적 타입 언어이므로, 런타임에 객체 구조(필드)를 임의로 추가하거나 삭제하는 게 비교적 자연스럽습니다.
반면에 자바는 정적 타입 언어라서 동일한 접근 방식을 그대로 구현하기는 쉽지 않습니다.
게다가 자바 개발자들이 익숙하게 사용하는 MVC 패턴과도 전혀 다른 형태로 코드가 전개되었습니다.
당연히 마틴 파울러가 MVC 패턴을 몰라서 이런 식으로 리팩터링한 것은 절대 아닐 겁니다.
단지 자바스크립트라는 언어의 특성을 최대한 살리고,
예제의 핵심 아이디어를 직관적으로 보여주기 위해 이런 구조를 택했을 뿐입니다.
그래서, 이러한 언어와 패턴의 차이를 극복하기 위해 여러가지 방법을 고민했습니다.
그러는 동안에 전체 리팩터링 과정 중 개발자의 의도가 가장 깊게 관여하는 부분은
‘단계 쪼개기(1.6)’라는 것을 깨닫게 되었습니다.
enrichPerfomance 함수를 사용하는 순간의 선택은 언뜻 보면 작은 변화처럼 보였지만,
실제로는 이후 코드 전체 구조를 좌우하는 매우 중요한 결정이었기 때문입니다.
“함수 쪼개기”나 “다형성 활용” 같은 리팩터링 기법들은 비교적 정형화된 접근 방법이 많아서,
LLM(대규모 언어 모델) 등의 툴을 통해 어느 정도 만족스러운 결과를 받을 수 있습니다.
그러나 ‘계산 로직과 포맷팅 로직을 어떻게 구분할 것인가’,
‘어디서부터 어디까지를 하나의 단계로 볼 것인가’와 같은 결정엔
단순한 코드 이상의 맥락, 도메인 지식, 팀의 합의 등 다양한 요소가 개입됩니다.
그래서 이 부분은 LLM만으로 처리하기는 쉽지 않고, 여전히 개발자의 의도가 크게 좌우한다고 느꼈습니다.
그렇다고 해서 리팩터링의 네 가지 주요 단계 중 ‘단계 쪼개기’만 중요하고 나머지는 덜 중요하다는 뜻은 아닙니다.
오히려 함수 쪼개기와 같은 선행 단계가 단단히 이루어져야, 적절한 수준에서 단계를 분리할 수 있습니다.
그리고 이렇게 단계를 잘 쪼갠 뒤에는 다형성을 적극적으로 활용해야,
OCP(Open-Closed Principle) 같은 원칙을 준수하며 유연한 코드를 작성할 수 있게 됩니다.
이 작은 예시를 통해 리팩터링은 단순히 코드를 재배치하는 작업이 아니라,
도메인 이해와 팀의 요구사항, 언어 특성까지 폭넓게 고려해야 하는 복합적인 설계 활동임을 다시금 실감했습니다.