Divergent Change(뒤틀린 변경 / 발산적 변경)는 마틴 파울러(Martin Fowler)의 저서 《리팩터링(Refactoring)》에서 처음 등장한 개념입니다.
이 책에서는 수정해야 할 소프트웨어 내부의 문제점을 ’코드 냄새(Code Smell)’라는 비유로 표현하는데, Divergent Change는 그중 ‘수정 교란(Change Preventers)’ 카테고리에 속하는 대표적인 코드 냄새입니다.
핵심
소프트웨어가 잘 설계되었다면 어떤 요구사항이 바뀔 때 특정 모듈 딱 하나만 깔끔하게 고치면 끝나야 합니다. 하지만 하나의 클래스가 너무 많은 책임(역할)을 가지고 있으면(객체지향의 단일 책임 원칙(SRP) 위반), 전혀 다른 이유로 코드를 고칠 때마다 자꾸 그 클래스를 건드리게 됩니다.
- UI 변경, 비즈니스 규칙 변경, 저장소 변경이 같은 파일에 모인다.
- 변경 이유별로 책임을 분리할 수 있는지 본다.
- 응집도 낮은 모듈에서 자주 나타난다. git 변경 사항중 blog 디렉토리 하위 항목들만 모두 선택하여 하나의 커밋으로 커밋
산탄총 수술(Shotgun Surgery)과의 차이점
산탄총 수술은 마틴 파울러의 책에서 이 개념과 항상 세트로 묶여서 비교된다. 둘은 비슷해 보이지만 정반대의 성격을 가진다.
| 구분 | Divergent Change (발산적 변경) | Shotgun Surgery (산탄총 수술) |
|---|---|---|
| 현상 | 하나의 클래스를 수정하는 이유가 너무 많음 | 하나의 이유 때문에 여러 클래스를 동시에 고쳐야 함 |
| 원인 | 응집도가 낮음 (한 놈이 너무 많은 일을 함) | 결합도가 너무 높음 (코드들이 너무 끈적하게 얽혀있음) |
| 비유 | “이 클래스는 왜 데이터베이스 바뀔 때도, UI 바뀔 때도 고쳐야 하지?” | “로그인 기능 하나 고치는데 파일 10개를 다 열어서 수정해야 하네?” |
관련 개념
- [[single-responsibility-principle]]
- [[cohesion]]
- [[shotgun-surgery]]