๐Ÿ“ฆ NestJS ํ•ต์‹ฌ ๊ฐœ๋…: Module, Providers, Exports ์ •๋ฆฌ

wonjun.Adenยท2025๋…„ 4์›” 11์ผ
0

nestJs

๋ชฉ๋ก ๋ณด๊ธฐ
6/6
post-thumbnail

๐Ÿ“˜ Module: ๊ธฐ๋Šฅ ๋‹จ์œ„์˜ ๊ฒฝ๊ณ„์ž

โœ… ์ •์˜

NestJS์—์„œ @Module()์€ ๊ด€๋ จ๋œ ๊ตฌ์„ฑ ์š”์†Œ(Controller, Provider ๋“ฑ)๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ(ํ˜น์€ ๋„๋ฉ”์ธ)์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค.

๐Ÿง  ์—ญํ• 

  • ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ
  • DI ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ๊ณ„
  • ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ ์บก์Аํ™”
  • ์™ธ๋ถ€ ๋ชจ๋“ˆ๊ณผ์˜ ์˜์กด ๊ด€๊ณ„ ๋ช…์‹œ

๐Ÿงฉ ๊ตฌ์กฐ ์˜ˆ์‹œ

@Module({
  imports: [],
  controllers: [UserController],
  providers: [UserService, UserRepository],
  exports: [UserService], // ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์™ธ๋ถ€์— ๋…ธ์ถœ
})
export class UserModule {}

โš™๏ธ Provider: ์˜์กด์„ฑ ์ฃผ์ž… ๋Œ€์ƒ

โœ… ์ •์˜

Provider๋Š” NestJS์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋น„์Šค(@Injectable()), ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ํ—ฌํผ ํด๋ž˜์Šค ๋“ฑ์ด ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์ข…๋ฅ˜

ํƒ€์ž… ์˜ˆ์‹œ ์„ค๋ช…
ํด๋ž˜์Šค Provider UserService ์ผ๋ฐ˜์ ์ธ ์˜์กด์„ฑ
๊ฐ’(Value) Provider useValue ์„ค์ • ๊ฐ์ฒด ๋“ฑ
ํŒฉํ† ๋ฆฌ Provider useFactory ๋™์  ์ƒ์„ฑ, ์™ธ๋ถ€ ์กฐ๊ฑด ๊ธฐ๋ฐ˜
๊ธฐ์กด Provider ์žฌ์‚ฌ์šฉ useExisting ๊ธฐ์กด ๊ฒƒ ์žฌํ™œ์šฉ

๐Ÿงฉ ์˜ˆ์‹œ

@Injectable()
export class UserService {
  constructor(private readonly userRepository: UserRepository) {}
}
const ConfigProvider = {
  provide: 'CONFIG',
  useValue: {
    port: 3000,
    database: 'dev',
  },
};

๐Ÿ”„ ์ฃผ์ž… ์˜ˆ์‹œ

constructor(@Inject('CONFIG') private readonly config) {}

๐Ÿ” Exports: ์™ธ๋ถ€ ๋ชจ๋“ˆ์— ๊ณต์œ 

โœ… ์ •์˜

exports๋Š” ํ˜„์žฌ ๋ชจ๋“ˆ ๋‚ด์˜ Provider๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ์ถœํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. exports์— ๋“ฑ๋ก๋˜์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ์ฃผ์˜

controllers๋Š” exportsํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์˜ค์ง providers ๋˜๋Š” imports๋œ ๋ชจ๋“ˆ์˜ exports๋งŒ export ๊ฐ€๋Šฅ.

๐Ÿงฉ ์˜ˆ์‹œ

user.module.ts

@Module({
  providers: [UserService],
  exports: [UserService],
})
export class UserModule {}

auth.module.ts

@Module({
  imports: [UserModule],
})
export class AuthModule {
  constructor(private readonly userService: UserService) {}
}

๐Ÿง  ์•„ํ‚คํ…์ฒ˜์  ํ•ด์„ (Clean Architecture ๊ด€์ )

NestJS ๊ตฌ์„ฑ ์š”์†Œ ์•„ํ‚คํ…์ฒ˜ ์—ญํ• 
Module: ๊ธฐ๋Šฅ ๋‹จ์œ„์˜ ๊ฒฝ๊ณ„, Bounded Context
Provider: ๋„๋ฉ”์ธ ์„œ๋น„์Šค, ์ธํ”„๋ผ ์–ด๋Œ‘ํ„ฐ, ์œ ์Šค์ผ€์ด์Šค
Export: ๋ชจ๋“ˆ ๊ฐ„ ๋ช…์‹œ์  ์˜์กด์„ฑ ๊ณ„์•ฝ (Interface/Port ๊ฐœ๋…)

๐Ÿงช ํ…Œ์ŠคํŠธ ์ „๋žต ์ฐธ๊ณ 

ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ๊ณ„์ธต ํ…Œ์ŠคํŠธ ์œ ํ˜•
Provider (Service ๋“ฑ) Application, Domain ์œ ๋‹› ํ…Œ์ŠคํŠธ (Mock ์‚ฌ์šฉ)
Module ์ „์ฒด Application Layer ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
Controller Interface Layer e2e ํ…Œ์ŠคํŠธ / HTTP ํ…Œ์ŠคํŠธ

โœ… ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

์š”์†Œ ์„ค๋ช… ์˜ˆ์‹œ
Module: NestJS์˜ ๊ธฐ๋Šฅ ๋‹จ์œ„ ๊ฒฝ๊ณ„์ž UserModule, AuthModule ๋“ฑ
Provider: NestJS DI ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์ธ์Šคํ„ด์Šค UserService, LoggerService ๋“ฑ
Exports: ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ Provider๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต๊ฐœ exports: [UserService]

profile
์•„ํ”„๋ฆฌ์นด์˜ BackEnd Developer ์žฅ์›์ค€์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€