-
NestJS - 의존성 주입Framework/NestJS 2021. 11. 28. 15:37
NestJS - 의존성 주입이란
NestJS 의 핵심 중 하나는 바로 의존성 주입(Defendency Injection) 입니다.
의존성 주입(Defendency Injection)
의존성 주입은 제어의 역전(Inversion of Control) 의 기술중 하나입니다.
- 제어의 역전: 개발자가 제어해야할 영역을 프레임워크에게 믿고 맏기는 것.
- 의존성 주입: 개발자가 필요한 자원(클래스, 함수..)들을 외부에서 생성자를 통해 넣어준다.
위키피디아에 실려있는 5살에게 의존성을 설명하는 내용이 있어서 가져와봤습니다.링크
아이가 냉장고에서 스스로 물건을 꺼낼 때 문제가 발생할 수 있습니다. 문을 열어두거나 엄마나 아빠가 원하지 않는 것을 얻게 될 수도 있습니다. 냉장고에 있지 않거나 유통기한이 지난 것을 찾고 있을 수도 있습니다. 그렇다면 아이가 해야 할 일은 "어떤 점심과 함께 마실 것이 필요합니다."라고 정확한 요구 사항을 말하면, 아이의 부모님은 아이가 앉을 때 먹을 것이 있는지 확인합니다.
즉, 아이에게 냉장고 문을 열수 있는 능력을 주는 것이 아닌, 아이의 부모에게 그 일을 위임하여 맡기는 것과 같습니다.
NestJS 에서 의존성 주입하기
xxx.controller.ts
import { UserService } from './user.service'; export class UserController { constructor(private userService: UserService) {} @Get() async findAll() { return await this.userService.findAll(); } }
xxx.service.ts
@Injectable() export class UserService { //... async findAll() { return this.usersRepository.findAll(); } //... }
우선 의존성 주입의 대상을 지정해줘야 하는데 간단합니다.
위의 service 코드 처럼 Injectable 데코레이터를 붙이면의존성 주입의 대상이 됩니다.
이것은 Provider 에 의한 주입대상이 된다는 것입니다.그리고 의존성을 주입한 클래스를 사용하기 위해서는 아래 코드와 같이 해당 컨트롤러가 주입된 모듈 내(xxx.module.ts), providers 필드에 배열로 전달해야 합니다.
xxx.module.ts
@Module({ imports: [], controllers: [UserController], providers: [UserService], }) export class UserModule {}
이제 의존성을 주입만 하면 됩니다.
NestJS 에서는 생성자(Constructor) 를 통해 의존성을 주입할 수 있습니다.constructor(private userService: UserService) {}
의존성을 주입했기에
userService
의 타입만 지정했을 뿐인데 UserService 의 메소드를 호출할 수 있는 것을 보실 수 있습니다.
이는 바로 userService 가 UserService 타입인 것을 NestJS framework 가 인지하고 가 알아서 처리해줍니다(클래스의 생성, 소멸 주기 등등...).프로퍼티 스타일 주입
생성자를 통한 주입이 아닌, 클래스 필드의 형태로도 주입이 가능합니다.
필드 위에 Inject 데코레이더를 사용하면 됩니다//... @Inject() private userService: UserService //...
하지만 공식문서에서는 생성자를 이용한 의존성 주입을 권장한다고 합니다.
'Framework > NestJS' 카테고리의 다른 글
NestJS - Query String 배열(Array)로 처리하기 (0) 2022.02.14 NestJS - numeric query parameter (0) 2021.11.30 NestJS, TypeORM - Entity 상속(inheritance) (0) 2021.11.22 NestJS Circular Dependency(순환 종속성) 문제 (0) 2021.11.22 NestJS, TypeORM - 비밀번호 단방향암호화(Bcrypt) (0) 2021.11.10