← 목록으로
📅 2026.06.01
도서 리뷰: 실무 관점에서 바라보는 《Refactoring》 핵심 요약 및 기술 부채 관리
RefactoringClean CodeBookTechnical DebtOOPTechStudy

마틴 파울러의 《Refactoring(리팩터링)》은 '나쁜 코드를 어떻게 안전하게 좋은 코드로 바꿀 것인가'라는 구체적인 방법론과 예시코드를 담은 책입니다.
본 문서에서는 이 책의 핵심 내용 요약과 장단점 리뷰, 그리고 실무 관점에서의 코드 스멜(Code Smell) 감지와 기술 부채 청산에 관한 고찰을 결합하여 작성했습니다.


1. 핵심 내용 요약

리팩터링의 핵심 정의는 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하기 쉽고 수정하기 쉽게 내부 구조를 변경하는 것입니다.
책은 리팩터링 작업을 철저하게 '기계적이고 안전한 단계별 절차'로 안내합니다.

① 리팩터링의 첫걸음: 테스트 코드

마틴 파울러는 리팩터링의 첫 번째 단계는 반드시 신뢰할 수 있는 테스트 코드를 마련하는 것이라고 단언합니다.
코드를 고치다가 기존에 정상 동작하던 기능을 망가뜨리지 않았는지(즉, 겉보기 동작이 완전무결하게 유지되었는지) 바로 검증할 수 있는 안전장치가 없다면, 그것은 리팩터링이 아니라 단순한 스파게티 코드 생성에 불과합니다.

② 코드 스멜(Code Smell)의 체계화

이 책의 가장 위대한 업적 중 하나는 개발자가 막연하게 "코드가 구리다"라고 느꼈던 직관을 24가지의 구체적인 '코드 스멜' 유형으로 학술적·실무적으로 명확히 정의해낸 것입니다.

  • 기이한 이름(Mysterious Name): 이름만 봐서 무엇을 하는지 도통 의도를 알 수 없는 불분명한 변수/함수명.
  • 중복 코드(Duplicated Code): 똑같은 구조나 유사한 로직이 코드베이스 내 두 곳 이상에서 반복되는 현상.
  • 긴 함수(Long Function): 하나의 함수가 너무 길고 많은 책임을 도맡아 담고 있는 경우.
  • 뒤엉킨 변경(Divergent Change): 하나의 클래스가 서로 다른 다양한 이유로 인해 자주 수정되는 경우 (SOLID의 단일 책임 원칙(SRP) 위배 상태).

③ 카탈로그화된 리팩터링 기법 (Before & After)

수십 가지의 리팩터링 공식을 사전(카탈로그) 형태로 정리해 제공하여, 언제든 바로 대입할 수 있게 돕습니다.

  • 함수 추출하기(Extract Function): 의도를 한눈에 알기 어려운 복잡한 코드 조각을 별도 함수로 분리하고 명확한 이름을 붙임.
  • 변수 인라인화하기(Inline Variable): 변수가 불필요한 할당으로 인해 표현식 자체와 별다를 바 없을 때, 변수를 삭제하고 표현식을 코드에 직접 삽입.
  • 조건부 로직을 다형성으로 바꾸기(Replace Conditional with Polymorphism): 분기를 태우는 수많은 if-elseswitch문을 객체지향의 다형성(인터페이스/상속)으로 우아하게 변환.

2. 《Refactoring》 종합 리뷰

장점: 두려움 없는 코드 수정과 실천적 가이드

  • 극도의 안전성과 단계성: 코드를 한 번에 모조리 갈아엎는 빅 프로젝트 식 시도는 무조건 실패합니다. 책은 *"1단계: 변수명을 바꾼다, 2단계: 테스트를 돌린다, 3단계: 함수를 뺀다, 4단계: 테스트를 돌린다"*와 같이 컴파일이 단 1초도 깨지지 않는 초미세 단계를 제시합니다. 덕분에 아무리 거대하고 끔찍한 레거시 코드를 마주해도 두려움 없이 개선의 칼을 댈 수 있게 해줍니다.
  • 개발자 간의 전문적 공통 언어 제공: 팀원들과 코드 리뷰를 할 때 "이 코드 좀 이상한 것 같아요"가 아니라, *"이 부분은 '뒤엉킨 변경' 스멜이 나니 '함수 추출하기'를 적용해 보는 게 어떨까요?"*라며 정확하고 가치 있는 전문적인 소통을 가능하게 만듭니다.

