Nest.js Provider

Provider

Spring을 하다보면 자주 듣게 되는 용어 DI(의존성 주입) 그러한 의존성 관리를 해주는 IOC 컨터네이가 Spring에는 존재하고 있습니다. 하지만 Nest.js에서는 아직 의존성을 관리해주는 기능은 없어 명시적으로 입력을 해주어야 하는데 이때 사용되는 것이 Provider 입니다. Provider에는 다양한 방식과 형태로 의존성을 제공하고 있습니다. 이번 글에서 한번 어떻게 사용되고 있는지 보도록 하겠습니다. 

 

Nest.js가 아니라 spring으로 보는 의존성 주입에 대한 내용입니다. 의존성 주입에 대한 개념이 헷갈리신다면 보시는 것을 추천드립니다.

 

Spring이란? (DI 와 IOC)

Spring Spring이란 JAVA기술들을 더 쉽게 사용할 수 있게 해주는 오픈소스 프레임 워크이다. 엔터프라이즈(Enterprise)급의 프로젝트를 처리하는 JaveEE가 사용하기가 어렵고 문제가 많았음. Spring 은 JavaEE

jamesblog95.tistory.com

 

@Injectable

해당 데코레이터는 Provider로 다른 모듈에 주입이 가능하다는 것을 의미합니다. 주입하기 원하는 클래스 위에 해당 데코레이터를 붙여 주기만 하면 됩니다. 

@Injectable()
export class MyService {
  // ...
}

 

Value Provider

Value Provider는 기존에 존재하는 Class에 다른 값을 사용하게 하는 방식을 제공하고 있습니다. 대체로 일부 테스트 코드나 mock을 입력해줄 때 사용되고 있습니다. 

const UserMockService = {
  findAll: () => {
    return 'find mock users';
  },
};

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  exports: [UserService],
  controllers: [UserController],
  providers: [
    {
      provide: UserService,
      useValue: UserMockService,
    },
  ],
})

 

 

Class Provider

Class ProviderValue Provider와 달리 하나의 Class를 대체 제공을 하는 기능을 수행하고 있습니다. 좀 더 많은 단위의 값들을 하나의 클래스로 만들어서 제공하고 있다고 보시면 되겠습니다. 

  providers: [
    AuthService,
    JwtStrategy,
    {
      provide: APP_GUARD,
      useClass: JwtAuthGuard,
    },
  ],

 

Factory Provider

Factory Provider는 여러 개의 클래스들을 동적으로 지정하여 제공하는 기능을 수행하고 있습니다. 여러 타입의 데이터베이스를 사용한다면 아래와 같은 코드를 작성 할 수 있습니다. 

{
  provide: 'DYNAMIC_DATABASE_SERVICE',
  useFactory: (configService: ConfigService) => {
    if (configService.get('USE_MYSQL')) {
      return new MySQLDatabaseService();
    }
    return new MongoDBDatabaseService();
  },
  inject: [ConfigService],
}

 

주입된 의존성 객체 사용

주입된 의존성을 사용하는 방식은 크게 두가지 방식이 존재하고 있습니다. 첫번째로는 생성자를 통한 주입방식 두번째로는 moduleRef 를 통한 주입방식이 있습니다. 

 

생성자를 통한 주입

constructor(private myService: MyService) {}

 

moduleRef를 통한 주입

const myService = moduleRef.get(MyService);

 

한가지 주의 해야 하는 점은 moduleRef를 통한 방식은 이후에 의존성이 변경될 문제점을 야기 할 수 있으므로 사용을 지양해야할 것입니다. 당장은 유연하게 변경되는 것이 유리해보일 수도 있지만 서비스가 커질 수 록 이러한 변경들은 어떠한 문제를 발생 시킬지 모르기 때문에 Controller가 생성될 때 주입받게 하는 것이 좋은 방식입니다.

'Backend > Nest.js' 카테고리의 다른 글

Nest.js bcrypt (hashing)  (0) 2023.09.27
Nest.js Module  (0) 2023.09.26
Nest.js Swagger Bearer 인증 적용  (1) 2023.09.26
Nest.js Security Jwt strategy 적용  (0) 2023.09.26
Nest.js Swagger 설치 및 설정  (0) 2023.09.25