ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.