상세 컨텐츠

본문 제목

의존성 주입(Dependency Injection)

programming/NestJs

by Dohangang 2023. 7. 20. 19:53

본문

 

 

 

 

NestJS로 프로젝트를 시작하기에 앞서 의존성 주입에 대해 알고 넘어가고자 한다.

과거 협업을 통해 처음 접해봤던 NestJS에서 가장 기억에 남는 개념은 의존성 주입이었다. JAVA와 Spring에 대한 이해가 없고 Node.js와 express만 사용해왔던 afterWe-backend 팀을 위해, 의존성 주입에 대한 정리를 해보고 공유한다면 좋을 것 같아 주제를 선정하게 되었다. 필자의 해석이 들어간 글이므로 진실의 유무보다는 이해를 하는데 중점으로 보길 바란다.

 

 

 


 

 

 

 

무엇인지 알아보기에 앞서 의존성 주입필요한지부터 알아보자.
사람의 여러가지 행동들을 담게 될 Human 클래스가 있다고 가정해보자.

이 Human 클래스는 '행동하다'라는 메소드를 갖고있다. 그런데 이 Human 클래스의 '행동하다' 메소드가 Study 클래스에 있는 메소드를 직접 사용하게 된다면 어떻게 될까?

다른 '행동'을 작동하기 위해 가져올 클래스를 변경하고 사용할 메소드를 고치는 등 많은 양의 코드를 수정해야할 것이다.

 

Study에서 Exercise로 행동을 바꾸기 위한 코드 수정 이미지

 

이 방법으로 코드를 짜게 된다면 코드에 변경이 있을 경우 해당 변경에 의존성을 갖는 한 코드라도 수정하지 않으면 오류가 날 수 있다.

이러한 점을 방지하기 위해 우리는 '의존성 주입'이라는 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴을 사용하게 될 것이다.

 

위의 코드를 보면 클래스들 사이에 형성된 관계이고 그 결합이 강해보인다.
올바른 객체지향적 설계라면 객체들의 관계형성이 옳다고 한다.

 

 

 

 

바로 의존 관계 문제를 해결한 코드를 보자

위의 코드를 보면 interface를 사용하여 클래스 외부에서 객체를 생성하여 해당 객체를 클래스 내부에 주입한 것을 볼 수 있다.

 

 

 

위와 같이 의존성 주입을 사용하여 코드를 작성하는데 얻는 이점을 대표적으로 보자면 아래 네가지를 볼 수 있다.

 

1. 의존성이 줄어든다.

- 주입 받는 대상이 변경되더라도 그 구현 자체를 수정할 일이 없거나 적어짐

2. 재사용성이 좋은 코드가 된다.

- Human에서만 활용가능 했던 메소드들을 다른 클래스에서 재사용할 수 있음

3. 테스트하기 좋은 코드가 된다.

- 분리된 class들을 따로 테스트할 수 있음

4. 가독성이 좋다.

- 별도로 분리된 기능들은 자연스럽게 가독성 상승

 

 

 

정리해 보자면,

의존성 주입을 도와주는 Container는 강하게 결합된 클래스들을 분리, 애플리케이션 실행 시점에 객체들의 관계를 설정해주기 때문에 결합력은 낮추고 유연성은 확보해준다. 단, 한 객체가 다른 객체를 주입 받으려면 반드시 Container에 의해 관리되어야 한다.

두 객체 간의 관계라는 관심사의 분리, 두 객체 간의 결합력을 낮추고, 객체의 유연성을 높이며, 테스트를 용이하게 해주는 의존성 주입을 우리는 알아두는 것이 좋을 것이다.

 

 

 


 

 

 

 

처음 NestJS를 접하고 의존성 주입에 대해 공부할 때에는 class, this, 인스턴스, 객체, 객체지향, 상속 등 기본 실력이 부족해서 학습을 위해 읽었던 한글 설명들이 한글처럼 보이지도 않았다. Computer Science 지식들을 학습해나가며 부족함을 채우는 요즘, 해당 글을 작성하면서 조금은 도움이 된 것 같다.

 

제대로 된 이해를 위해서 implements와 extends, interface와 class, IoC(Inversion of control), 상속에 대해서도 더욱 자세히 알 필요가 있어보인다.

 

 

IoC

인스턴스를 저장하는 공간을 우리는 Container라 부른다

제어 권한이 Container에 있다

이를 우리는 IoC(Inversion of control)제어 역전이라고 부르며, 인스턴스를 저장하는 Container를 Ioc Container라고 부른다