다른 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
소스 환경과 대상 환경 모두에서 각 모듈을 활성화하고 실행하는 데 필요한 명령을 실행하세요.
nest generate module module-b
소프트웨어 애플리케이션을 만드는 과정에는 계획, 설계, 코딩, 테스트, 배포 및 유지 관리 등 여러 단계가 포함됩니다. 계획 단계에서는 개발할 시스템의 요구 사항과 목표를 파악하는 것이 필수적입니다. 여기에는 작업 범위 결정, 사용자 요구 사항 정의, 기능 지정이 포함됩니다.
nest generate service module-a && nest generate controller module-a
모듈 A에 대해 다음 명령을 실행합니다: “`bash ./gradlew testDebugUnitTest -p testSetup/build.gradle –info=testDebugUnitTest –tests org.example.modulea. ** “` 모듈 B의 경우 이 명령을 실행합니다: “`bash ./gradlew testDebugUnitTest -p testSetup/build.gradle –info=testDebugUnitTest –tests org.example.moduledb. **
nest generate service module-b && nest generate controller module-b
프로젝트 디렉터리의 현재 구성은 “src/module-a”와 “src/module-b”의 두 하위 디렉터리로 구성되어 있습니다.
모듈 A에서 서비스 내보내기
다른 모듈이 모듈 A에서 제공하는 서비스에 액세스하려면 전자가 해당 모듈 파일 내에 후자의 종속성으로 명시적으로 나열되어 있어야 합니다.그러나 기본적으로 Nest.js 명령줄 인터페이스는 ‘@모듈’ 데코레이터 내에 ‘내보내기’ 배열을 포함하지 않기 때문에 모듈이 내보내지지 않고 다른 모듈이 사용 가능한 서비스를 활용하지 못합니다. 따라서 모듈 A에서 제공하는 서비스를 사용하려면 해당 서비스를 자체 모듈 파일 내의 ‘import’ 배열에 수동으로 추가해야 합니다.
// module-a.module.ts
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 {}
다른 모듈이 ‘모듈-a’가 제공하는 기능을 ‘모듈AService’를 통해 액세스하려면 먼저 해당 서비스를 `@Module` 데코레이터의 `exports` 배열에 포함시켜야 합니다. 이렇게 하면 가져오는 모든 모듈이 `module-a`가 제공하는 서비스를 쉽게 참조하고 활용할 수 있습니다.
원래 문장은 공식적이거나 전문적인 문맥에 적합하지 않은 구어체 표현인 것 같습니다. 좀 더 정제된 표현으로 표현하기 위해 다음과 같이 수정할 것을 제안합니다: “특정 개인이 동료에게 용납할 수 없는 행동과 태도를 보여 왔다는 사실이 알려졌습니다. 우리는 조직의 모든 구성원이 항상 서로를 존중하고 존엄하게 대해야 한다고 굳게 믿습니다. 따라서 우리는 직장 내에서 어떠한 형태의 괴롭힘이나 차별도 용납하지 않을 것입니다.
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 {}
‘module-a’ 서비스에 테스트 기능을 포함하려면 해당 타입스크립트 파일(`module-a.service.ts`) 내에 `testMethod()`라는 새 메서드를 추가하면 됩니다. 이렇게 하면 개발팀이 소프트웨어 수명 주기 동안 이 특정 서비스의 동작과 성능을 평가할 수 있습니다.
import { Injectable } from '@nestjs/common';
@Injectable()
export class ModuleAService {
getHello(): string {
return 'Hello from Module A!';
}
}
모듈 B 내에서 서비스 A의 성공적인 통합을 검증하기 위해 앞서 언급한 함수를 실행하여 테스트 문자열을 생성할 수 있습니다. 이는 적절한 수단을 통해 서비스 A를 통합한 후 해당 기능에 액세스함으로써 달성할 수 있습니다.
모듈 B로 서비스 가져오기
모듈(모듈-a)을 가져와 다른 모듈(모듈-b) 내에서 활용하려면 먼저 후자의 가져오기 배열에 있는 가져오기 항목에 해당 모듈이 나열되어 있어야 합니다. 모듈-b의 @Module 데코레이터의 가져오기 목록에 모듈-a를 추가하면 됩니다.
Nest.js CLI의 이점을 활용하려면 기본적으로 CLI가 자동으로 생성하지 않으므로 ‘import` 배열을 수동으로 생성해야 합니다.
우선 상위 모듈(즉, `module-a.module.ts`)을 대상 모듈(`module-b.module.ts`)에 도입하고, 가져오기 선언문을 설정한 후 가져오기 선언문에서 가져온 항목 목록에 `ModuleAModule`을 추가해야 합니다.
// module-b.module.ts
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 파일에 접근해야 합니다. 여기서는 ‘../module-a/module-a.service’뿐만 아니라 `@nestjs/common`의 Inject 데코레이터와 ModuleAService를 활용하겠습니다.
import { Injectable, Inject } from '@nestjs/common';
import { ModuleAService } from '../module-a/module-a.service';
Inject 데코레이터는 특정 매개변수가 애플리케이션 또는 시스템의 컨텍스트 내에서 제대로 작동하기 위해 외부 소스로부터 프로비저닝이 필요하다는 것을 나타내는 종속성 주입을 받아야 함을 나타내는 데 사용됩니다.
`ModuleBService` 클래스 내에서 `ModuleB` 모듈의 기능을 구현하기 위해서는 다음과 같이 필요한 로직과 연산을 통합한 코드 블록을 포함해야 합니다:
@Inject(ModuleAService)
private readonly moduleAService: ModuleAService;
새 서비스인 `ModuleBService`를 통해 `ModuleAService`에 액세스하는 방법에 대한 정보를 제공해 주셔서 감사합니다. 앞서 제공한 코드 블록에 표시된 것처럼 `
`ModuleAService`의 `getHello` 메서드를 호출하여 저희 서비스를 자유롭게 활용하시기 바랍니다.
// module-b.service.ts
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” 파일에 있는 기존 코드를 제공된 코드 블록으로 교체하세요.
// 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 요청에 의해 트리거되는 URL 엔드포인트를 설정합니다.
궁극적으로
축하합니다! 서비스를 추가 모듈에 효과적으로 통합했으며, 이는 상호 메서드 호출이 필요한 여러 개의 상호 의존적인 모듈이 포함된 Nest.js 애플리케이션을 구성할 때 특히 유용할 수 있습니다.
교차 모듈 주입의 이점
다른 모듈 내에서 서비스에 액세스하기 위해 간접적인 접근 방식을 활용하는 것은 처음에는 간단한 해결책으로 보일 수 있지만, 이 방법론은 시간이 지남에 따라 시스템이 더 복잡해지고 유지 관리가 어렵고 확장성이 떨어지는 경우가 많습니다.
크로스 모듈 인젝션은 코드 모듈성과 재활용성을 향상시켜 유지보수를 용이하게 합니다.또한 종속성을 통합하고 테스트 가능성을 강화하며 확장 가능한 분리형 시스템 설계를 촉진합니다.