콘텐츠로 이동

클린 코드 실전 강의 교재

12장 — 창발성 (Emergence)

대상: Java/Spring 백엔드 입문~중급 수강생 형식: 개념 → 비유 → 함정 → 체크리스트 → 퀴즈 전제 환경: Java 17+, Spring Boot 3.x


0. 이 장을 시작하기 전에

0.1 학습 목표

  • Kent Beck의 단순한 설계 4규칙 을 손에 익힘.
  • "좋은 설계는 의도해서 만드는 게 아니라 창발(emerge) 된다" 라는 관점.
  • 12장이 1~11장의 요약·통합 임을 인식.

0.2 큰 그림 — Kent Beck 의 4규칙 (중요 순)

1. 모든 테스트를 통과한다       ← 작동
2. 중복이 없다                  ← DRY
3. 프로그래머의 의도를 표현한다  ← 가독성
4. 클래스와 메서드 수를 최소화   ← 최소

비유 — 4규칙은 "건축 검사 체크리스트"입니다.

의도해서 좋은 집을 짓는 게 아니라, 4가지 검사를 통과하면 좋은 집이 저절로 됩니다. 검사를 매 단계 통과시키면 결과적으로 좋은 구조 창발.

0.3 현업에서 왜 중요한가

  • 짧지만 12장이 책의 결론 — 1~11장을 4규칙으로 압축.
  • "단순한 설계" 가 무엇인지 측정 가능한 기준 제공.
  • TDD + 리팩터링 사이클의 이론적 근거.

12.1 단순한 설계 규칙 1: 모든 테스트를 실행하라

한 줄 정의

가장 중요한 규칙. 모든 테스트가 통과 해야 시스템이 의도대로 작동.

효과

  • 검증 가능한 시스템
  • 변경의 안전망 → 정련 자유
  • 테스트하기 쉬운 구조 = 결합도 낮음 = 좋은 설계 (자연 부산물)

9장과의 연결

테스트 가능한 코드 → DI + 인터페이스 의존 강제 → 자연스럽게 SRP·DIP 충족.


12.2 단순한 설계 규칙 2~4: 리팩터링

한 줄 정의

테스트가 통과하면 → 멈추지 말고 정련. 2·3·4 규칙을 차례로 적용.

12.2.1 중복을 없애라 (DRY)

가장 적용 쉽고 효과 큰 규칙.

12.2.2 표현하라 (의도 표현)

코드가 자기 의도를 말하도록:

  • 이름 이 책임을 드러냄
  • 함수와 클래스 가 작고 한 가지
  • 표준 명명 (findBy*, is*)
  • 단위 테스트 가 의도를 문서로

12.2.3 클래스와 메서드 수를 최소로 줄여라

가장 낮은 우선순위. 위 2·3 을 충족하면서 최소.

  • 단, 1·2·3을 희생하면 안 됨 — 작은 클래스 여럿이 큰 클래스 한 개보다 낫다 (10장).
  • "추측성 일반화" (entity-refactoring 3.15) 회피.

핵심 교훈

  1. 4규칙 순서가 우선순위. 1번 (테스트) 이 가장 중요.
  2. 창발 — 규칙을 매 단계 적용하면 좋은 설계가 저절로.
  3. 12장 = 1~11장의 요약. 함수·클래스·시스템·테스트가 모두 4규칙으로 환원.
  4. TDD + 리팩터링 + DRY + 의도 표현 의 사이클이 핵심.
  5. "최소" 는 마지막. 1·2·3 희생 금지.

함정 / 주의

  • "최소 클래스" 를 너무 우선하면 거대 클래스 만듦. 응집도 + 변경 이유가 본질.
  • "의도 표현" 을 주석으로 하지 마라 (4장).
  • 리팩터링 단계에서 테스트 통과 가 모든 단계마다 보장돼야 — 안전망이 곧 자유.

체크리스트

  • CI에서 모든 테스트가 통과하는가
  • 새 PR에 같은 코드가 두 군데 들어가지 않았는가
  • 함수·클래스 이름이 의도를 드러내는가
  • 추측성 일반화 (단일 구현 인터페이스 등) 가 있는가

퀴즈

Q1. Kent Beck 의 4규칙 중 가장 중요한 것과 그 이유?

A. "모든 테스트를 통과한다". 작동하지 않는 코드는 아무리 깨끗해도 무가치. 테스트가 안전망 + 변경 자유 + 결합도 낮춤 — 모든 후속 규칙의 기반.

Q2. "창발" 의 의미는?

A. 좋은 설계를 의도해서 만드는 게 아니라, 4규칙을 매 단계 적용 하면 좋은 설계가 자연스럽게 등장. 큰 설계 한 번 vs 작은 정련 누적의 차이.

Q3. "최소 클래스·메서드" 가 마지막 우선순위인 이유?

A. 거대 클래스 하나가 작은 클래스 여럿보다 명목상 "최소" 지만 응집도·변경 격리 가 떨어짐. 1·2·3 (테스트·중복·의도) 을 충족한 후의 최소화여야.

Q4. "DRY (중복 없음)" 가 4규칙 중 적용 효과가 큰 이유?

A. 중복은 모든 변경 비용을 곱셈으로 증가. 한 줄 고치려면 N곳 고침 + 빠뜨림 사고. DRY 가 가장 즉각적·측정 가능한 품질 개선.

Q5. 12장이 1~11장의 요약인 이유?

A. 함수(3장)·클래스(10장)·시스템(11장)·테스트(9장) 모두 4규칙으로 환원. "작게·한 가지·테스트·중복 없음·의도 표현" — 같은 메시지의 다른 단위.


다음 장 예고 — 13장: 동시성

여러 스레드가 한 자원을 공유할 때의 함정. 동시성은 결합 의 한 형태 — SRP를 동시성 영역에도 적용. Effective Java 11장 (Item 78~84) 과 짝.