SW 개발 일반/레거시코드와 놀기

레거시 코드와 놀기: 매개변수 적응 기법 (Adapt Parameter)

growdai1y 2025. 1. 17. 06:02

레거시 코드는 소프트웨어 개발자에게 큰 도전 과제가 될 수 있습니다. 시스템이 커지고 복잡해질수록 코드의 의존성은 점점 더 강해지고, 이는 유지보수와 테스트를 어렵게 만듭니다. 하지만 의존성을 제거하고 코드를 개선하는 작업은 매우 중요한 과정입니다. 이 글에서는 의존성이 무엇인지, 왜 의존성을 제거해야 하는지, 그리고 의존성을 제거하는 여러 기법 중 매개변수 적응(Adapt Parameter) 기법에 대해 다뤄보겠습니다.

 

의존성이란 무엇인가?

의존성(dependency)이란, 코드가 다른 클래스, 모듈, 라이브러리 등 외부 요소에 얼마나 의존하고 있는지를 나타냅니다. 의존성이 높으면 높을수록 코드가 다른 시스템에 강하게 결합되어 독립적으로 테스트하기 어렵고, 시스템을 변경할 때마다 리스크가 증가합니다. 예를 들어, 특정 API나 데이터베이스 연결을 코드에 직접적으로 포함시키는 경우, 외부 요소에 의존도가 높아져 테스트나 유지보수가 어려워집니다.

 

의존성 제거가 왜 중요한가?

의존성 제거는 시스템의 유지보수성을 향상시키고, 테스트 가능성을 높이며, 변경 리스크를 줄이는 데 중요한 역할을 합니다. 의존성을 줄이면, 코드가 더 독립적으로 동작하게 되어, 단위 테스트가 용이해지고, 새로운 기능을 추가할 때 다른 시스템에 미치는 영향을 최소화할 수 있습니다.

 

의존성 제거 기법 리스트

의존성 제거에는 다양한 기법들이 존재합니다. 다음은 매개변수 적응 기법부터 서브클래싱을 통한 메소드 재정의 기법까지 총 11가지 기법입니다[각주:1].

  1. 매개변수 적응 (Adapt Parameter)
  2. 메소드 객체 추출 (Extract Method Object)
  3. 전역 참조 캡슐화 (Encapsulate Global Reference)
  4. 정적 메소드 드러내기 (Expose Static Method)
  5. 호출 추출과 재정의 (Extract and Override Call)
  6. Getter 메소드 추출과 재정의 (Extract and Override Getter Method)
  7. 인터페이스 추출 (Extract Interface)
  8. 인스턴스 위임 도입 (Introduce Instance Delegate)
  9. 생성자 매개변수화 (Parameterize Constructor)
  10. 전역 참조를 Getter 메소드로 대체 (Replace Global Reference with Getter Method)
  11. 서브클래싱을 통한 메소드 재정의 (Override Method via Subclassing)

 

매개변수 적응 기법

오늘은 이 중 매개변수 적응 기법을 살펴보겠습니다. 매개변수 적응 기법은 메소드의 매개변수를 수정하여 외부 의존성을 줄이는 방법입니다. 이 기법을 사용하면 코드의 결합도를 낮추고, 테스트를 더 쉽게 만들 수 있습니다.

 

매개변수 적응 기법 (Apdapt Parameter)
매개변수 적응 기법

 

매개변수 적응 기법의 예시

(1) 기존 코드

레거시 코드에서는 종종 테스트하기 어려운 부분이 존재합니다. 예를 들어, HttpServletRequest와 같은 웹 관련 클래스에 직접 의존하는 코드가 있을 수 있습니다. 이 경우, 외부 의존성을 갖는 객체를 메소드 내부에서 직접 다루기 때문에, 테스트가 복잡하고 외부 환경에 영향을 받을 수 있습니다.

public class ARMDispatcher {
    public void populate(HttpServletRequest request) {
        String[] values = request.getParameterValues("pageStateName");
        if (values != null && values.length > 0) {
            marketBindings.put("pageStateName" + getDateStamp(), values[0]);
        }
    }
}

위 코드에서는 HttpServletRequest가 메소드의 매개변수로 사용되고 있습니다. 이는 테스트를 복잡하게 만들고, 실제 웹 서버 환경에서만 동작하도록 강제하기 때문에 단위 테스트를 작성하기 어렵습니다.

(2) 변경된 코드

매개변수 적응 기법을 사용하여 HttpServletRequestParameterSource라는 추상화된 인터페이스로 교체할 수 있습니다. 이렇게 하면 의존하는 객체를 특정 구현체에 묶지 않고, 테스트할 수 있는 환경을 제공할 수 있습니다.

public class ARMDispatcher {
    public void populate(ParameterSource source) {
        String value = source.getParameterForName("pageStateName");
        if (value != null) {
            marketBindings.put("pageStateName" + getDateStamp(), value);
        }
    }
}

(3) 테스트 코드

이제 HttpServletRequest의 의존성을 제거하고, ParameterSource 인터페이스를 사용함으로써, FakeParameterSource와 같은 테스트용 객체를 생성하여 테스트할 수 있습니다.

class FakeParameterSource implements ParameterSource {
    public String value;
    public String getParameterForName(String name) {
        return value;
    }
}

이제 ARMDispatcher는 더 이상 웹 환경에 의존하지 않으며, 단위 테스트가 가능합니다. 외부 의존성을 최소화하면서도 코드의 유연성과 테스트 용이성을 크게 향상시킬 수 있습니다.

 

매개변수 적응 기법의 장점

  • 테스트 용이성: 의존하는 외부 클래스나 시스템이 없으므로, 테스트 환경을 독립적으로 구성할 수 있습니다.
  • 유연성: 특정 구현체에 종속되지 않기 때문에, 다양한 테스트 시나리오에 대응할 수 있습니다.
  • 결합도 감소: 시스템의 다른 부분과의 결합을 줄여, 코드 변경 시 리스크를 감소시킵니다.

 

결론: 매개변수 적응으로 의존성 줄이기

매개변수 적응 기법은 레거시 코드의 의존성을 제거하는 강력한 도구입니다. 코드에서 직접적인 의존성을 추상화된 매개변수로 교체함으로써, 테스트 가능성을 높이고 시스템의 결합도를 줄일 수 있습니다. 레거시 코드가 복잡하다고 느껴질 때, 이런 기법들을 통해 점진적으로 개선할 수 있습니다. 오늘부터 매개변수 적응 기법을 활용해 레거시 코드의 가독성, 유지보수성, 테스트 가능성을 높여 보세요.

 

매일 성장하기

  1. "Working Effectively with Legacy Code" 책에서 24개의 의존성 기법을 설명합니다. 개인적으로 유용했던 11개를 선택했습니다. [본문으로]
반응형