🐣Provider의 개념
Provider는 NestJS에서 주입 가능한(Injectable) 객체를 말한다.
간단히 말해, 특정 값을 반환하거나 기능을 제공하는 객체이다.🐥
ex) 서비스 클래스, 팩토리 함수, 또는 값 자체
장점
- 의존성 관리
- 비즈니스 로직 캡슐화
- 유연성 제공
사용법
Provider는 NestJS의 Module에서 등록된다. 등록된 Provider는 NestJS의 DI 컨테이너에 의해 관리된다.
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
AppService 클래스는 Provider로 동작하며, @Injectable() 데코레이터를 통해 DI 컨테이너에 등록된다.
DI는 스프링에서도 많이 사용하는 개념이지만 다시한번 짚고 넘어가겠다.
🐣 Dependency Injection
객체가 자신의 의존성을 직접 생성하지 않고, 외부에서 주입받는 디자인 패턴
NestJS는 DI 컨테이너를 사용하여 클래스 간의 의존성을 자동으로 해결한다.
장점
느슨한 결합: 클래스 간의 의존성을 최소화하여 코드의 유지보수성을 높임.
테스트 용이성: Mock 객체를 쉽게 주입할 수 있어 단위 테스트를 쉽게 작성할 수 있다.
코드 재사용성: 동일한 Provider를 여러 클래스에서 재사용할 수 있다.
NestJS는 DI 컨테이너를 통해 의존성을 관리한다.
컨테이너가 필요한 의존성을 찾아 주입해준다.
예를 들어, 클래스 생성자에서 필요한 의존성을 정의하면, NestJS가 자동으로 해당 의존성을 주입
이렇게 Provider로 정의된 클래스를 사용하려면 해당 클래스를 모듈에 porvider로 등록해야 한다.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports:[다른모듈 주입]
controllers: [AppController], // Controller 등록
providers: [AppService], // AppService를 이 모듈의 Provider로 등록
exports: [AppService], // 필요하다면 다른 모듈에서 사용 가능하도록 export
})
export class AppModule {}
provider는 캡슐화가 되어 있기 때문에 다른 모듈에서 사용하지 못한다.
따라서 모듈에서 은닉화된 클래스를 export 해야 다른 모듈에서 import해서 사용할 수 있다.
🚨주의사항
다른 모듈의 provider를 직접 등록해서 사용하는건 좋은 방법이 아니다!
분리된걸 위반하고 다시 추가하는 셈 -> 단일책임원칙이 깨진다.
따라서 해당 모듈 안에서 만든 클래스들만 provider에 등록해서 사용하고,
정말 필요한 provider만 export를 통해 외부로 공개하는 것이 모듈 간 결합도를 낮추는 방법이다.
이렇게 모듈에 provider와 controller를 등록했으면 , 소비자인 Controller에서는 다음과 같이 사용
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
이렇게 모듈 클래스를 통해 Controller와 Service를 연결하는 것이 NestJS의 기본적인 구조이다! ଘ(੭ꆤᴗꆤ)━☆゚.*・
참고
'NestJS' 카테고리의 다른 글
[NestJS] Exception (0) | 2024.11.28 |
---|---|
[NestJS] Middleware (0) | 2024.11.21 |
[NestJS] Controller (0) | 2024.11.20 |
[Express] 라우터 분리, 모듈화 (0) | 2024.11.14 |
[Express] CRUD 기능 만들기 (0) | 2024.11.14 |