노트

리팩터링

Refactoring

설계#refactoring · 연결된 개념 18개

쉽게 말하면

리팩터링은 옷장 속 옷은 그대로 두고 칸과 서랍만 다시 정리하는 거예요. 입을 수 있는 옷은 같지만, 다음에 옷을 찾거나 새 옷을 넣을 때 훨씬 덜 헤매요.

비유가 깨지는 곳 옷장은 한 번에 뒤엎어도 되지만 리팩터링은 아주 작은 단계로 나눠 매번 테스트해요. 며칠씩 코드가 깨져 있다면 재작성에 가깝고, 기능 추가와 정리는 '두 개의 모자'처럼 따로 해요.

겉으로 보이는 동작은 그대로 둔 채, 코드를 이해하고 고치기 쉽게 내부 구조를 바꾸는 일. 기능을 더하는 일이 아니라 다음 변경을 덜 위험하게 만드는 정리다.

  • 작은 단계: 한 번에 하나의 기법만 적용하고 매번 테스트한다. "리팩터링하다가 며칠 동안 코드가 깨졌다"면 그건 리팩터링이 아니라 재작성에 가깝다
  • 두 개의 모자(Two Hats): 기능 추가 모자를 쓸 때는 구조를 건드리지 않고, 리팩터링 모자를 쓸 때는 기능을 더하지 않는다. 지금 어느 모자를 쓰고 있는지 의식한다
  • 언제: 기능을 추가하기 직전(준비를 위한 리팩터링(Preparatory Refactoring)), 코드를 이해하려 할 때(이해를 위한 리팩터링(Comprehension Refactoring)), 지나가다 눈에 띌 때(쓰레기 줍기(Litter-Pickup Refactoring)). 세 번째 중복이 보이면 한다는 3의 법칙도 기준이 된다
  • 하지 않을 때: 앞으로 고칠 일이 없는 코드, 처음부터 다시 쓰는 편이 쉬운 코드
  • 이유는 경제성: 깔끔함이라는 도덕이 아니라, 개발 속도를 유지하려고 한다. 기술 부채를 갚는 주된 수단이다
  • 안전망: 자가 테스트 코드가 있어야 마음 놓고 할 수 있다

성능과는 긴장 관계가 있다. 리팩터링 직후 조금 느려질 수 있지만 잘 정리된 코드가 튜닝하기도 쉽다. 측정 없이 추측으로 최적화하지 않는다(섣부른 최적화).

냄새를 찾는 어휘는 코드 냄새, 기법 목록은 리팩터링 기법 카탈로그에 있다. 켄트 벡은 구조 변경 중에서도 더 작고 안전한 단위를 정리(Tidying)라고 따로 부른다.

출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · Martin Fowler: Definition Of Refactoring · Refactoring.Guru: When to Refactor

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 보이스카우트 규칙

    코드를 처음 발견했을 때보다 조금이라도 나은 상태로 남겨 두라는 규칙. 캠핑장을 떠날 때 왔을 때보다 깨끗하게 하라는 보이스카우트 수칙을 로버트 C. 마틴(Robert C. Martin)이 소프트웨어에 옮겼다. 『리팩터링』도 같은 비유를 쓴다.

  • 문장 슬라이드하기

    관련된 코드끼리 가까이 모이도록 문장의 위치를 옮기는 리팩터링. 그 자체로도 읽기 쉬워지지만, 대개 함수 추출의 준비 단계로 쓴다.

  • 조건문 분해·통합

    복잡한 조건문의 조건식과 각 분기 본문에 의도를 드러내는 이름을 붙이는 리팩터링(분해, Decompose Conditional), 그리고 결과가 같은 여러 조건 검사를 하나로 묶는 리팩터링(통합, Consolidate Conditional Expression). 조건 코드는 무엇이 일어나는지는 말하지만 왜 그런지는 잘 말하지 않는데, 이름이 그 "왜"를 채운다.

  • 반복문을 파이프라인으로 바꾸기

    for 반복문을 filter·map·reduce 같은 컬렉션 연산의 연쇄, 즉 컬렉션 파이프라인(Collection Pipeline)으로 바꾸는 리팩터링. 각 원소가 어떤 단계를 거치는지가 위에서 아래로 읽힌다.

  • 함수 추출하기

    코드 조각에 목적을 드러내는 이름을 붙여 독립된 함수로 빼는 리팩터링. "어떻게"와 "무엇을"을 분리한다. 반대 방향인 함수 인라인하기(Inline Function)는 본문이 이름만큼 명확한 함수를 호출부로 다시 녹인다.

보기 옵션