-
14주차 TIL (2)TIL ( Today I Learned) 2023. 2. 14. 20:55
오늘은 Nest.js 를 사용하게 되면서 알아야할 기본용어 몇가지만 살짝 정리해 보려고 한다.
데코레이터
Nest.js 에서 데코레이터란 @ 기호를 통해 사용할 수 있다.
또한 데코레이터는 해당 클래스나 함수가 어떤 역할을 하는지에 대해 Nest.js 에게 알려주는 역할을 한다.
예를 들면
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; @Module({ // 모듈로서의 역할을 수행하겠다 -> Nest.js 에게 말함 imports: [], controllers: [AppController], providers: [AppService], }) export class AppModule {}
위와 같은 코드에서 AppModule 이란 클래스는 @Module 이라는 데코레이터를 통해 모듈로써의 역할을 수행하겠다는 것을 Nest.js에게 알려주는 것이다.
다른 예제를 또 한번 들어보면
import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() // 컨트롤러로서의 역할을 수행하겠다. -> Nest.js 에게 말함 export class AppController { constructor(private readonly appService: AppService) {} @Get() // Get 역할을 수행하겠다. -> Nest.js 에게 말함 getHello(): string { return this.appService.getHello(); } }
위의 코드에서는 AppController 라는 클래스는 컨트롤러로서의 역할을 수행하겠다고 알리는 것이고
getHello 라는 메서드는 Get의 역할을 수행하겠다고 Nest.js 에게 데코레이터를 통해 알려주게 되는 것이다.
IOC (Inversion of Control)
IOC 란 쉽게 말하면 제어의 역전인 것이다. 즉 우리가 객체의 생성과 소멸을 직접 제어하는 것이 아닌 컨테이너에 넘겨주는 것을 얘기하는 것이다.
한가지를 예로 들면
import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() export class AppController { private appService: AppService; constructor() { this.appService = new AppService; } @Get() getHello(): string { return this.appService.getHello(); } }
위와 같은 코드에서 우리는 new라는 연산자를 통해 인스턴스를 생성하고 사용할 수 있었지만 의존성을 역전하게 되면
// app.controller.ts import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() export class AppController { constructor(private readonly appService: AppService) {} @Get() getHello(): string { return this.appService.getHello(); } } ///////////////////////////////// // app.service.ts import { Injectable } from '@nestjs/common'; @Injectable() export class AppService { getHello(): string { return 'Hello World!'; } } ///////////////////////////////// // app.module.ts @Module({ imports: [], controllers: [AppController], providers: [AppService], })
app.service.ts 파일에서 @Injectable() 이란 데코레이터를 통해 app.module.ts 의 providers 에 AppService 를 적어줌으로써 우리가 직접 제어하는것이 아닌 Nest.js 프레임 워크에 제어권을 넘기는 것이다. 따라서 우리는 App.controller.ts 에서 의DI를 통해 의존성을 주입해주게 되면 new 라는 연산자를 사용하지 않아도 AppService 의 메소드를 사용할 수 있게 되는 것이다.
DI (Dependency Injection)
DI 란 의존성을 주입한다는 것이다.
의존성 주입이란 하나의 객체가 다른 객체의 의존성을 제공하는 것을 말하는데, 의존성 주입을 통해 코드의 결합도를 느슨하게 만들고, 객체의 생성과 사용을 분리하여 코드의 가독성과 재사용성을 높여준다.
import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() export class AppController { constructor(private readonly appService: AppService) {} @Get() getHello(): string { return this.appService.getHello(); } }
아까 예제를 들었던 코드를 살펴보면 Nest.js 에서는 constructor(private readonly appService: AppService) {} 라는 코드를 통해서 AppController 에 AppService 의 의존성을 주입한다 라고 볼 수 있다.
따라서 우리는 AppController 클래스 안에서 this 라는 키워드를 통해 AppService 의 메소드에 접근 할 수 있는 것이다.
'TIL ( Today I Learned)' 카테고리의 다른 글
14주차 TIL (4) (0) 2023.02.16 14주차 TIL (3) (0) 2023.02.15 14주차 TIL (1) (0) 2023.02.13 10주차 TIL (4) (0) 2023.01.19 10주차 TIL (2,3) (1) 2023.01.18