리팩터링 2판 실전 강의 교재 — 12장 인덱스¶
무엇인가¶
Martin Fowler 리팩터링 2판(2018) 의 1~12장(예시·원칙·24 악취·테스트·카탈로그 보는 법·6~12장 카탈로그 약 66개 기법) 을 Java/Spring 백엔드 입문~중급 수강생용 강의 교재로 풀어 쓴 자료. 총 약 5,000줄. 각 장마다:
-
- 도입 (학습 목표·큰 그림 ASCII·시그니처 비유·현업에서 왜 중요한가)
- 본문 (각 절·기법 별 한 줄 정의 → 비유 → Before/After → 동기 → 절차 → 함정 → Spring 현업)
- 종합 (결정 가이드 표 + 종합 체크리스트 + Q/A 분리 형식 퀴즈)
- 다음 장 예고
→ 책 카드는 entity-refactoring.
실습 환경과 장별 루틴¶
먼저 guide-java-book-study-lab의 Java 17 + JUnit 5 환경을 준비한다. 1장 JavaScript 예제는 Node.js로 실행해도 되고, Java로 옮겨도 된다. 리팩터링 강의의 핵심은 작은 변경 뒤 테스트다.
각 기법은 같은 순서로 따라간다.
- Before 코드를 그대로 둔 채 자가 테스트를 먼저 만든다.
- 기법 이름을 확인한다. 예: 함수 추출, 변수 추출, 단계 쪼개기.
- 한 번에 한 단계만 바꾼다.
- 매 단계 테스트를 실행한다.
- After 코드가 “다음 기능을 넣기 쉬운 구조”인지 확인한다.
12편 인덱스 — 각 장 본문으로 바로 진입¶
| 장 | 주제 | 본문 |
|---|---|---|
| 1장 | 리팩터링: 첫 번째 예시 (statement → 단계별 7번 변환) | lecture-refactoring-ch1 |
| 2장 | 리팩터링 원칙 (정의·두 모자·이유·언제·YAGNI·성능) | lecture-refactoring-ch2 |
| 3장 | 코드에서 나는 악취 (24개) | lecture-refactoring-ch3 |
| 4장 | 테스트 구축하기 (자가 테스트·픽스처·경계 조건) | lecture-refactoring-ch4 |
| 5장 | 카탈로그 보는 법 (형식·선정 기준) | lecture-refactoring-ch5 |
| 6장 | 기본적인 리팩터링 (11) — 함수 추출 ★ / 변수 추출 ★ / 함수 선언 ★ / 단계 쪼개기 ★ | lecture-refactoring-ch6 |
| 7장 | 캡슐화 (9) — 레코드·컬렉션·기본형→객체·클래스 추출·위임 숨기기 | lecture-refactoring-ch7 |
| 8장 | 기능 이동 (9) — 함수 옮기기 ★·필드 옮기기·반복문 파이프라인·죽은 코드 | lecture-refactoring-ch8 |
| 9장 | 데이터 조직화 (6) — 변수 쪼개기·파생→질의·참조↔값·매직 리터럴 | lecture-refactoring-ch9 |
| 10장 | 조건부 로직 간소화 (7) — 보호 구문·조건부 로직→다형성 ★·특이 케이스 | lecture-refactoring-ch10 |
| 11장 | API 리팩터링 (13) — CQS ★·플래그 제거·생성자→팩터리·예외 변환 | lecture-refactoring-ch11 |
| 12장 | 상속 다루기 (11) — 메서드/필드 올리고 내리기·서브클래스→위임 ★★ | lecture-refactoring-ch12 |
→ 총 약 66개 리팩터링 + 24 악취, 약 5,000줄. 각 장에는 학습 목표·비유·Before/After 코드·절차·Spring 현업 예제·체크리스트·퀴즈가 포함됩니다.
강의 교재 형식 (일관된 5단)¶
## N장 — 제목
> 대상: Java/Spring 백엔드 입문~중급
> 형식: 개념 → 비유 → Before/After → 절차 → 함정 → 체크리스트 → 퀴즈
> 전제: Java 17+, Spring Boot 3.x
## 0. 이 장을 시작하기 전에
0.1 학습 목표
0.2 큰 그림 (ASCII 그림 + 비유)
0.3 현업에서 왜 중요한가
## N.M 기법 이름 [★ 표시]
### 한 줄 정의
### 비유 — "..."
### Before / After (코드 쌍)
### 동기 (왜·언제)
### 절차 (작은 단계)
### 함정
### Spring 현업
### Effective Java / 오브젝트 연결
## N장 종합 정리
### 한눈에 보는 결정 가이드 (표)
### 종합 체크리스트 (코드 리뷰용)
### 종합 퀴즈 (Q/A 분리 — **Q.** 질문 + **A.** 답변)
## 다음 장 예고
시그니처 비유 (일관성)¶
- 1장: 리팩터링은 요리하면서 틈틈이 정리하는 주방
- 2장: 두 모자 = 요리사 모자 vs 청소부 모자
- 3장: 24 악취는 주방의 신호 (음식이 상한 게 아니라 도구 정리 신호)
- 4장: 자가 테스트는 공사장 안전 헬멧
- 5장: 카탈로그 5단은 사전 사용 설명서
- 6장: 기본 리팩터링은 칼·도마·계량컵
- 7장: 캡슐화는 포장
- 8장: 기능 이동은 주방 도구 자리 정리
- 9장: 데이터 조직화는 주방 라벨 다시 붙이기
- 10장: 조건문은 도시의 신호등
- 11장: API는 식당 메뉴판 (한 번 인쇄 → 영원)
- 12장: 상속은 가문
★ 별 표시한 핵심 리팩터링¶
| Item | 이름 | 왜 핵심 |
|---|---|---|
| 6.1 | 함수 추출 ★ | 모든 리팩터링의 기본 |
| 6.3 | 변수 추출 ★ | 의미 명시의 시작 |
| 6.5 | 함수 선언 바꾸기 ★ | 이름 정리의 정석 |
| 6.11 | 단계 쪼개기 ★ | 1장 핵심 변환 |
| 8.1 | 함수 옮기기 ★ | 기능 편애·산탄총 수술 처방 |
| 10.4 | 조건부 로직 → 다형성 ★ | OOP 핵심 직접 적용 |
| 11.1 | CQS 분리 ★ | 동시성·테스트·예측의 기반 |
| 12.10 | 서브클래스 → 위임 ★★ | 상속 → 합성 전환 |
| 12.11 | 슈퍼클래스 → 위임 ★ | 취약한 기반 클래스 회피 |
책 전체 6원칙 (12장 마지막에서 추출)¶
- 자가 테스트가 모든 리팩터링의 전제 (4장)
- 24 악취가 트리거 (3장)
- 이름·전제·절차가 있는 변경 (5장)
- 모든 리팩터링은 쌍 — 양방향 도구 (5장)
- CQS·불변 우선 (11·12장)
- 상속보다 합성 (12.10·12.11)
→ 90 권고 Effective Java 6원칙, 9 메시지 오브젝트 와 결합하면 OO 설계 큰 그림이 완성.
활용 가이드¶
| 목적 | 추천 진입점 |
|---|---|
| 입문~1년차 빠른 진입 | 1장(예시) → 3장(악취) → 6.1·6.5·8.1 |
| 코드 리뷰 어휘 | 각 장 끝의 "종합 체크리스트" |
| 신입 교육 자료 | 1장 statement() 변환 + 각 기법 Before/After 발췌 |
| 인터뷰 준비 | "종합 퀴즈" Q를 먼저 보고 A 가리기 |
| 자기 코드 진단 | 3장 24 악취로 자기 코드베이스 워크스루 |
위키 기존 페이지와의 연결¶
- entity-refactoring — 책 카드 (상위)
- entity-effective-java — 같은 OO 결론을 다른 길로 (매일의 권고)
- entity-object — 책임 주도 설계 (도달점)
- concept-oop — 4원칙
- concept-design-patterns — 패턴 = 리팩터링 도달점
- concept-spring-core — DI·AOP 적용
- concept-transactional-rollback-policy — 예외 처리와 직결
- concept-db-connection-pool — try-with-resources 패턴
- src-spring-testing-ref — 4장 자가 테스트 실무
- guide-java-book-study-lab — 5권 공통 실습 환경
한계·주의¶
- 사용자 강사용 내부 교재 성격 — 인용·재배포 전 확인 필요
- Java 17 + Spring Boot 3.x 가정
- 책 본문 자체는 raw에 미보유 — 교재 본문이 책의 직접 인용은 아님 (강의용 재구성)
- 22~23 같은 일부 절차는 책 원본보다 단순화될 수 있음 — 실무 적용 시 책 본문 직접 확인 권장
관련 페이지¶
- entity-refactoring — 책 카드 (상위)
- entity-effective-java / src-effective-java-lecture — 같은 패턴의 자매 강의 교재
- entity-object — 오브젝트 (같은 OO 주제, 다른 관점)