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 {}