업무 로직을 Injectable Service로 분리하고 생성자로 주입합니다.
@Injectable provider는 모듈 container가 생성하고 필요한 클래스의 생성자에 주입합니다. Controller는 HTTP를, Service는 업무 규칙을 담당합니다.
구체 구현 대신 좁은 책임의 provider에 의존하면 단위 테스트에서 대역을 주입하기 쉽습니다.
provider는 기본 singleton이므로 요청별 변경 상태를 인스턴스 필드에 보관하지 않습니다.
new CourseService()로 직접 만들면 Nest 생명주기와 의존성 교체를 우회합니다.
로컬 프로젝트에서 확인해보세요findOne 메서드와 찾을 수 없음 오류를 추가하세요.
import "reflect-metadata";
import { Controller, Get, Injectable, Module } from "@nestjs/common";
import { NestFactory } from "@nestjs/core";
@Injectable()
class CourseService {
findAll() {
return [{ id: 1, title: "NestJS DI" }];
}
}
@Controller("courses")
class CourseController {
constructor(private readonly courses: CourseService) {}
@Get() findAll() {
return this.courses.findAll();
}
}
@Controller()
class HomeController {
@Get() home() {
return `<main><a href="/courses">Service 결과</a></main>`;
}
}
@Module({ controllers: [HomeController, CourseController], providers: [CourseService] })
class AppModule {}
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(4173, "0.0.0.0");
}
bootstrap();