한계: 이론과 실무의 간극 (테스트 코드의 부재)

  • 레거시 환경에서의 현실적 제약: 실무에서 리팩터링이 가장 절실한 코드는 역설적으로 테스트 코드가 단 한 줄도 없는 엉망진창인 레거시 시스템입니다. 책의 철저한 전제 조건인 '안전한 테스트 환경'을 구축하는 것 자체가 이미 감당하기 어려운 거대한 장벽인 경우가 많아, 실무 초반에 기계적으로 적용하기 막막할 수 있습니다.
  • 최신 에디터/IDE 기능과의 중복: 현대의 인텔리제이(IntelliJ), VS Code 등은 '함수 추출', '이름 변경' 같은 기본적인 리팩터링을 단축키 하나로 에러 없이 안전하게 자동 수행해 줍니다. 따라서 책에서 제시하는 세부적인 타이핑 단계를 있는 그대로 정독하기에는 다소 지루하게 느껴질 수 있습니다. (기계적 타이핑보다는 원리와 패턴 인지가 중요해졌습니다.)

3. 기술 부채를 청산하는 '지속 가능한' 리팩터링

100% 완벽한 클린 코드는 실무 환경에서 달성하기 어렵지만, 코드의 나쁜 냄새(스멜)를 기민하게 감지하고 동료와 끊임없이 논의해 기술 부채를 통제하는 태도는 이 책의 핵심 사상인 '수시로 하는 리팩터링(Opportunistic Refactoring)'과 완벽히 궤를 같이합니다.

카드 돌려막기를 멈추는 "3진 아웃" 법칙

마틴 파울러는 리팩터링만을 위해 대규모 일정을 따로 잡는 것을 철저히 경계합니다. 촉박한 실무 개발 일정 속에서는 실현 불가능하기 때문입니다. 대신 3진 아웃(Rule of Three) 규칙을 활용합니다.

  1. 처음 작성할 때: 설계 고민보다는 일단 돌아가게 구현한다.
  2. 두 번째 유사한 작업을 할 때: 중복이 보여도 약간 참으며 일단 개발을 마무리한다.
  3. 세 번째 동일한 중복 작업을 마주할 때: 이때가 바로 임계점이며, 기술 부채의 이자 폭탄을 막기 위해 모든 리팩터링 공식을 대입해 코드를 정리해야 할 순간입니다.

의심하고 논의하는 팀 문화의 도구

본인이 작성한 코드에서 나쁜 스멜이 느껴진다면, 이 책의 공식 카탈로그를 무기로 삼아 동료들과 소통의 자리를 마련해야 합니다.
"비즈니스 일정 때문에 일단 이대로 배포를 진행하지만, 이 부분에 '기이한 이름'과 '긴 함수' 스멜이 묻어있으니 다음 마일스톤 작업 때 최소한 '함수 추출하기'만이라도 적용하자"고 협의를 주도하고 부채 상환 계획을 수립하는 역량이야말로 진정한 시니어 리드 개발자의 면모입니다.


4. Refactoring에 대한 견해

시스템 운영 중 발생하는 코드 스멜을 방치하면 감당하기 힘든 기술 부채로 돌아오므로, 이를 적시에 인지하고 능동적으로 대응하는 자세가 필수적입니다. 다만 독단적인 리팩터링은 예상치 못한 사이드 이펙트를 유발하여 시스템 안정성을 위협할 수 있기 때문에, 반드시 팀원들과 문제를 공유하고 충분한 논의를 거쳐 합의된 방향으로 진행해야 합니다.

특히 대규모 시스템에서는 무리한 전면 수정보다 영향도를 최소화하는 작은 단위부터 차근차근 개선해 나감으로써, 코드의 지속 가능성을 높이고 장기적인 유지보수 비용을 절감해야 합니다.

핵심 요약: 리팩터링은 단순한 코드 청소가 아니라 제품의 가치를 안정적으로 이어가기 위한 리스크 관리입니다.