의존성 주입

seunghyun·2024년 9월 8일
0

왜 필요한가?

기능을 제공하는 객체와 기능을 이용하는 객체 사이에 직접적인 참조가 일어나지 않도록 하기 위해 의존성을 관리하는 테크닉으로,

직접 참조 없이 해당 클래스의 기능을 활용하거나 의존 관계를 별도의 구성 파일로 관리할 수 있다.

Dependency Injection (DI) | 의존성 주입

먼저 당연히도,,, 의존성이란 단어의 의미를 알아야 한다.

예를 들어 아래 코드에서는 클래스 A가 클래스 B를 직접 참조하고 생성 하므로 A는 B에 의존적이다.

즉 B가 변하면 무조건 A도 수정해야 하는 관계이다. A는 B에 의존적이다.

class A
{
	new b = new B()
    ...
}

class B
{

}

그리고 주입이란? 말 그대로 넣어주다 라는 의미를 가진다.

그렇다면 의존성 주입이란?

위 코드처럼 A가 B에 의존할 때 B를 직접 생성하는 것이 아니라, 외부에서 B 클래스 인스턴스를 생성해서 주입해주는 것이다.

그래서 의존성 주입이란, 메인 모듈이 '직접' 다른 하위 모듈에 대한 의존성을 주기보다는 중간에 의존성 주입자(dependency injector)가 이 부분을 가로채 메인 모듈이 '간접'적으로 의존성을 주입하는 방식이다.

이를 통해 메인 모듈과 하위 모듈 간 의존성을 느슨하게 만들 수 있고, 모듈을 쉽게 교체 가능한 구조로 만든다.

그래서 의존성 주입을 할 때는 의존관계역전원칙(Dependency Inversion Principle) 이 적용된다.

이는 2가지의 규칙을 지키는 상태를 말하는데,

  • 상위 모듈은 하위 모듈(구현 클래스. 구현체. 배우.)에 의존해서는 안 된다. 둘 다 추상화(인터페이스. 역할. 배역.) 에 의존해야 한다.

  • 추상화는 세부사항에 의존해서는 안 된다. 세부 사항은 추상화에 따라 달라져야 한다.

Inversion Of Control (IOC) | 제어의 역전

기존에는 (개발자가) 의존성을 직접 제어했다면, 의존성을 직접 제어하지 않겠다는 의미이다. 대신 중간에 매개체를 두고, 매개체를 통해서 (매개체에게 제어를 일임해서) 제어하겠다는 의미이다.

이 때 매개체란? IoC Container 라고 하여 이에 필요한 모든 모듈들을 등록해둔다. 그리고 사용처에서 직접 생성이 아니라, 필요할 때 IoC Container가 의존성이 있는 모듈들을 주입해주는 방식이다.

개발자에게 일임받은 제어권을 사용하여 의존성을 관리하고, 인스턴스를 생성하여 주입해주고, 나중에는 메모리를 해제하는 역할까지 한다. 주로 프레임워크가 이 역할을 포함한다.

장점

의존성 주입을 하면 프로그램에 꼭 필요한 중요 역할이 여러 클래스로 분산된다. 의존성을 생성하는 그 막강한 권한이 소비자 객체에서 다른 곳으로 옮겨간다. 처음에는 객체가 자신의 의존성을 스스로 생성하고 관리할 권한을 잃는다는게 부정적으로 느껴질 수 있지만 이렇게 함으로써 개발자가 그 권한을 얻게 된다.

그래서 이를 정리하면,

  • 의존성 감소

    • 변화에 강함
    • 재사용성이 더 좋아짐
    • 유지보수 용이
  • 코드 양 감소

  • 유닛 테스트 및 마이그레이션 용이

단점

  • 결국 모듈이 하나 더 생긴다.
  • 종속성 주입 자체가 컴파일을 할 때가 아닌 런타임 때 일어나므로, 컴파일을 할 때 종속성 주입에 관한 에러를 잡기가 어려워질 수 있다.

방법

  1. Setter Injection

  2. Construction Injection

profile
game client programmer

0개의 댓글