제어의 역전 (Inversion of Control, IoC)
전통적인 방식에서는 애플리케이션의 각 컴포넌트가 직접 필요한 의존성을 생성하거나 관리한다. IoC는 제어권을 외부 컨테이너(프레임워크나 라이브러리)에게 넘겨줌으로써, 각 컴포넌트가 직접 의존성을 생성하지 않고 외부에서 주입받게 만드는 설계 원칙이다.
조금 더 풀어서 설명하자면 아래와 같다.
@Controller('posts')
export class PostsController {
constructor(private readonly postsService: PostsService) {}
이전 포스팅에서 컨트롤러의 생성자에 프로바이더가 자동으로 주입이 되고 실행할 수 있게 되는데, 이러한 과정을 NestJS의 IoC 컨테이너가 자동으로 수행한다.
즉, 우리가 PostsService Instance를 생성하지 않아도 NestJS가 관리해주고 있는 것이다.
이것을 제어의 역전이라고 한다. (사용자가 인스턴스를 만들어 주입하는 등의 관리를 하지 않고, 프레임워크 등이 관리하는 것)
의존성 주입 (Dependency Injection, DI)
@Controller('posts')
export class PostsController {
constructor(private readonly postsService: PostsService) {}
NestJS의 IoC 컨테이너에서 프로바이더를 주입하는데, 이 과정을 '의존성 주입' 이라고 한다.
생성자의 매개변수로 프로바이더인 PostsService를 넣어주고 있는데 이러한 부분을 이야기 한다.
프로바이더(Provider)란?
프로바이더란 DI 컨테이너에 등록되어 주입될 수 있는 모든 구성 요소를 의미한다. 이에는 서비스뿐만 아니라 리포지토리, 팩토리, 값, 그리고 기타 커스텀 클래스 등이 포함된다.
서비스는 주로 비즈니스 로직을 처리하는 역할을 하는 클래스로, @Injectable() 데코레이터를 사용하여 프로바이더로 등록된다.
즉, 서비스가 프로바이더의 일종이다. 그리고 종종 같은 의미로 사용되기도 한다.
그렇다면 Controller는 어떻게 실행되는걸까?
컨트롤러는 같이 생성된 모듈에 의해서 실행된다.
import { Module } from '@nestjs/common';
import { PostsService } from './posts.service';
import { PostsController } from './posts.controller';
@Module({
controllers: [PostsController],
providers: [PostsService],
})
export class PostsModule {}
PostsModule은 export 되고 있으며, 이를 @Module 에서 인지할 수 있도록 한다.
내부에서는 controllers, providers를 배열로 넣고 있으며, 추가적인 컨트롤러와 프로바이더 등을 작업한다면 배열 내에 작성해주면 된다.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { PostsModule } from './posts/posts.module';
@Module({
imports: [PostsModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
그리고 app.module.ts 에서 위와 같이 PostsModule을 imports 를 한다.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
서버가 실행되면 main.ts 가 실행되며 NestFactory.create에 AppModule을 실행하여 IoC 컨테이너가 실행된다.
결국 main.ts 에서 서버가 실행되며 위의 모든 동작이 이루어지게 된다.
'NestJS' 카테고리의 다른 글
Docker 설치 (0) | 2025.02.24 |
---|---|
Docker 이론 (0) | 2025.02.24 |
NestJS - 서비스 및 컨트롤러 (0) | 2025.02.20 |
NestJS - Postman 사용하기 (0) | 2025.02.19 |
NestJS - Controller (0) | 2025.02.19 |