모듈화

모듈 생성

명령어 : nest g mo cats

(공식 문서 참조) nest g modules cats

이런식으로 해도 된다고 함.

위와 같이 실행하면 modules.ts 파일에

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';

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

CatsModule 이 추가 된 것을 확인할 수 있다.

서비스, 컨트롤러 생성

모듈을 생성한 것처럼, 서비스, 컨트롤러도 cli로 생성 할 수 있다.

> nest g co cats
> nest g service cats

위와 같이 실행하면 cats.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 {}

위와 같이 Controller와 Service를 만들어주는 것을 확인할 수 있고 해당 파일도 생성됨을 확인할 수 있다.

  • cats.controller.spec.ts 라는 파일은 테스트를 위함으로 생성된다.

export 와 캡슐화의 개념

기본적으로 공급하는 Service 공급자는 캡슐화가 되어 내보내기를 할 수 없다.

그러나 다른 컨트롤러에서 해당 Service를 사용하고 싶다면

예를들어

constructor(private readonly appService: AppService, private readonly catService: CatService)

위와 같이 사용하고 싶다면

cats.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 {}

위와 같이 export에 추가하여 주면 사용할 수 있게 된다.

캡슐화에 대한 보충 설명

만약 exports 를 쓰지 않으면 app.moduels.ts 에서

@Module({
  imports: [CatsModule, UsersModule],
  controllers: [AppController],
  providers: [AppService, CatsService],
})

이렇게 넣어주고 사용할 수 있게 된다.

그런데 이러면 provider에 하나하나 추가해줘야 한다 이건 나누는 의미가 없어진다. 다 추가해줘야하면 양이 많아질수록… 다 넣어줘야 하기 때문에

그러므로 exports를 사용해서 은닉화를 풀어준다고 보면 되는 것이다.