서론
Nest.js는 캡슐화를 지향한다.
캡슐화란 특정 클래스가 모듈에 포함되지 않았거나 해당 모듈에서 직접 exports
를 통해 내보낸 것이 아니면 외부에서 접근을 하지 못하게 만드는 것이다.
Nest.js의 모듈은 기본적으로 providers
(공급자)를 캡슐화한다.
Case 1
각 모듈 간에는 서로 필요한 클래스를 의존성 주입
(DI: Dependency Injection)을 통해서 사용할 수 있다.
그 방법에는 2가지가 있다.
먼저 첫 번째 방법은 별로 추천하지는 않지만 어쨌든 돌아가긴 돌아가는 방법이다.
사용하고 싶은 클래스가 속해있는 모듈을 imports
에 넣고, providers
에는 그 클래스를 명시하는 것이다.
하지만 이 방법은 해당 모듈에서 사용하는 클래스가 많아질수록 providers
목록을 관리하기가 힘들다.
또한 Nest.js가 추구하는 방향성(캡슐화) 또한 아니다.
다음은 AppController 에서 CatsService 를 사용하는 예이다.
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
import { CatsService } from './cats/cats.service';
@Module({
// CatsModule을 import
imports: [CatsModule],
controllers: [AppController],
// providers에 CatsService 추가
providers: [AppService, CatsService],
})
export class AppModule {}
import { Controller, Get, Query } from '@nestjs/common';
import { AppService } from './app.service';
import { CatsService } from './cats/cats.service';
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
private readonly catsService: CatsService,
) {}
@Get()
getHello(): string {
return this.catsService.test();
}
}
Case 2
2번째 방법은 다른곳에서 사용될 클래스를 exports
해주고, 그 클래스를 사용하는 모듈에선 그 클래스가 속해있는 모듈만 imports
하여 사용하는 방법이다.
특정 모듈의 exports
에 명시된 클래스들은 해당 모듈을 import
하는 것만으로도 모두 접근할 수 있다.
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 {}
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],
// CatsService를 명시해주지 않아도 됨
providers: [AppService],
})
export class AppModule {}
import { Controller, Get, Query } from '@nestjs/common';
import { AppService } from './app.service';
import { CatsService } from './cats/cats.service';
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
private readonly catsService: CatsService,
) {}
@Get()
getHello(): string {
return this.catsService.test();
}
}