결국 Nest도 프레임워크이기 때문에 제어의 역전과 런타임 중 클래스를 주입하는 DI를 사용하게 된다.
스프링과 동일한 개념이겠지만, 어차피 마지막으로 정리하는 것일테니 자세하게 정리하고 가자.
우선 IOC(Inversion of Control Principle, 제어의 역전)은 다음을 말한다.
클래스가 의존성이 필요한 클래스를 본인이 직접 인스턴스를 생성하는 것이 아니라, 알아서 주입이 되도록 제어의 권한을 프레임워크에 위임하는 것을 말한다.
기존에는 생성자에 의존성이 있는 클래스를 다음과 같이 생성했었다.
@Controller('messages')
export class MessagesController {
private messagesService: MessagesService;
constructor(){
this.messagesService = new MessagesService();
}
}
이거를 IOC의 DI로 바꾸어야 한다는 것이다.
여기에서 messageService를 이용할 수 있도록 하는 방법은 3가지가 있을 것이다.
- 인스턴스 직접 생성
이번에 만들었던 방법대로 직접 인스턴스를 생성하는 것이다.
@Controller('messages')
export class MessagesController {
private messagesService: MessagesService;
constructor(){
this.messagesService = new MessagesService();
}
}
- 생성자를 통해 외부에서 주입
@Controller('messages')
export class MessagesController {
private messagesService: MessagesService;
constructor(messagesService: MessagesService){
this.messagesService = messagesService;
}
}
- 해당 클래스의 추상화를 주입
interface Service{
....
}
@Controller('messages')
export class MessagesController {
private messagesService: Service;
constructor(messagesService: Service){
this.messagesService = messagesService;
}
}
당연히 아래로 갈수록 의존성이 낮아지기에 좋은 방법이다.
다른 구현체로 변경하기가 쉽기 때문이다.
예를들면 실제 배포에서는 우리가 만들었던 서비스를 주입하고, 테스트 환경에서는 해당 인터페이스를 모킹해서 구현한 서비스를 주입하는 작업을 할 수 있기 때문이다.
결국 모든 목적은 컨트롤러가 될 것이다.
컨트롤러를 만들어야 적절한 API를 제공하기 때문이다.
그렇게 컨트롤러의 의존성에 대해 필요한 클래스들을 싱글톤으로 생성하여 등록해두고 의존성이 있는 클래스들에 대하여 해당 클래스들을 공유한다.
순서는 다음과 같다.
1. 시작하면 모든 클래스들을 컨테이너에 등록한다.
2. 컨테이너는 각 클래스들의 의존성들을 파악한다.
3 컨테이너에게 각 클래스들의 인스턴스 생성을 요청한다.
4. 컨테이너는 필요한 모든 의존성을 생성하고, 우리에게 인스턴스를 제공한다.
5. 컨테이너는 모든 클래스들을 싱글톤으로 생성하고, 의존성이 있는 각 클래스들에 공유한다.
이제 이렇게 DI를 사용하는 방법으로 코드를 리펙토링 해보자.
우선 의존성으로 가져가야 하는 클래스들에 @Injectable()을 붙여준다.
그러면 이 클래스들이 생성한 인스턴스로 컨테이너에 등록된다.
그리고 그 중 제공되어야 하는 클래스들을 알리기 위해 @Module()에 providers로 등록한다.
이렇게하면 providers에서 의존성으로 필요한 클래스들을 가져가서 컨테이너까지 생성하게 된다.
실행을 해보면 정상적으로 실행되는 것을 볼 수 있다.
'Node > Nest' 카테고리의 다른 글
Nest에서 typeorm을 통해 Entity 작성하기 (0) | 2025.07.06 |
---|---|
Nest에서 멀티 모듈 생성하는 방법 (1) | 2025.07.06 |
Nest에서 Service layer 구현하기 (0) | 2025.07.05 |
Nest에서 파일 시스템을 통해 repository layer 구현하기 (0) | 2025.07.05 |
Nest에서 파이프를 통해 요청 DTO 검사하기 (1) | 2025.07.04 |