Published on

DI Dependencies Injection

Authors
  • avatar
    Name
    Luffy Yeon
    Twitter

DI란

얼마전 GDG Campus Korea에서 주최하였던 Front EndGame에서 DI에 대해 간략히 설명해주신 분들이 많아, DI에 대해 간단히 정리해보았다.


DI는 **객체 의존성(Object Dependencies)**으로 객체들 간에 서로 의존성을 가지는 것을 말한다. 당연한 말을 풀어쓴거 같지만 ^^;


DI는 의존성 주입(Dependency Injection)은 **제어의 역전(Inversion Of Control)**과 연관되어있는데, IoC는 제어 반전, 제어의 반전, 역제어는 프로그래머가 작성한 프로그램이 재사용 라이브러리의 흐름 제어를 받게 되는 소프트웨어 디자인 패턴을 말한다. (from wiki)


다시 DI로 돌아와서.. 여기서 DI 패턴을 사용하는 이유는 객체간에 서로 너무 밀접하게 연관, 결합 되어 있다면, 객체는 다른 객체에 의존성을 가지게되며 객체 생성 등에 자유롭지 못하게 된다.

  • 객체 수정시 의존하고 있는 모듈도 함께 수정해야 하는 경우 발생
  • Unit Test 작성 어려워짐

이를 방지하기위해 constructor, method 등을 통해 다른 객체를 주입 받는 형태의 패턴을 DI 패턴이라고 한다.



간단한 예로

class sCpu {}
calss lCpu {}
class MyComputer {
constructor() {
this.cpu = new sCpu();
}
}

다음과 같은 코드가 있다고 했을때 MyComputer는 lCpu를 사용하고 싶어도 sCpu 밖에 사용하지 못한다.
lCpu를 사용하고 싶다면 다른 Class Computer를 만들고 lCpu를 사용하게 된다면 불필요한 코드만 생성
여기서 MyComputer가 Cpu를 주입 받을 수 있다면?

class sCpu {}
calss lCpu {}
class MyComputer {
constructor(cpu) {
this.cpu = cpu;
}
}
const scpu = new sCpu();
const lcpu = new lCpu();
new MyComputer(scpu);
new MyComputer(lcpu);

다음과 같이 cpu를 교체해가며 MyComputer 생성 가능. 혹은 setter 메소드를 활용하는 방법도 있다.