Nestjs::nomad::2.6~

YP J·2023년 2월 13일
0

Nestjs

목록 보기
4/6

2.6 Modules and Dependency Injection

  • 모듈을 좀더 좋은 구조로 만들기위해?
import { Module } from '@nestjs/common';
import { MoviesController } from './movies/movies.controller';
import { MoviesService } from './movies/movies.service';

@Module({
  imports: [],
  controllers: [MoviesController],
  providers: [MoviesService],
})
export class AppModule {}
  • 현재 구조인데

  • 사실 app.module은 AppController랑 AppProvider만 가지고 있어야한다.

  • 그래서 여기있는 MoviesService랑 MoviesController를 movie.module로 옮겨볼거다

  • 왜냐면 NestJS 에서 앱은 여러개의 모듈로 구성 되기때문.

  • 그래서 이경우 에는 app.module은 AppService랑 AppController만 가져야한다.


  • nest generate module 터미널에 치고 이름을 movies로 하면
CREATE src/movies/movies.module.ts (83 bytes)
UPDATE src/app.module.ts (348 bytes)
  • 2가지가 변경되는데
import { Module } from '@nestjs/common';
import { MoviesController } from './movies/movies.controller';
import { MoviesService } from './movies/movies.service';

@Module({
  imports: [],
  controllers: [MoviesController],
  providers: [MoviesService],
})
export class AppModule {}

에서
import { MoviesModule } from './movies/movies.module'; 추가 되고

  • movies.module.ts 파일이 create된다
import { Module } from '@nestjs/common';

@Module({})
export class MoviesModule {}

  • 이제 app.module을 수정해보자
  • cli에 nest generate controller 치고 이름은 app
  • 원하면 app.controller 바깥으로 빼도된다.
  • spec 테스트 파일은 일단 삭제

이제 app.module은 app.controller라 불리는 controller를 가지고 있다.

import { MoviesModule } from './movies/movies.module';
import { AppController } from './app/app.controller';

@Module({
  imports: [MoviesModule],
  // controllers: [MoviesController, AppController],
  controllers: [AppController],
  providers: [],
})
export class AppModule {}
  • 잘 작동하는지 check - nest start --watch

  • 잘 작동한다면

  • 이 controller에서 뭘 하게 만들면 될까 ?

  • 일단 웰컴 페이지 하나를 가져오게 해보자

import { Controller, Get } from '@nestjs/common';

@Controller('')
export class AppController {
    @Get()
    home() {
        return 'Welcome fucker~'
    }
}
  • 이게 AppController 를 가질때 app.controller가 하는일이다.

  • 즉, 구조가

import { MoviesModule } from './movies/movies.module';
import { AppController } from './app/app.controller';

@Module({
  imports: [MoviesModule],
  // controllers: [MoviesController, AppController],
  controllers: [AppController],
  providers: [],
})
export class AppModule {}
  • 여기에 여러가지를 import 하고 NestJS가 앱을 구동하면
  • 모든걸 하나의 모듈로 생성해준다.
    • main.ts
const app = await NestFactory.create(AppModule);

What is Dependency injection ?

  • movies.Controller.ts 에서

    @Get()
    getAll() :Movie[] {
        return this.movieService.getAll()
    }
  • this.moviesService.getAll()을 사용하고있다.
  • 이게 작동하는 이유는 moviesService라 불리는 property를 만들고 타입을 지정해줘서 그렇가
@Controller('movies')
export class MoviesController {
    constructor(private readonly movieService: MoviesService) {} // 이 부분 property만들고 타입지정 
    
    @Get()
    getAll() :Movie[] {
        return this.movieService.getAll()
    }
  • 타입 만 import해서 쓰고 있다. (MoviesService)

  • app.modules.ts 파일 보면

import { Module } from '@nestjs/common';
import { MoviesController } from './movies.controller';
import { MoviesService } from './movies.service';

@Module({
    controllers: [MoviesController],
    providers: [MoviesService],
})
export class MoviesModule {}
  • MoviesModule을 보면 Controller랑 Provider를 import 하고있는데
  • 위 파일에서 모든게 이루어진다.
  • providers가 여기있는 모든것들을 (MoviesController 클릭해서 movies.controller.ts 파일) import 해서 타입을 추가하는 것만으로 잘 작동한다.
  • 이걸 의존성 주입이라고한다.
  • 즉, providers 에 providers: [MoviesService] 이렇게 주면
  • NestJS 가 MoviesService를 import하고 Controller에 inject 할거다.
  • 그래서 MovieService클래스 위에 @Injectable이 있는것.

2.7 Express on NestJS

  • NestJS는 Express위에서 돌아간다.
  • 그래서 컨트롤러에서 Request, Response 객체가 필요하면 사용할수있다.
    @Get()
    getAll(@Req() req, @Res() res): Movie[] {
        return this.movieService.getAll()
    }
  • 이렇게 req나 res 같은 Express객체를 직접적으로 사용하는게 좋은방법은 아니다.
  • NestJS 는 두개의 프레임워크랑 작동한다.
  • 기본적으로 Express 위에서 실행되는데
  • 이걸Fastify라는걸로 전환시킬수 있다.
  • 즉, Nest는 Express프레임워크를 사용하도록 만들수있고
  • 또한 Fastify 같은 다른 라이브러리와 호환된다.
  • Fastifty는 Express보다 2배 빠름.

    근데 NestJS가 이 두개의 프레임워크에서 돌아가는데
    Express 에서 req,res객체를 많이 사용하지 않는게 왜 중요 하지 ?????

    • 내 생각으로는 NestJS 에서 프레임 워크를 쓰는건데 Express에서 쓰는 req, res객체를 req.json 이렇게 접근하는 방식이 Fastifty에선 원하는 방식이 아닐수도 있으닌가 나중에 호환성을 위해 한족으로 치우쳐저 있는 방식으로 하지 말라는것 같다.
profile
be pro

0개의 댓글