DI란 무엇인가? DI를 사용하면 무엇이 좋은가?

kdkdhoho·2023년 4월 21일
0

Spring

목록 보기
23/26

DI란?

우선 Spring 공식문서에서 설명하는 의존성 주입(Dependency Injection, 이하 DI)에 대해 살펴보겠습니다.

DI란, 객체가 생성자의 파라미터나 팩터리 메서드에 대한 파라미터로 객체의 인스턴스가 생성되거나 혹은, 팩터리 메서드에서 반환된 후 객체 인스턴스에 설정된 속성을 통해서만 종속성, 즉 함께 작업하는 다른 객체를 정의하는 프로세스입니다.

그런 다음 컨테이너는 빈을 생성할 때, 이러한 종속성을 주입한다고 합니다.

여기서, 이 말에 집중할 필요가 있습니다.
컨테이너는 빈을 생성할 때, 종속성을 주입한다.
이때 외부에서 '의존성을 주입한다' 라고 할 수 있습니다.

그리고 동시에 다른 곳에선, '의존성을 주입받는다'라고 할 수도 있겠죠.

의존성에 대해서는 링크를 참고하세요.

DI 원칙을 사용했을 때의 장점

  1. 코드가 더 깔끔해지며, 객체에 종속성이 제공될 때 결합도가 더욱 느슨해집니다.
    이는 변경을 더욱 유연하게 만듭니다.

  2. 한 객체가 의존하는 다른 객체에 대한 구현체가 어떤 것인지 알 필요가 없습니다.

  3. 특히, 종속성이 인터페이스나 추상 베이스 클래스라면 단위 테스트 시에 stub 혹은 mock 구현체를 사용할 수 있게 되어, 테스트가 용이해집니다.

자동차 경주의 Car 객체 코드로 더욱 쉽게 이해해보겠습니다.

// 레거시
public class Car {
    private final RandomNumberGenerator randomNumberGenerator = new RandomNumberGenerator();
    
    ...
}

현재 Car 객체는 무작위의 난수를 생성하는 RandomNumberGenerator를 의존합니다.
의존하는 방법으로 클래스 내부에서 직접 구현체를 사용하네요.

여기서 만약, 난수가 아닌 2의 배수의 수를 생성하는 구현체로 바꾸고 싶다면 추가와 동시에 Car 내부에서 구현체를 바꾸고 그에 따른 행동도 바뀔 수 있습니다.

게다가 Car 객체에서 RandomNumberGenerator를 사용하는 부분의 단위 테스트를 한다면, 외부에서 랜덤성을 도무지 컨트롤 할 방법이 없습니다.

이를 외부에서 의존성을 주입받아 모두 해결할 수 있습니다.

// 개선
public class Car {
    private final NumberGenerator numberGenerator;

    public Car(final NumberGenerator numberGenerator) {
        this.numberGenerator = numberGenerator;
    }
}

이제 다시 위로 돌아가서, 장점 3개를 다시 읽어보면 모두 쉽게 이해가 갈 것이라 생각합니다.

결론

우리는 변경에 유연한 코드를 항상 염두에 두고 개발해야 합니다.

그러기 위해서는 종속성이 필요한 객체에 대해서, 좀 더 변경에 유연한 설계와 코드를 위해 DI를 써야 합니다.

또, 객체지향의 꽃인 다형성을 아주 잘 활용할 수 있는 방법이기도 합니다.

참고

profile
newBlog == https://kdkdhoho.github.io

0개의 댓글