콘텐츠로 이동

클린 코드 실전 강의 교재

16장 — SerialDate 리팩터링

대상: Java/Spring 백엔드 입문~중급 수강생 형식: 큰 사례 워크스루 — 첫째 돌려보고 둘째 고친다 전제 환경: Java 17+


0. 이 장을 시작하기 전에

0.1 학습 목표

  • 큰 레거시 클래스 를 안전하게 정련하는 절차.
  • 첫째: 돌려라 — 테스트로 현재 동작 박제.
  • 둘째: 고쳐라 — 한 휴리스틱씩 적용.
  • 17장 휴리스틱 카탈로그의 살아있는 사례.

0.2 사례 — JFreeChart의 SerialDate

날짜 표현 클래스. 악취 다수 — 거대 함수·매직 숫자·이름 모호·반복 switch·죽은 코드·이상한 주석.

0.3 현업에서 왜 중요한가

  • 우리가 매일 만나는 레거시 의 축소판.
  • "이건 어디서부터 손대지?" 에 답하는 절차.

16.1 첫째, 돌려보자

한 줄 정의

기존 코드의 현재 동작 을 테스트로 박제. 이게 없으면 정련이 도박.

단계

  1. 기존 단위 테스트 실행 — 통과 확인
  2. 커버리지 측정 — 빠진 부분 파악
  3. 커버리지 메우는 테스트 추가 — 특성화 테스트 (Characterization Test)
  4. 빨강/초록 안정화

특성화 테스트

코드가 "옳은가" 가 아니라 "현재 어떻게 작동하는가" 를 박제.

레거시는 옳은 동작이 뭔지조차 모르는 경우 — 일단 현재 동작을 박제하고, 그게 옳은지는 별도 검토.


16.2 둘째, 고쳐보자

진행 (책 요약)

  1. 이름 정리 — 모호한 변수·메서드 이름
  2. 매직 숫자 → 상수1, 12 같은 숫자에 의미 부여
  3. enum 도입Month, DayOfWeek
  4. 함수 추출 — 거대 함수 분해
  5. 반복 switch → 다형성 (가능한 곳)
  6. 죽은 코드 제거 — Git 이 기억
  7. 주석 정리 — 코드가 말하게
  8. 클래스 분리 — SRP 위배 해소

매 단계마다

  • 특성화 테스트 + 단위 테스트 모두 통과 확인
  • 한 휴리스틱 = 한 PR

16.3 결론

책의 통찰

"돌려보지 않고 고치지 마라" — 안전망 없는 정련 = 도박.

레거시는 두려운 것이 아니라 절차 의 문제. 첫째·둘째 단계만 지키면 안전.


핵심 교훈

  1. 레거시는 절차의 문제 — 두려움이 아니라 도구.
  2. 특성화 테스트 가 안전망.
  3. 한 휴리스틱 = 한 PR — 산탄총 수술 회피.
  4. 17장 카탈로그가 정확히 이 단계에 적용.

함정 / 주의

  • 특성화 테스트가 옛 버그까지 박제할 수 있음 — "옳은 동작" 인지는 별도 검토.
  • 정련 PR 이 너무 커지면 리뷰 부담 → 작게.
  • "다 갈아엎고 싶다" 유혹 — 14장과 같은 메시지로 견뎌라.

체크리스트

  • 손대기 전 현재 동작이 테스트로 박제됐는가
  • 커버리지 빠진 부분을 특성화 테스트로 메웠는가
  • 한 PR에 한 휴리스틱만 적용했는가
  • 매 단계 모든 테스트 통과 확인했는가

퀴즈

Q1. "특성화 테스트" 가 일반 테스트와 다른 점?

A. 일반 테스트는 "옳은 동작" 을 검증. 특성화 테스트는 "현재 동작" 을 박제 — 옳든 그르든 그대로. 레거시 정련 시 안전망.

Q2. "첫째 돌려보고 둘째 고친다" 의 순서가 중요한 이유?

A. 안전망 (테스트) 없이 정련 시작하면 회귀 사고 발생해도 모름. 첫째 단계 (특성화) 가 완료된 후라야 둘째 (정련) 가 안전.

Q3. "한 휴리스틱 = 한 PR" 이 좋은 이유?

A. 한 PR에 여러 변경 섞이면 (1) 리뷰 부담, (2) 실패 시 원인 추적 어려움, (3) 산탄총 수술. 분리하면 리뷰·롤백 모두 단순.

Q4. "다 갈아엎고 싶다" 유혹을 견뎌야 하는 이유?

A. 14장과 동일 — 재작성은 (1) 옛 시스템 동시 유지, (2) 새 시스템도 추해질 위험, (3) 시간 폭증. 점진 정련이 거의 항상 더 빠름.


다음 장 예고 — 17장: 냄새와 휴리스틱

이 책의 결론 카탈로그. 66개 휴리스틱 (C·E·F·G·J·N·T 7 카테고리). 코드 리뷰 어휘·정련 사전.