Custom providers
Custom providers
์ปจํธ๋กค ์ปจํ ์ด๋์ Nest ๋ฐ์ ์ ๋ฌด์ธ๊ฐ๋ฅผ ์ง์ ๋ฐ์ธ๋ฉํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์์ ๊ฐ, ํ์ฌ ํ๊ฒฝ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ๊ตฌ์ฑ ์ค๋ธ์ ํธ, ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ์ ์๋ ๋ค๋ฅธ ์ ๊ณต์์ ๊ฑฐ์ ์์กดํ์ง ์๋ ์ฌ์ ๊ณ์ฐ๋ ๊ฐ. ๋ํ ๊ธฐ๋ณธ ๊ตฌํ์ ์ฌ์ ์ํ ์ ์์ต๋๋ค. ์: ํ์ํ ๋ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ค์ํ ํ ์คํธ ๋ณต์ (ํ ์คํธ ๋ชฉ์ ์ผ๋ก)์ ์ฌ์ฉํ์ญ์์ค.
Nest๊ฐ ํญ์ ๋ช
์ฌํด์ผ ํ ํ ๊ฐ์ง๋ Nest๊ฐ ํ ํฐ์ ์ฌ์ฉํ์ฌ ์ข
์์ฑ์ ์๋ณํ๋ค๋ ๊ฒ์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ ์์ฑ๋ ํ ํฐ์ ํด๋์ค์ ๊ฐ์ต๋๋ค. ์ฌ์ฉ์ ์ง์ ๊ณต๊ธ์๋ฅผ ๋ง๋ค๋ ค๋ฉด ํ ํฐ์ ์ ํํด์ผ ํฉ๋๋ค. ๋๋ถ๋ถ์ ์ฌ์ฉ์ ์ ์ ํ ํฐ์ ์ผ๋ฐ ๋ฌธ์์ด ๋๋ ๊ธฐํธ๋ก ํ์๋ฉ๋๋ค. ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด, ํด๋น ํ ํฐ์ ๋ถ๋ฆฌ๋ ํ์ผ (์: constants.ts
)์ ๋ณด๊ดํด์ผ ํฉ๋๋ค.
์ฌ์ฉ ๊ฐ๋ฅํ ์ต์ ์ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
Use value
useValue
๊ตฌ๋ฌธ์ ์์ ๊ฐ์ ์ ์ํ๊ฑฐ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Nest ์ปจํ
์ด๋์ ๋ฃ๊ฑฐ๋ ์ค์ ๊ตฌํ์ ๋ชจ์ ๊ฐ์ฒด๋ก ๋์ฒด ํ ๋ ์ ์ฉํฉ๋๋ค.
import { connection } from './connection';
const connectionProvider = {
provide: 'CONNECTION',
useValue: connection,
};
@Module({
providers: [connectionProvider],
})
export class ApplicationModule {}
์ปค์คํ
ํ๋ก ๋ฐ์ด๋๋ฅผ ์ฃผ์
ํ๊ธฐ ์ํด @Inject()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ฐ์ฝ๋ ์ดํฐ๋ ํ ํฐ์ด๋ผ๋ ๋จ์ผ ์ธ์๋ฅผ ์ทจํฉ๋๋ค.
@@filename()
@Injectable()
export class CatsRepository {
constructor(@Inject('CONNECTION') connection: Connection) {}
}
@@switch
@Injectable()
@Dependencies('CONNECTION')
export class CatsRepository {
constructor(connection) {}
}
info ํํธ
@Inject()
๋ฐ์ฝ๋ ์ดํฐ๋@nestjs/common
ํจํค์ง์์ ๊ฐ์ ธ์ต๋๋ค.
๊ธฐ๋ณธ ์ ๊ณต ์
์ฒด์ ๊ฐ์ ์ฌ์ ์ ํ๋ ค๋ ๊ฒฝ์ฐ ํ
์คํธ ๋ชฉ์ ์ผ๋ก Nest๊ฐ ๋ชจ์ CatsService
๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์ํ๊ณ ์ถ์ ๋ ๊ธฐ์กด ํด๋์ค๋ฅผ ํ ํฐ์ผ๋ก ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
import { CatsService } from './cats.service';
const mockCatsService = {};
const catsServiceProvider = {
provide: CatsService,
useValue: mockCatsService,
};
@Module({
imports: [CatsModule],
providers: [catsServiceProvider],
})
export class ApplicationModule {}
์์ ์์์ CatsService
๋ ์ ๋ฌ ๋ mockCatsService
๋ชจ์ ๊ฐ์ฒด๋ก ์ฌ์ ์๋ฉ๋๋ค. ์ฆ, CatsService
์ธ์คํด์ค๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ๋์ Nest๊ฐ์ด ๊ณต๊ธ์๋ฅผ ์ด๋ฏธ ํด๊ฒฐ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ mockCatsService
๋ฅผ ๋ํ ๊ฐ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
Use class
useClass
๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ ํํ ์์๋ง๋ค ๋ค๋ฅธ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ถ์ (๋๋ ๊ธฐ๋ณธ) ConfigService
ํด๋์ค๊ฐ ์์ต๋๋ค. ํ์ฌ ํ๊ฒฝ์ ๋ฐ๋ผ Nest๋ ๋ค๋ฅธ ๊ตฌ์ฑ ์๋น์ค ๊ตฌํ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
const configServiceProvider = {
provide: ConfigService,
useClass:
process.env.NODE_ENV === 'development'
? DevelopmentConfigService
: ProductionConfigService,
};
@Module({
providers: [configServiceProvider],
})
export class ApplicationModule {}
warning ์๋ฆผ ์ปค์คํ ํ ํฐ ๋์
ConfigService
ํด๋์ค๋ฅผ ์ฌ์ฉํ์ผ๋ฏ๋ก ๊ธฐ๋ณธ ๊ตฌํ์ ์ฌ์ ์ํ์ต๋๋ค.
์ด ๊ฒฝ์ฐ ํด๋์ค๊ฐ ConfigService
์ ์ข
์๋์ด ์๋๋ผ๋ Nest๋ ์ ๊ณต๋ ํด๋์ค (DevelopmentConfigService
๋๋ ProductionConfigService
)์ ์ธ์คํด์ค๋ฅผ ๋์ ์ฃผ์
ํฉ๋๋ค.
Use factory
useFactory
๋ ์ ๊ณต์๋ฅผ ๋์ ์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ค์ ๊ณต๊ธ์๋ ํฉํ ๋ฆฌ ํจ์์ ๋ฐํ ๊ฐ๊ณผ ๊ฐ์ต๋๋ค. ํฉํ ๋ฆฌ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ๋ค๋ฅธ ์ ๊ณต์์ ์์กดํ๊ฑฐ๋ ์์ ํ ๋
๋ฆฝ๋ ์ํ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. ์ด๋ ํฉํ ๋ฆฌ๊ฐ ์ธ์๋ฅผ ํ์ฉํ ์ ์์์ ์๋ฏธํ๋ฉฐ, ์ธ์คํด์คํ ํ๋ก์ธ์ค ์ค์ Nest๊ฐ ๋ถ์ํ์ฌ ์ ๋ฌํฉ๋๋ค. ๋ํ ์ด ํจ์๋ ๋น๋๊ธฐ ์ ์ผ๋ก ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ ์์ธํ ์ค๋ช
๋์ด ์์ต๋๋ค. ๊ณต๊ธ์๋ฅผ ๋์ ์ผ๋ก ๊ณ์ฐํด์ผ ํ๊ฑฐ๋ ๋น๋๊ธฐ ์์
์ ํด๊ฒฐํ๋ ค๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ์ญ์์ค.
@@filename()
const connectionFactory = {
provide: 'CONNECTION',
useFactory: (optionsProvider: OptionsProvider) => {
const options = optionsProvider.get();
return new DatabaseConnection(options);
},
inject: [OptionsProvider],
};
@Module({
providers: [connectionFactory],
})
export class ApplicationModule {}
@@switch
const connectionFactory = {
provide: 'CONNECTION',
useFactory: (optionsProvider) => {
const options = optionsProvider.get();
return new DatabaseConnection(options);
},
inject: [OptionsProvider],
};
@Module({
providers: [connectionFactory],
})
export class ApplicationModule {}
info ํํธ ํฉํ ๋ฆฌ์ ๋ค๋ฅธ ์ ๊ณต์๊ฐ ํ์ํ ๊ฒฝ์ฐ,
inject
๋ฐฐ์ด ์์ ํ ํฐ์ ์ ๋ฌํด์ผ ํฉ๋๋ค. Nest๋ ์ธ์คํด์ค๋ฅผ ๋์ผํ ์์๋ก ํจ์์ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค.
Use existing
useExisting
์ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด ๊ณต๊ธ์์ ๋ณ์นญ์ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, AliasedLoggerService
ํ ํฐ์ LoggerService
์ ๋ณ๋ช
์
๋๋ค.
@Injectable()
class LoggerService {}
const loggerAliasProvider = {
provide: 'AliasedLoggerService',
useExisting: LoggerService
};
@Module({
providers: [LoggerService, loggerAliasProvider],
})
export class ApplicationModule {}
info ํํธ
LoggerService
์ธ์คํด์ค๋AliasedLoggerService
ํ ํฐ์ ์ํด ์ ์๋ ์ธ์คํด์ค์ ๋์ผํฉ๋๋ค.
Export custom provider
์ฌ์ฉ์ ์ง์ ๊ณต๊ธ์๋ฅผ ๋ด๋ณด๋ด๋ ค๋ฉด ํ ํฐ ๋๋ ์ ์ฒด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์ ์์ ๋ ํ ํฐ ์ผ์ด์ค๋ฅผ ๋ณด์ฌ์ค๋๋ค.
@@filename()
const connectionFactory = {
provide: 'CONNECTION',
useFactory: (optionsProvider: OptionsProvider) => {
const options = optionsProvider.get();
return new DatabaseConnection(options);
},
inject: [OptionsProvider],
};
@Module({
providers: [connectionFactory],
exports: ['CONNECTION'],
})
export class ApplicationModule {}
@@switch
const connectionFactory = {
provide: 'CONNECTION',
useFactory: (optionsProvider) => {
const options = optionsProvider.get();
return new DatabaseConnection(options);
},
inject: [OptionsProvider],
};
@Module({
providers: [connectionFactory],
exports: ['CONNECTION'],
})
export class ApplicationModule {}
๊ทธ๋ฌ๋ ์ ์ฒด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
@@filename()
const connectionFactory = {
provide: 'CONNECTION',
useFactory: (optionsProvider: OptionsProvider) => {
const options = optionsProvider.get();
return new DatabaseConnection(options);
},
inject: [OptionsProvider],
};
@Module({
providers: [connectionFactory],
exports: [connectionFactory],
})
export class ApplicationModule {}
@@switch
const connectionFactory = {
provide: 'CONNECTION',
useFactory: (optionsProvider) => {
const options = optionsProvider.get();
return new DatabaseConnection(options);
},
inject: [OptionsProvider],
};
@Module({
providers: [connectionFactory],
exports: [connectionFactory],
})
export class ApplicationModule {}
Last updated
Was this helpful?