728x90
반응형

이전까지 만들었던 모듈을 좀 더 좋은 구조로 만들어보자.

 

app.module.ts

우린 이런 식으로 Controller와 Service를 하나씩 만들었었다.

먼저 모듈을 생성한다는 아래 명령어를 실행해보자.

$nest g mo

 

그다음 이름을 movies로 하게 되면 아래와 같이 되는 것을 확인할 수 있다.

 

먼저 app.module.ts에 먼저 담겨있던 controller와 providers를 삭제한다.

 

app.module.ts

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

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

 

 

 

그다음 movies.module.ts를 아래와 같이 수정해보면 우리는 controller와 providers를 가진 모듈 한 개를 완성한 것이다.

 

movies.module.ts

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

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

}

 

 

 

자 그럼 루트 모듈인 app.module.ts에서의 controllers와 providers는 언제 사용이 될까?

먼저 아래 명령어를 실행해서 app.controller.ts를 생성하고 이름을 app이라 지어준다.

 

$nest g co

 

그다음 app.controller.ts를 아래 사진과 같이 옮기고 app 폴더를 삭제한다.

 

 

app.controller.ts

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

@Controller('app')
export class AppController {}

 

처음 만들 때의 controller의 모습은 위의 코드와 같다.

우리가 첫 라우트 path를 지정할 때  @Controller 안에 이름을 지정을 했었는데, 지금까지 루트 라우터는 없었다.

루트 라우터를 만들어줄 차례다.

 

app.controller.ts

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

@Controller('')
export class AppController {
    @Get()
    home() {
        return 'this is home'
    }
}

이렇게 코드를 바꿔주면 home화면에 this is home 글자를 확인할 수 있을 것이다.

728x90
반응형
728x90
반응형

일단 먼저 우리만의 모듈을 만들어보자. 이름은 cats라고 하겠다.

 

$ nest g module cats

루트 폴더에서 이 명령어를 실행해주면

 

 

이렇게 자동으로 폴더가 생성된다.

 

전체적인 파일 구조는 이런식이 될 것이다.

 

 

Feature Modules(기능 모듈)

 

먼저 cats.module.ts를 다음과 같이 수정해보자.

 

cat.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}

이렇게 controllers와 provider를 가지는 모듈을 한 개 생성하였다. ( controller와 provider는 아직 생성 안 함.)

 

그 다음 app.module.ts(루트 모듈) 파일을 수정해주어야 한다.

 

app.module.ts

import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';

@Module({
  imports: [CatsModule],
})
export class AppModule {}

여기까지가 기능 모듈의 기본적인 예이다. 모듈을 생성하고, 루트 모듈에 연결해주었다.

 

 

Shared Modules( 공유 모듈)

 

Nest에서의 모듈은 기본적으로 싱글톤이다. 여러 모듈간에 쉽게 프로바이더의 인스턴스를 공유할 수 있다.

 

공유를 하기 위해서 만들었던 모듈에 export 옵션을 만들어주어야한다.  여기서 모듈에서 사용하는 용어를 살펴보면,

Providers Nest 인젝터에 의해 인스턴스화 되고 적어도 이 모듈에서 공유될 수 있는 프로바이더
controllers 인스턴스화 되어야 하는 이 모듈에 정의된 컨트롤러 세트
imports 모듈에 필요한 프로바이더를 내보내는 가져온 모듈들
exports 다른모듈에서 import하여 사용되어야 하는 프로바이더의 하위 집합

 

이렇게 되어있다. export를 써보자.

 

cat.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService]
})
export class CatsModule {}

 

이렇게 하면 CatsModule을 가져오는 모든 모듈이 CatService에 액세스 할 수 있다.

( 가져올 때는 import를 써준다. )

 

 

 

Global modules

 

모든 곳에서 동일한 모듈 세트를 가져와야할 때 @Global() 데코레이터를 이용하여 전역 모듈을 생성할 수 있다.

 

import { Module, Global } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Global()
@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService],
})
export class CatsModule {}

 

이런식으로 exports 옵션에 넣어주면 CatService를 필요로 하는 모듈에서 가져와 쓸 수 있다.

Global 데코레이터는 일반적으로 루트 또는 코어 모듈에서 한번만 등록을 해야한다. 서비스를 가져오려는 모듈에서

가져오기 배열에서 CatModule을 가져올 필요가 없다.

728x90
반응형

'Back-End > Nest.js' 카테고리의 다른 글

Nest.js | REST API | More Routes  (0) 2021.09.28
Nest.js | REST API | Movies Controller  (0) 2021.09.24
Nest.js | 개요 | Service  (0) 2021.09.24
Nest.js | 개요 | Controller(2)  (0) 2021.09.24
Nest.js | 개요 | Controllers(1)  (0) 2021.09.24

+ Recent posts