자바로 배우는 리팩토링 입문

리팩토링 정의

리팩토링이란 외부에서 보는 프로그램 동작은 바꾸지 않고 프로그램의 내부 구조를 개전하는 것이다.

  • 리팩토링해도 외부에서 보는 프로그램 동작은 변하지 않는다.
  • 리팩토링하면 프로그램의 내부 구조가 개선된다.

리팩토링과 유닛 테스트

리팩토링해도 외부에서 보는 프로그램 동작은 변하지 않아야 한다. 이를 확인하기 위해 적어도 유닛 테스트(단일테스트)를 해야 한다.

리팩토링의 목적

버그 수정과 기능 추가는 리팩토링이 아니다. 리팩토링의 목적은 다음과 같다.

  • 버그를 발견하기 쉽게 만든다.
    • 버그 수정 자체는 리팩토링이 아니지만, 리팩토링하면 프로그램이 정리되어 숨은 버그를 찾기 쉬워진다.
  • 기능을 추가하기 쉽게 만든다.
    • 더러운 소스 코드에 계속된 기능 추가는 소스 코드의 오염 속도를 가속시킨다. 이는 기능의 추가를 더욱 어렵게 한다.
      리팩토링하면 망가지고 더러운 코드를 다시 정비해서 깨끗하게 만들 수 있기 때문에 기능의 추가가 편해진다.
  • 리뷰하기 쉽게 만든다.

리팩토링과 악취

리팩토링이 필요한 부분을 ‘악취’가 난다고 표현한다. 그렇다면 악취란?

  • 이해하기 어려운 부분
  • 수정하기 어려운 부분
  • 확장하기 어려운 부분

소스 코드를 보다가 이 말이 입에서 튀어나오면 ‘리팩토링이 필요하겠구나’라고 생각하면 된다?

  • 겹치잖아!
    • 메서드 추출
    • 클래스 추출
    • 널 객체 도입
      • null 확인이 이곳저곳에 존재한다면
    • 에러코드를 예외로 치환
      • 에러 확인이 많다
  • 너무 길어!
    • 메서드 추출
    • 클래스 추출
  • 너무 많아!
    • 중개자 제거
    • 클래스 인라인화
    • 메서드 인라인화
  • 이름이 안 맞잖아!
  • 너무 공개적이잖아!
  • 객체 지향답지 않아!
    • 분류 코드(switch, if, intanceof)를 클래스로 치환이나 분류 코드를 하위 클래스로 치환