NestJS에서 동일 인터페이스를 구현한 다중 서비스 주입하기

NestJS 애플리케이션 개발 시 동일한 인터페이스를 구현한 여러 서비스를 동시에 주입해야 하는 경우가 있습니다. 기본적으로 NestJS는 이러한 다중 주입을 직접 지원하지 않지만, Provider를 활용하여 구현할 수 있습니다.

시스템 사용자 모델 정의

먼저 시스템 사용자 모델과 운영체제 유형을 정의합니다.

export interface SystemUser {
  username: string;
  osType: OSType;
}

export enum OSType {
  LINUX = 'LINUX',
  WINDOWS = 'WINDOWS',
}

사용자 서비스 구현

인터페이스와 두 가지 구현체를 작성합니다.

import { Injectable } from '@nestjs/common';
import { SystemUser, OSType } from './system-user.model';

export interface UserService {
  fetchUsers(): SystemUser[];
}

@Injectable()
export class LinuxUserService implements UserService {
  private users: SystemUser[] = [];
  
  fetchUsers(): SystemUser[] {
    this.users = [
      { username: 'linux_user1', osType: OSType.LINUX },
      { username: 'linux_user2', osType: OSType.LINUX }
    ];
    return this.users;
  }
}

@Injectable()
export class WindowsUserService implements UserService {
  private users: SystemUser[] = [];
  
  fetchUsers(): SystemUser[] {
    this.users = [
      { username: 'windows_user1', osType: OSType.WINDOWS },
      { username: 'windows_user2', osType: OSType.WINDOWS }
    ];
    return this.users;
  }
}

컨트롤러 구현

모든 사용자 서비스 구현체를 배열로 주입받아 처리합니다.

import { Controller, Get, Inject } from '@nestjs/common';
import { UserService } from './user.service';
import { SystemUser } from './system-user.model';

@Controller('users')
export class UserController {
  constructor(
    @Inject('USER_SERVICES') private userServices: UserService[],
  ) {}

  @Get()
  getAllUsers() {
    const allUsers: SystemUser[] = [];
    this.userServices.forEach(service => {
      allUsers.push(...service.fetchUsers());
    });
    return allUsers;
  }
}

모듈 설정

Factory Provider를 사용하여 다중 서비스 주입을 구성합니다.

import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import {
UserService,
LinuxUserService,
WindowsUserService,
} from './user.service';

@Module({
controllers: [UserController],
providers: [
LinuxUserService,
WindowsUserService,
{
provide: 'USER_SERVICES',
useFactory: (linuxService, windowsService) => [
linuxService,
windowsService
],
inject: [LinuxUserService, WindowsUserService],
},
],
})
export class UserModule {}

태그: nestjs Dependency Injection TypeScript Provider Pattern

8월 5일 11:52에 게시됨