리팩터링 2판을 읽고

2020-04-30

2020년 4월에 한국에 번역 후 발간된 “리팩터링 2판” 책을 한빛미디어의 리뷰단에 선정되어 리뷰하고자 합니다.


“리팩터링 2판을 읽고.”


*본 글은 한빛 미디어의 ‘나는 리뷰어다 2020년 4월’의 프로그램 일환으로 진행 된 리뷰입니다.


드디어, 마틴파울러의 리팩터링 2판이 나왔다. 역시! 리팩터링이다.

대상독자

이책의 대상 독자를 저자는 ‘소프트웨어 개발을 직업으로 하는 전문 프로그래머’로 한다.

예시 코드는 javascript로 구성되어있다.


이 책을 사용하는 방법

  • 리팩터링이 뭔지 모른다면 1장을 읽자. : 1장의 예시를 보면 리팩터링 진행 절차를 명확하게 알 수 있다.
  • 리팩터링해야 하는 이유를 모르겠다면 1장과 2장을 읽자. : 리팩터링이 무엇이고 왜 필요한지 알 수 있다.
  • 리팩터링해야 할 곳을 찾고 싶을 때는 3장을 읽자 : 리팩터링이 필요할 만한 곳에서 보내는 신호(Bad Smell)을 찾는 요령을 알려준다.
  • 리팩터링을 실습하고 싶다면 1장부터 4장까지 꼼꼼하게 읽고, 나머지는 빠르게 훝어보자 : 카탈로그 부분은 어떤 기법들이 있는지 정보만 대략보면된다. 세세한 부분까지 이해 할 필요는 없다. 리팩터링을 당장 실시 해야 할 부분은 그때 그때 보고 따라하자.

이 책을 읽고

리팩터링 2판의 목록을 읽어보자. 흥미로운 내용들이 다채롭게 있다. 보기만 해도 두근거리지 않나?

CHAPTER 01 리팩터링: 첫 번째 예시
1.1 자, 시작해보자!
1.2 예시 프로그램을 본 소감
1.3 리팩터링의 첫 단계
1.4 statement() 함수 쪼개기
1.5 중간 점검: 난무하는 중첩 함수
1.6 계산 단계와 포맷팅 단계 분리하기
1.7 중간 점검: 두 파일(과 두 단계)로 분리됨
1.8 다형성을 활용해 계산 코드 재구성하기
1.9 상태 점검: 다형성을 활용하여 데이터 생성하기
1.10 마치며

CHAPTER 02 리팩터링 원칙
2.1 리팩터링 정의
2.2 두 개의 모자
2.3 리팩터링하는 이유
2.4 언제 리팩터링해야 할까?
2.5 리팩터링 시 고려할 문제
2.6 리팩터링, 아키텍처, 애그니(YAGNI)
2.7 리팩터링과 소프트웨어 개발 프로세스
2.8 리팩터링과 성능
2.9 리팩터링의 유래
2.10 리팩터링 자동화
2.11 더 알고 싶다면

CHAPTER 03 코드에서 나는 악취
3.1 기이한 이름
3.2 중복 코드
3.3 긴 함수
3.4 긴 매개변수 목록
3.5 전역 데이터
3.6 가변 데이터
3.7 뒤엉킨 변경
3.8 산탄총 수술
3.9 기능 편애
3.10 데이터 뭉치
3.11 기본형 집착
3.12 반복되는 switch문
3.13 반복문
3.14 성의 없는 요소
3.15 추측성 일반화
3.16 임시 필드
3.17 메시지 체인
3.18 중개자
3.19 내부자 거래
3.20 거대한 클래스
3.21 서로 다른 인터페이스의 대안 클래스들
3.22 데이터 클래스
3.23 상속 포기
3.24 주석

CHAPTER 04 테스트 구축하기
4.1 자가 테스트 코드의 가치
4.2 테스트할 샘플 코드
4.3 첫 번째 테스트
4.4 테스트 추가하기
4.5 픽스처 수정하기
4.6 경계 조건 검사하기
4.7 끝나지 않은 여정

CHAPTER 05 리팩터링 카탈로그 보는 법
5.1 리팩터링 설명 형식
5.2 리팩터링 기법 선정 기준

CHAPTER 06 기본적인 리팩터링
6.1 함수 추출하기
6.2 함수 인라인하기
6.3 변수 추출하기
6.4 변수 인라인하기
6.5 함수 선언 바꾸기
6.6 변수 캡슐화하기
6.7 변수 이름 바꾸기
6.8 매개변수 객체 만들기
6.9 여러 함수를 클래스로 묶기
6.10 여러 함수를 변환 함수로 묶기
6.11 단계 쪼개기

