NestJS Dependency injection

Outclass·2022년 7월 15일
0

NestJS+GraphQL+TypeORM 

목록 보기
6/16

Dependency Injection(의존성 주입, DI)은 백엔드를 접하다보니 계속해서 보게 되는 용어이다. 사실 생소한 개념이어서 명료하게 이해되지는 않았지만, Nest를 배우면서 어느정도 감을 잡을 수 있었다.

오늘은 DI가 무엇인지에 대한 정리와 함께 Nest에서는 DI를 어떻게 사용할 수 있는지 간략하게 정리해보려고 한다.

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라는 개념의 큰 그림을 보게 되니 생각이 다소 정리가 된 것이다.

그리고 이 디자인 패턴의 핵심은 하나의 클래스가 어떤 기능을 수행하는데 있어서 필요한 서비스나 객체를 직접 생성하지 않고 외부 소스로부터 주입받는 것이라는 것이다. 일단 더 복잡한 내용들은 나중에 더 알아보고, 이정도까지만 일단 정리해본다.

Nest에서 DI사용하기

@Injectable() 데코레이터

해당 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

profile
When you stop having big dreams that’s when you’ve died, despite not being buried yet.

0개의 댓글