관련 Controller와 Provider를 기능 모듈로 묶습니다.
Feature Module은 기능의 provider와 controller를 함께 구성하고 외부에 필요한 provider만 exports로 공개합니다. 루트 모듈은 기능 모듈을 조합합니다.
모듈 경계는 기술 계층만이 아니라 업무 기능과 변경 책임을 반영합니다.
순환 의존성이 생기면 forwardRef보다 책임과 데이터 흐름을 먼저 재검토합니다.
모든 provider를 Global 모듈에 넣으면 의존성과 초기화 순서가 숨습니다.
로컬 프로젝트에서 확인해보세요ProgressModule을 추가하고 AppModule에서 함께 import하세요.
import "reflect-metadata";
import { Controller, Get, Injectable, Module } from "@nestjs/common";
import { NestFactory } from "@nestjs/core";
@Injectable()
class CourseService {
summary() {
return { course: "NestJS", progress: 60 };
}
}
@Controller("courses")
class CourseController {
constructor(private readonly service: CourseService) {}
@Get() summary() {
return this.service.summary();
}
}
@Module({
controllers: [CourseController],
providers: [CourseService],
exports: [CourseService],
})
class CourseModule {}
@Controller()
class HomeController {
@Get() home() {
return `<main><a href="/courses">기능 모듈 API</a></main>`;
}
}
@Module({ imports: [CourseModule], controllers: [HomeController] })
class AppModule {}
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(4173, "0.0.0.0");
}
bootstrap();