다른 모듈에서 Nest.js 서비스 주입

다른 Nest.js 모듈에서 서비스를 주입하려면 적절한 종속성 주입 및 모듈 구성을 보장하기 위한 몇 가지 단계가 필요합니다. 두 개의 샘플 모듈을 사용하여 서비스 내보내기 및 가져오기 프로세스가 어떻게 작동하는지 알아보세요.

Nest.js 프로젝트 생성

Nest.js 프로젝트를 생성하려면 장치에 CLI가 설치되어 있어야 합니다. 그렇지 않은 경우 다음 명령을 실행하여 설치하십시오.

 npm install -g @nestjs/cli

Nest.js CLI가 설치된 상태에서 다음 명령을 실행하여 새 Nest.js 프로젝트를 생성합니다.

 nest new <project-name>

“을 원하는 이름으로 바꿀 수 있습니다. 위 명령을 실행하면 지정된 이름을 가진 새 Nest.js 프로젝트가 생성됩니다.

현재 프로젝트 구조는 아래 이미지와 같아야 합니다.

한 모듈에서 다른 모듈로 서비스 주입을 연습하려면 모듈 a와 모듈 b라는 두 개의 모듈을 생성합니다. 또한 해당 서비스 및 컨트롤러 파일도 생성합니다.

module-a를 생성하려면 다음 명령을 실행하십시오.

 nest generate module module-a

그리고 module-b에 해당하는 명령을 실행합니다.

 nest generate module module-b

그런 다음 이 명령을 실행하여 module-a에 대한 서비스 및 컨트롤러 파일을 생성합니다.

 nest generate service module-a && nest generate controller module-a

그리고 module-b에 해당하는 명령을 실행합니다.

 nest generate service module-b && nest generate controller module-b

현재 프로젝트 디렉터리는 src/module-a 및 src/module-b 디렉터리와 함께 다음과 같아야 합니다.

모듈 A에서 서비스 내보내기

module-a 모듈에서 module-a 서비스를 내보내려면 이를 module-a의 모듈 파일(module-a.module.ts)에 내보내기로 나열해야 합니다. 기본적으로 Nest.js CLI는 @Module 데코레이터에 내보내기 배열을 제공하지 않으므로 생성된 모듈 파일은 다음과 같습니다.

 
import { Module } from '@nestjs/common';
import { ModuleAService } from './module-a.service';
import { ModuleAController } from './module-a.controller';

@Module({
  providers: [ModuleAService],
  controllers: [ModuleAController],
})

export class ModuleAModule {}

module-a를 가져오는 모듈에서 service-a(module-a.service.ts)에 액세스할 수 있도록 하려면 @Module 데코레이터에 내보내기 배열을 만들고 여기에 ModuleAService를 추가하세요.

다음과 같습니다:

 import { Module } from '@nestjs/common';
import { ModuleAService } from './module-a.service';
import { ModuleAController } from './module-a.controller';

@Module({
  providers: [ModuleAService],
  controllers: [ModuleAController],
  exports: [ModuleAService],
})

export class ModuleAModule {}

다음으로, 테스트 목적으로 모듈-a 서비스 파일(module-a.service.ts)에 간단한 기능을 추가합니다.

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

@Injectable()
export class ModuleAService {
  getHello(): string {
    return 'Hello from Module A!';
  }
}

이 함수는 샘플 문자열을 반환합니다. 이 서비스를 올바르게 가져올 수 있는지 확인하려면 서비스-a를 삽입한 후 모듈-b에서 해당 함수를 호출합니다.

서비스를 모듈 B로 가져오기

한 모듈을 다른 모듈로 가져오려면 해당 모듈을 수신 모듈의 imports 배열에 가져오기로 나열해야 합니다. 이 경우 module-b의 @Module 데코레이터 imports 배열에 module-a를 추가해야 합니다.

이전과 마찬가지로 Nest.js CLI는 imports 배열을 자동으로 생성하지 않으므로 수동으로 추가해야 합니다.

먼저 상위 모듈(module-a.module.ts)을 수신 모듈(module-b.module.ts)로 가져오고 imports 배열을 만든 다음 ModuleAModule을 배열에 추가합니다.

 
import { Module } from '@nestjs/common';
import { ModuleBController } from './module-b.controller';
import { ModuleBService } from './module-b.service';
import { ModuleAModule } from '../module-a/module-a.module';

@Module({
  imports: [ModuleAModule],
  controllers: [ModuleBController],
  providers: [ModuleBService],
})

export class ModuleBModule {}

다음으로, module-b.service.ts 파일을 열고 각각 @nests/common 및 ../module-a/module-a.service에서 Inject 데코레이터와 ModuleAServerice를 가져옵니다.

 import { Injectable, Inject } from '@nestjs/common';
import { ModuleAService } from '../module-a/module-a.service';

Inject 데코레이터는 해당 매개변수를 종속성 주입 대상으로 표시합니다.

다음으로 ModuleBService 클래스에 아래 코드 블록을 추가하세요.

 @Inject(ModuleAService)
  private readonly moduleAService: ModuleAService;

위의 코드 블록은 ModuleAService에서 사용할 수 있는 메서드에 대한 ModuleBService 액세스를 제공합니다.

ModuleAService의 getHello 메소드를 호출하여 서비스를 테스트할 수 있습니다.

 
import { Injectable, Inject } from '@nestjs/common';
import { ModuleAService } from 'src/module-a/module-a.service';

@Injectable()
export class ModuleBService {
  @Inject(ModuleAService)
  private readonly moduleAService: ModuleAService;

  getHello(): string {
    return this.moduleAService.getHello();
  }
}

다음으로 module-b.controller.ts 파일을 열고 생성된 코드를 아래 코드 블록으로 바꿉니다.

 
import { Controller, Get } from '@nestjs/common';
import { ModuleBService } from './module-b.service';

@Controller('module-b')
export class ModuleBController {
  constructor(private readonly moduleBService: ModuleBService) {}

  @Get('/hello')
  getHello(): string {
    return this.moduleBService.getHello();
  }
}

위의 코드 블록은 getHello 함수에 대한 GET 경로 핸들러를 설정합니다.

마지막으로, 컬을 사용하여 localhost:3000/module-b/hello에 대한 GET 요청을 수행합니다. 명령은 “Hello from Module A!”를 인쇄해야 합니다. 콘솔에.

다른 모듈에 서비스를 성공적으로 주입했습니다. 이는 서로의 메서드를 호출해야 하는 여러 모듈이 있는 Nest.js를 사용하여 API를 구축할 때 유용할 수 있습니다.

교차 모듈 주입의 이점

다른 모듈에서 서비스를 직접 호출하는 것은 처음에는 간단해 보일 수 있지만 장기적으로 보면 시스템이 더 복잡해지고 유지 관리 및 확장성이 낮아질 수 있습니다.

그러나 교차 모듈 주입은 코드 모듈성과 재사용성을 촉진하여 유지 관리를 더 쉽게 만듭니다. 또한 종속성을 중앙 집중화하고 테스트 가능성을 향상시키며 확장 가능하고 분리된 아키텍처를 지원합니다.