220112 TIL 의존성 주입/의존성 역전

들어가기 전

테스트 코드를 작성하는 중 다음과 같은 문제점이 발생했었다.
예를들어 A 클래스에서 B 클래스를 외부로 불러와 사용한다면

const B = require('./b')

class A {
  constructor(){
    this.b = new B();
  }
  
  getExample(){
    return this.b.getExampleCodes()
  }
}

A 클래스의 getExample() 코드가 잘 작동하는지 테스트하기 위해 B클래스를 mock함수로 구현해야했고,
B함수의 내부사항인 getExampleCodes()을 mocking해서 만들어야 했다.

const getExampleCodes = jest.fn(()=>{
  // return할 값
});

getExampleCodes()의 재사용성이 떨어지는 문제점이 발생한다.

그런데 여기서 의존성 주입의 원칙에 어긋난다는 말을 들었다.
의존성 주입이라는 것은 무엇일까?

의존성 주입이란?

위 예제를 아래 코드로 다시 살펴보면 A 클래스 내부에 B 인스턴스를 생성했기 때문에 의존성 주입이 아닌 의존성을 스스로 만들어서 사용한 것이다.

const B = require('./b')

class A {
  constructor(){
    this.b = new B();
  }
  
  getExample(){
    return this.b.getExampleCodes()
  }
}

따라서 위 코드를 아래처럼 변경하면 외부로부터 받아와서 외부에서 주어진 b를 사용만 하면 구체적으로 어떤 모듈의 b를 사용하는지 관심이 없어진다.

class A {
  constructor(b){
    this.b = b;
  }
  
  getExample(){
    return this.b.getExampleCodes()
  }
}

이를 의존성 주입이라고 한다.

그리고 상위 개념으로 '의존성를 역전시킨다'라고도 한다.
외부로부터 주어진 것을 사용하면서 테스트할 때는 테스트용 b를 주입하고 실제 제품에는 실제 b를 주입할 수 있게 됐다.

이렇게 하면 테스트하기가 훨씬 간결해진다.

참고

좋은 웹페이지 즐겨찾기