클린 코드 실전 강의 교재¶
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규칙 (중요 순)¶
비유 — 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)¶
가장 적용 쉽고 효과 큰 규칙.
- 같은 코드 → 함수 추출 (entity-refactoring 6.1)
- 같은 구조 → 슈퍼클래스 추출 (entity-refactoring 12.8) 또는 컴포지션
- 같은 알고리즘 → 추상화
12.2.2 표현하라 (의도 표현)¶
코드가 자기 의도를 말하도록:
- 이름 이 책임을 드러냄
- 함수와 클래스 가 작고 한 가지
- 표준 명명 (
findBy*,is*) - 단위 테스트 가 의도를 문서로
12.2.3 클래스와 메서드 수를 최소로 줄여라¶
가장 낮은 우선순위. 위 2·3 을 충족하면서 최소.
- 단, 1·2·3을 희생하면 안 됨 — 작은 클래스 여럿이 큰 클래스 한 개보다 낫다 (10장).
- "추측성 일반화" (entity-refactoring 3.15) 회피.
핵심 교훈¶
- 4규칙 순서가 우선순위. 1번 (테스트) 이 가장 중요.
- 창발 — 규칙을 매 단계 적용하면 좋은 설계가 저절로.
- 12장 = 1~11장의 요약. 함수·클래스·시스템·테스트가 모두 4규칙으로 환원.
- TDD + 리팩터링 + DRY + 의도 표현 의 사이클이 핵심.
- "최소" 는 마지막. 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) 과 짝.