← 개념 목록

발산적 변경

개념

하나의 클래스가 서로 다른 이유로, 서로 다른 방향으로 자주 변경되는 현상

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]]