DI & 캡슐화

유석현(SeokHyun Yu)·2022년 12월 22일
0

Nest.js

목록 보기
5/9
post-thumbnail
post-custom-banner

서론

Nest.js는 캡슐화를 지향한다.

캡슐화란 특정 클래스가 모듈에 포함되지 않았거나 해당 모듈에서 직접 exports를 통해 내보낸 것이 아니면 외부에서 접근을 하지 못하게 만드는 것이다.

Nest.js의 모듈은 기본적으로 providers(공급자)를 캡슐화한다.


Case 1

각 모듈 간에는 서로 필요한 클래스를 의존성 주입(DI: Dependency Injection)을 통해서 사용할 수 있다.

그 방법에는 2가지가 있다.

먼저 첫 번째 방법은 별로 추천하지는 않지만 어쨌든 돌아가긴 돌아가는 방법이다.

사용하고 싶은 클래스가 속해있는 모듈을 imports에 넣고, providers에는 그 클래스를 명시하는 것이다.

하지만 이 방법은 해당 모듈에서 사용하는 클래스가 많아질수록 providers 목록을 관리하기가 힘들다.

또한 Nest.js가 추구하는 방향성(캡슐화) 또한 아니다.

다음은 AppController 에서 CatsService 를 사용하는 예이다.


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

app.module.ts

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

app.controller.ts

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 하는 것만으로도 모두 접근할 수 있다.

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

app.module.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],
  // CatsService를 명시해주지 않아도 됨
  providers: [AppService],
})
export class AppModule {}

app.controller.ts

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();
  }
}
profile
Backend Engineer
post-custom-banner

0개의 댓글