Dependency Injection(의존성 주입, DI)은 백엔드를 접하다보니 계속해서 보게 되는 용어이다. 사실 생소한 개념이어서 명료하게 이해되지는 않았지만, Nest를 배우면서 어느정도 감을 잡을 수 있었다.
오늘은 DI가 무엇인지에 대한 정리와 함께 Nest에서는 DI를 어떻게 사용할 수 있는지 간략하게 정리해보려고 한다.
Nest의 공식문서의 설명을 따라가다 보니, Nest의 DI가 Angular로부터 영향을 받았다는 것을 알 수 있었다(실제로 구현 패턴이 굉장히 비슷하다). 그래서 Angular의 공식문서를 기반으로 개념을 먼저 정리해보려고 한다.
Nest is built around the strong design pattern commonly known as Dependency injection. We recommend reading a great article about this concept in the official Angular documentation. - Nest공식문서
그동안 DI가 무엇인지 헷갈리다가 Angular의 공식문서를 읽으면서 머릿속이 다소 정리가 되었는데, 아래의 정의 덕분이었다.
Dependencies are services or objects that a class needs to perform its function. Dependency injection, or DI, is a design pattern in which a class requests dependencies from external sources rather than creating them. - Angular공식문서
가장 눈에 들어왔던 부분은 DI가 일종의 '디자인 패턴'이라는 점이었다. 그동안 DI, '의존성 주입'이라는 단어 자체를 이해하려고 노력해왔는데, DI라는 개념의 큰 그림을 보게 되니 생각이 다소 정리가 된 것이다.
그리고 이 디자인 패턴의 핵심은 하나의 클래스가 어떤 기능을 수행하는데 있어서 필요한 서비스나 객체를 직접 생성하지 않고 외부 소스로부터 주입받는 것이라는 것이다. 일단 더 복잡한 내용들은 나중에 더 알아보고, 이정도까지만 일단 정리해본다.
해당 Class를 Nest의 DI시스템 안에서 사용할 수 있도록 해준다.
//injectable.serivce.ts
@Injectable()
export class InjectableService {
anyMethod () {
...
}
}
//any.middleware.ts
export class AnyMiddleware {
constructor(
//다음과 같이 서비스를 불러온다.
private readonly injectableService: InjectableService
){}
someMethod () {
//불러온 의존성에 접근할 수 있다
this.injectableService.anyMethod()
}
}
//DI관계를 갖는 두 객체가 같은 모듈안에 있지 않을 경우 아래와 같이 설정해준다
//injectable.module.ts
@Module({
...
//DI할 클래스를 export해준다
exports: [InjectableService],
...
})
export class InjectableModule {}
참고링크
https://docs.nestjs.com/providers#dependency-injection
https://docs.nestjs.com/fundamentals/module-ref
https://angular.io/guide/dependency-injection