산탄총 수술
IT위키
더 많은 작업
산탄총 수술(Shotgun Surgery)은 기능 하나를 바꿀 때마다 여러 클래스를 조금씩 고쳐야 하는 코드 냄새(code smell)로, 하나의 책임이 여러 클래스에 흩어져 있다는 신호이며 메서드·필드 이동으로 그 책임을 한 클래스에 모아 해결한다.
산탄총을 쏘면 작은 탄알이 넓게 퍼지듯, 변경 하나가 코드 곳곳에 작은 수정을 요구한다는 뜻에서 붙은 이름이다. 마틴 파울러의 『Refactoring』(1999) 3장 '코드의 나쁜 냄새'에 실린 냄새 가운데 하나로, 변경을 어렵게 만드는 냄새(Change Preventers)로 분류된다.[1]
- 증상 - 무엇을 바꾸든 여러 클래스에 걸쳐 작은 수정을 많이 해야 한다
- 문제 - 고칠 곳이 여기저기 흩어져 있어 찾기 어렵고, 중요한 곳 하나를 빠뜨리기 쉽다
- 원인 - 하나의 책임이 여러 클래스에 쪼개져 있다. 확산적 변경을 없애려고 클래스를 지나치게 나누다 생기기도 한다[2]
- 메서드 이동(Move Method)과 필드 이동(Move Field)으로 흩어진 행위와 데이터를 한 클래스로 모은다. 알맞은 클래스가 없으면 새로 만든다
- 옮기고 나서 원래 클래스들이 거의 비면 클래스 인라인(Inline Class)으로 없앤다
- 결과적으로 코드가 정리되고 중복이 줄며 유지보수가 쉬워진다[2]
산탄총 수술과 확산적 변경(Divergent Change)은 방향이 정반대인 짝이다.[3]
| 구분 | 산탄총 수술 | 확산적 변경 |
|---|---|---|
| 증상 | 변경 하나가 여러 클래스를 조금씩 고치게 한다 | 한 클래스가 서로 다른 여러 이유로 자꾸 고쳐진다. 예: 상품 종류를 하나 더할 때마다 같은 클래스의 검색·표시·주문 메서드를 모두 고친다 |
| 원인 | 한 책임이 여러 클래스에 흩어짐 | 여러 책임이 한 클래스에 몰림 |
| 해결 | 메서드·필드 이동으로 한 곳에 모은다 | 클래스 추출(Extract Class)로 나눈다 |
다른 냄새와도 구별한다.
- 기능 편애(Feature Envy) - 메서드가 자기 클래스보다 다른 클래스의 데이터를 더 많이 쓴다. 메서드 이동으로 그 데이터가 있는 클래스로 옮긴다
- 데이터 뭉치(Data Clumps) - 같은 변수 묶음(예: 데이터베이스 접속 정보)이 여러 곳에 함께 나타난다. 클래스 추출이나 매개변수 객체 도입으로 묶는다
- 병렬 상속 계층(Parallel Inheritance Hierarchies) - 한 계층에 하위 클래스를 만들 때마다 다른 계층에도 짝이 되는 하위 클래스를 만들어야 한다. 산탄총 수술의 특수한 경우로 본다
"변경할 때마다 많은 클래스를 조금씩 수정해야 하고, 변경할 곳이 널려 있어 찾기 어렵고 빠뜨리기 쉽다"는 설명은 산탄총 수술이다. "한 클래스를 여러 이유로 고친다"는 설명이면 확산적 변경이다.
- ↑ Martin Fowler, 『Refactoring: Improving the Design of Existing Code』, Addison-Wesley, 1999, 3장 Bad Smells in Code.
- ↑ 2.0 2.1 「Shotgun Surgery」, Refactoring.Guru, https://refactoring.guru/smells/shotgun-surgery, 확인일: 2026-11-05.
- ↑ 「Divergent Change」, Refactoring.Guru, https://refactoring.guru/smells/divergent-change, 확인일: 2026-11-05.