Node.js

[NestJs]의존성 주입과 제어의 역전

무서운승태 2023. 12. 11. 20:16
728x90

nest프레임워크를 공부하다가 보니 의존성 주입과 제어의 역전에 대하여 알게 되었다. 스프링을 공부할 때도 같은 개념이 사용되어 비교적 수월하게 이해하였다. nest의 핵심 이론인 만큼 한 번 더 정리해두려고 한다.

 

의존성 주입이란????

class A {
}

const a = new A();

우리가 일반적으로 class를 생성하고 그 클래스를 바탕으로 인스턴스를 생성하는 과정이다.하지만 다음 코드를 보자. nest의 controller이다.

 

@Controller('posts')
export class PostsController {
  constructor(private readonly postsService: PostsService) {}
}

컨트롤러에서 우리는 postsService를 자유자재로 사용할수있다.그러나 코드를 살펴보면 어디에서도 new라는 키워드를 사용해서 

인스턴스를 만드는 부분이 없다.이 부분을 담당하는 것이 의존성 주입이라는 개념이다. 이것이 왜 필요한지는 다음 제어의 역전까지 설명 후 묶어서 이야기하겠다.

 

제어의 역전이란???

위에서 살펴보았던 우리가 보편적으로 사용하는 인스턴스화 방법이 있다. 이것은 개발자가 직접 하는 행위이다. 반면 nest에서 사용하는 

방식을 보면 누군가가 인스턴스를 생성하고 그것을 주입해주고 있었다. 이처럼 개발자가 제어하는 것이 아닌 프레임워크가 해당 처리를 하는 것을 제어의 역전이라고 한다. 이 제어의 역전 기술의 일종이 의존성 주입이다. 

 

nest에서는 이것을 nest ioc 컨테이너라는 곳에서 담당한다. ioc컨테이너에서 객체를 생성하고 그 객체의 라이프사이클을 관리한다.

그리고 그 객체가 필요한 곳에 의존성 주입을 해준다.

 

그러면 이러한 기술을 왜 사용할까??

 

여러 가지 이유가 있겠지만 가장 큰 이유는 좋은 객체지향 프로그램을 설계하기 위해서일 것이다.

https://ko.wikipedia.org/wiki/SOLID_(% EA% B0% 9D% EC% B2% B4_%EC% A7%80% ED%96% A5_%EC%84% A4% EA% B3%84)

 

SOLID (객체 지향 설계) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 컴퓨터 프로그래밍에서 SOLID란 로버트 마틴[1][2]이 2000년대 초반[3]에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 두문자어

ko.wikipedia.org

solid라는 좋은 객체지향 설계를 위한 이론인데 이중 DIP를 보면 사용하는 이유에 대해 이해하기가 쉽다.

여기서 핵심은 구체화의 의존하면 안 된다 이다. 이 말은 무슨 뜻인가 하면 위에서 보았던 코드를 다시 한번 살펴보자

class A {
}

const a = new A();

우리는 구체적인 클래스 A를 가지고 인스턴스화를 사용하고 있었다. 이렇게 사용할 때 문제점이 무엇일까? 일단 구체적인 클래스 A에 의존하고 있기 때문에 DIP를 위반하고 있다.

 

OCP 또한 위반하고 있다. 우리가 클래스 A에서 클래스 B로 변경한다고 해보자.

class B {
}

const a = new B();

다음과 같이 코드가 변경되었다. 지금은 간단한 예시여서 그냥 바꾸면 되는 거 아닌가? 하지만 이것이 커다란 서비스일 때는 이야기가 달라진다. 이렇게 코드가 변경되어야 하는 것을 프레임워크가 필요한 객체를 대신 생성해 주고 관리해 준다면 코드의 변경이 용이해지고 관리하기 쉬워질 것이다.