Files
2nd/10_Wiki/Topics/Architecture/Breaking Dependencies.md
T

4.4 KiB

Breaking Dependencies

📌 Brief Summary

'Breaking Dependencies(의존성 제거)'는 단위 테스트 작성을 방해하거나 시스템의 유연성을 저해하는 코드 간의 강한 결합을 끊어내는 리팩토링 과정이다 [1-3]. 주로 데이터베이스 연결이나 외부 서드파티 서버 호출과 같이 코드를 독립적으로 실행하기 어렵게 만드는 무거운 자원을 식별하고, 이를 가짜 객체(Mock) 등 가벼운 대체물로 교체하기 위해 수행된다 [1-3]. 이를 통해 개발자는 레거시 코드에 안전한 테스트를 추가하고, 궁극적으로 더 큰 규모의 리팩토링과 새로운 기능을 안전하게 추가할 수 있는 기반을 마련할 수 있다 [2, 4, 5].

📖 Core Content

  • 레거시 코드 딜레마 극복의 핵심: 레거시 코드를 안전하게 리팩토링하려면 테스트가 필수적이지만, 테스트를 작성하려면 먼저 코드를 수정해 복잡한 의존성을 끊어내야 하는 모순적인 상황에 직면하게 된다 [2, 6]. 단위 테스트 작성을 가로막는 문제의 99%는 의존성 문제(Dependency Problem)로 귀결되며, 외부 API 호출, 전역 의존성(Global Dependency), 혹은 생성하기 까다로운 매개변수 등이 이에 해당한다 [1, 7]. 의존성 제거는 이 딜레마를 돌파하는 첫 번째 관문이다 [2].
  • 접점(Seam)의 식별과 활용: 의존성을 끊기 위해 개발자는 소스 코드를 직접 수정하지 않고도 프로그램의 동작을 변경할 수 있는 지점인 '접점(Seam)'을 찾아야 한다 [1, 2, 4]. 예를 들어, 객체 지향 언어에서는 문제가 되는 클래스를 확장(Extend)하여 테스트 환경에서 실제 DB에 연결되지 않도록 메서드의 동작을 덮어쓰는 방식을 취해 의존성을 우회할 수 있다 [8, 9].
  • 의존성 제거를 위한 구체적 기법들: 마이클 페더스(Michael Feathers)는 안전하게 의존성을 끊어내기 위한 24가지의 '의존성 제거 기법(Dependency-Breaking Techniques)' 카탈로그를 제시한다 [10]. 여기에는 매개변수 적응시키기(Adapt Parameter), 메서드 객체 추출(Break Out Method Object), 인터페이스 추출(Extract Interface), 인스턴스 위임자 도입(Introduce Instance Delegator), 생성자/메서드 매개변수화(Parameterize Constructor/Method), 하위 클래스화 및 메서드 재정의(Subclass and Override Method) 등의 실용적인 패턴들이 포함된다 [11, 12].
  • 모듈 및 아키텍처 수준의 의존성 제거: 의존성 분리는 단일 클래스나 메서드 단위의 테스트 목적을 넘어, 시스템 아키텍처를 개선하기 위해서도 사용된다. 윈도우(Windows) 리팩토링 사례에서는 여러 바이너리 간에 복잡하게 얽혀 있던 원치 않는 모듈 간 의존성(inter-module dependencies)을 끊어내기 위해 특정 API 기능을 다른 바이너리로 이동시키고 분할하는 시스템 규모의 리팩토링을 수행했다 [13, 14].

⚖️ Trade-offs & Caveats

  • 코드의 미학적 손상: 기존 코드에 단위 테스트를 적용하기 위해 의존성을 제거하는 과정에서, 불가피하게 임시적인 간접 계층이나 불필요해 보이는 메서드를 추가해야 할 수 있다. 이로 인해 리팩토링의 특정 단계에서는 코드가 이전보다 미학적으로 약간 더 지저분해지거나(uglier) 복잡해지는 제약이 발생한다 [15, 16].
  • 병적인 코드 베이스에서의 어려움: 운이 좋다면 의존성이 작고 국소적으로 모여있지만, 코드가 심각하게 망가진 병적인(pathological) 시스템의 경우 의존성이 수없이 많고 코드 전반에 광범위하게 퍼져 있어 이를 끊어내는 과정 자체가 극도로 고통스럽고 오랜 시간이 소요될 수 있다 [5].
  • 전처리기 및 링커 접점의 부작용: 객체 접점(Object Seams)을 사용할 수 없는 C/C++ 같은 언어에서 전처리기 매크로나 링커를 활용해 의존성을 끊는 방식(Preprocessing / Link Seams)은 테스트 환경과 프로덕션 환경의 차이를 불명확하게 만들어, 파악하기 힘든 까다로운 버그를 유발할 수 있다 [17, 18]. 이러한 방식은 테스트의 유지보수성도 저하시키므로 더 나은 대안이 없는 최후의 수단으로만 사용해야 한다 [19].

Last updated: 2026-05-03