CHAPTER 07 캡슐화
7.1 레코드 캡슐화하기
7.2 컬렉션 캡슐화하기
7.3 기본형을 객체로 바꾸기
7.4 임시 변수를 질의 함수로 바꾸기
7.5 클래스 추출하기
7.6 클래스 인라인하기
7.7 위임 숨기기
7.8 중개자 제거하기
7.9 알고리즘 교체하기

CHAPTER 08 기능 이동
8.1 함수 옮기기
8.2 필드 옮기기
8.3 문장을 함수로 옮기기
8.4 문장을 호출한 곳으로 옮기기
8.5 인라인 코드를 함수 호출로 바꾸기
8.6 문장 슬라이드하기
8.7 반복문 쪼개기
8.8 반복문을 파이프라인으로 바꾸기
8.9 죽은 코드 제거하기

CHAPTER 09 데이터 조직화
9.1 변수 쪼개기
9.2 필드 이름 바꾸기
9.3 파생 변수를 질의 함수로 바꾸기
9.4 참조를 값으로 바꾸기
9.5 값을 참조로 바꾸기
9.6 매직 리터럴 바꾸기

CHAPTER 10 조건부 로직 간소화
10.1 조건문 분해하기
10.2 조건식 통합하기
10.3 중첩 조건문을 보호 구문으로 바꾸기
10.4 조건부 로직을 다형성으로 바꾸기
10.5 특이 케이스 추가하기
10.6 어서션 추가하기
10.7 제어 플래그를 탈출문으로 바꾸기

CHAPTER 11 API 리팩터링
11.1 질의 함수와 변경 함수 분리하기
11.2 함수 매개변수화하기
11.3 플래그 인수 제거하기
11.4 객체 통째로 넘기기
11.5 매개변수를 질의 함수로 바꾸기
11.6 질의 함수를 매개변수로 바꾸기
11.7 세터 제거하기
11.8 생성자를 팩터리 함수로 바꾸기
11.9 함수를 명령으로 바꾸기
11.10 명령을 함수로 바꾸기
11.11 수정된 값 반환하기
11.12 오류 코드를 예외로 바꾸기
11.13 예외를 사전확인으로 바꾸기

CHAPTER 12 상속 다루기
12.1 메서드 올리기
12.2 필드 올리기
12.3 생성자 본문 올리기
12.4 메서드 내리기
12.5 필드 내리기
12.6 타입 코드를 서브클래스로 바꾸기
12.7 서브클래스 제거하기
12.8 슈퍼클래스 추출하기
12.9 계층 합치기
12.10 서브클래스를 위임으로 바꾸기
12.11 슈퍼클래스를 위임으로 바꾸기

부록 A 리팩터링 목록
부록 B 악취 제거 기법

위에서 언급한 책을 사용하는 방법에 따라서, 각자의 상황에 맞게 읽으면 좋을 것이다.

이번 개정판에서 인상적인 부분은 기존 1판의 Java에서 JS로 변경되어 프론트엔드 백엔드 개발자 모두 읽기 쉬워졌다. 또한 번역이 매끄럽게 잘 되었다.

각 리팩터링의 기법을 소개 할 때, 그림으로 해당 부분의 맥락을 잡아주기에 조금 더 읽기 쉽다.

소프트웨어 개발자라면 반드시 읽어봐야 할 책 중에 하나이다.

그리고, 다시금 읽고 인상깊은 구절은 아래와 같았다.

리팩터링의 궁극적인 목적은 개발 속도를 높여서,

더 적은 노력으로 많은 가치를 창출하는 것이다.

— 마틴파울러 리팩터링 2판

리팩터링을 사람들은 클린 코드나 바람직한 습관 등 도덕적인 이유로 정당화 한다. 하지만 경제적인 이유로 하는 것이라고 저자는 강조한다. 개발기간을 단축하고, 기능 추가시간을 줄이고, 버그 수정시간을 줄인다.

맞다.

늘 만났던 개발자들은 한결같이 리팩터링을 기술부채를 해결하는 기법으로 생각했다.

하지만 기억하자. 리팩터링을 통해서 얻는 주요한 가치는 생산성일 것이다. 덤으로 깨끗한 코드를 얻는 것이고……