• ABOUT
  • POSTS
  • GUESTBOOK

ยฉ 2025 BlueCool12 All rights reserved.

2026.02.01NestJS

๐Ÿงฉ NestJS์™€ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ์ดํ•ดํ•˜๊ธฐ

1. ๋ชจ๋“ˆ์˜ ์ •์˜

์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์—์„œ ๋ชจ๋“ˆ(Module)์€ ๊ฑฐ๋Œ€ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„์ด์ž ๊ธฐ๋Šฅ์  ๋ถ€ํ’ˆ์„ ์˜๋ฏธํ•œ๋‹ค.

๋ ˆ๊ณ ๋กœ ์ง‘์„ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์ž. ์ฐฝ๋ฌธ, ๋ฒฝ, ๋ฌธ ๋ธ”๋ก์„ ๋”ฐ๋กœ ๋งŒ๋“  ๋’ค ์กฐ๋ฆฝํ•œ๋‹ค. ์ด๋•Œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ฐ ๋ธ”๋ก์ด ์„œ๋กœ ๋งž๋ฌผ๋ฆฌ๋Š” ํ‘œ์ค€ ๊ทœ๊ฒฉ(interface)์„ ๊ฐ€์กŒ๋‹ค๋Š” ์ ์ด๋‹ค.

๋ชจ๋“ˆํ™”๋ฅผ ํ•˜๋Š” ์ด์œ ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€๋‹ค.

  • ์œ ์ง€ ๋ณด์ˆ˜์˜ ํšจ์œจ์„ฑ (Manageability)
    ํŠน์ • ๋ชจ๋“ˆ์ด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ๋งŒ ์ ๊ฒ€ํ•˜๋ฉด ๋œ๋‹ค. ์ „์ฒด ์‹œ์Šคํ…œ์„ ๋œฏ์–ด๋‚ผ ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ (Reusability)
    ์ž˜ ์„ค๊ณ„๋œ ๋ชจ๋“ˆ์€ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณ‘๋ ฌ ๊ฐœ๋ฐœ (Scalability)
    ๊ทœ๊ฒฉ๋งŒ ๋งž์ถฐ๋‘๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ์„ ๋™์‹œ์— ๊ฐœ๋ฐœํ•ด ํ•ฉ์น  ์ˆ˜ ์žˆ๋‹ค.


2. OOP ๊ด€์ ์—์„œ์˜ ๋ชจ๋“ˆ (์บก์Аํ™”์™€ ์‘์ง‘๋„)

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)์—์„œ ๋ชจ๋“ˆ์€ ๋‹จ์ˆœํžˆ ํŒŒ์ผ์„ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋…ผ๋ฆฌ์ ์ธ ๊ฒฝ๊ณ„(Boundary)๋ฅผ ๊ธ‹๋Š” ์ž‘์—…์ด๋‹ค. ์ข‹์€ ๋ชจ๋“ˆ์€ ์™ธ๋ถ€์™€ ์ฒ ์ €ํžˆ ๊ฒฉ๋ฆฌ๋˜๋ฉด์„œ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋‹จ๋‹จํ•˜๊ฒŒ ๋ญ‰์ณ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

1. ๊ณ  ์‘์ง‘ (High Cohesion)
๋ชจ๋“ˆ ๋‚ด๋ถ€๋Š” ์‘์ง‘๋„๊ฐ€ ๋†’์•„์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด UserModule ์•ˆ์—๋Š” ๊ฐ€์ž…, ๋กœ๊ทธ์ธ์ฒ˜๋Ÿผ ์œ ์ €์™€ ๊ด€๋ จ๋œ ๋กœ์ง๋งŒ ๋ญ‰์ณ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ์ด ์•ˆ์— ๊ฒฐ์ œ ๋กœ์ง์ด ์„ž์—ฌ ์žˆ๋‹ค๋ฉด ์œ ์ € ๊ธฐ๋Šฅ์„ ๊ณ ์น  ๋•Œ ์ƒ๊ด€์—†๋Š” ๊ฒฐ์ œ ์ฝ”๋“œ๊นŒ์ง€ ๊ฑด๋“œ๋ ค์•ผ ํ•˜๋Š” ์œ„ํ—˜์ด ์ƒ๊ธด๋‹ค.

2. ์ € ๊ฒฐํ•ฉ (Low Coupling)
๋ชจ๋“ˆ ๊ฐ„์˜ ์˜์กด์„ฑ์€ ์ตœ์†Œํ™”๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ฒฐ์ œ ๋ชจ๋“ˆ์„ ์ˆ˜์ •ํ–ˆ๋‹ค๊ณ  ์œ ์ € ๋ชจ๋“ˆ์ด ๊ณ ์žฅ ๋‚œ๋‹ค๋ฉด ๋‘ ๋ชจ๋“ˆ์€ ๋„ˆ๋ฌด ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ์ƒํƒœ์ด๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค(interface)๋ผ๋Š” ์•ฝ์†๋œ ์ฐฝ๊ตฌ๋งŒ์„ ํ†ตํ•ด ์†Œํ†ตํ•จ์œผ๋กœ์จ ํ•œ ์ชฝ์˜ ๋ณ€ํ™”๊ฐ€ ๋‹ค๋ฅธ ์ชฝ์— ๋ฒˆ์ง€๋Š” ๋‚˜๋น„ํšจ๊ณผ๋ฅผ ์ฐจ๋‹จํ•ด์•ผ ํ•œ๋‹ค.

3. ์บก์Аํ™” (Encapsulation)
๋ชจ๋“ˆ์€ ์ž์‹ ์˜ ๋ณต์žกํ•œ ๋‚ด๋ถ€ ๋กœ์ง์„ ์™ธ๋ถ€์— ์•Œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ๊ผญ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๋ฐ–์œผ๋กœ ๋…ธ์ถœ(Public) ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ˆจ๊น€(Private)์œผ๋กœ์จ ์™ธ๋ถ€์˜ ์ž˜๋ชป๋œ ์ ‘๊ทผ์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ๋ชจ๋“ˆ์˜ ๋…๋ฆฝ์„ฑ์„ ์ง€ํ‚จ๋‹ค.


3. NestJS์—์„œ์˜ ๋ชจ๋“ˆ

NestJS๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์ฐจ์›์—์„œ ๋ชจ๋“ˆ ๊ฐœ๋…์„ ๊ฐ•์ œํ•œ๋‹ค. ๋ชจ๋“  NestJS ์•ฑ์€ ์ตœ์†Œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฃจํŠธ ๋ชจ๋“ˆ(Root Module)์„ ๊ฐ€์ง€๋ฉฐ ๋ชจ๋“ˆ๋“ค์ด ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ์—ฎ์—ฌ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ˜•์„ฑํ•œ๋‹ค.

NestJS ๋ชจ๋“ˆ์€ @Module() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ 4๊ฐ€์ง€ ํ•ต์‹ฌ ์†์„ฑ์„ ์ •์˜ํ•œ๋‹ค.

1. providers: ๋‚ด๋ถ€ ์„œ๋น„์Šค ๋ ˆ์ด์–ด๋กœ ๋ชจ๋“ˆ์˜ ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด๋“ค
2. controllers: ์ธํ„ฐํŽ˜์ด์Šค ๋ ˆ์ด์–ด๋กœ ์‚ฌ์šฉ์ž๋‚˜ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ณ„์ธต
3. imports: ์ด ๋ชจ๋“ˆ์ด ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์˜ ๋ชฉ๋ก
4. exports: ์ด ๋ชจ๋“ˆ์˜ ๊ธฐ๋Šฅ ์ค‘ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•  ๋ช…๋‹จ

@Module({
// 1. ์™ธ๋ถ€ ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ (DB ๊ธฐ๋Šฅ ๋“ฑ)
imports: [TypeOrmModule.forFeature([User])],

// 2. ์š”์ฒญ์„ ๋ฐ›์„ ์ปจํŠธ๋กค๋Ÿฌ
controllers: [UserController],

// 3. ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์„œ๋น„์Šค (DIP ์›์น™ ์ ์šฉ)
providers: [
UserService,
{
provide: UserRepository, // ์ถ”์ƒํ™”๋œ ๊ทœ๊ฒฉ(์ธํ„ฐํŽ˜์ด์Šค)
useClass: TypeOrmUserRepository, // ์‹ค์ œ ๊ตฌํ˜„์ฒด
},
],

// 4. ์™ธ๋ถ€ ๋ชจ๋“ˆ์—์„œ๋„ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๊ณต๊ฐœํ•  ์„œ๋น„์Šค
exports: [UserService, UserRepository],
})
export class UserModule {}โ€‹


4. ์‹ค์ „ Tip

๋ชจ๋“ˆ์„ ์„ค๊ณ„ํ•˜๋‹ค ๋ณด๋ฉด ๋‹จ์ˆœํžˆ ๋‚˜๋ˆ„๋Š” ๊ฒƒ ์ด์ƒ์˜ ๋ณต์žกํ•œ ์ƒํ™ฉ์„ ๋งˆ์ฃผํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‹ค์ „ ํฌ์ธํŠธ๋“ค์ด๋‹ค.

  • ์ˆœํ™˜ ์ฐธ์กฐ (Circular Dependency)
    ๋ชจ๋“ˆ A๊ฐ€ B๋ฅผ ์ฐธ์กฐํ•˜๊ณ  B๊ฐ€ ๋‹ค์‹œ A๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋Œ€๋ถ€๋ถ„ ์„ค๊ณ„๋ฅผ ์žฌ๊ฒ€ํ† ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‹ ํ˜ธ์ด์ง€๋งŒ ๊ตฌ์กฐ์ƒ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ NestJS์˜ forwardRef()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธ€๋กœ๋ฒŒ ๋ชจ๋“ˆ (Global Modules)
    DB ์—ฐ๊ฒฐ์ด๋‚˜ ์„ค์ • ํŒŒ์ผ์ฒ˜๋Ÿผ ์ „์—ญ์—์„œ ์“ฐ์ด๋Š” ๊ธฐ๋Šฅ์€ @Global() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๋ฒˆ imports ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๋‚จ๋ฐœํ•˜๋ฉด ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ฒฝ๊ณ„๊ฐ€ ๋ชจํ˜ธํ•ด์ง€๋ฏ€๋กœ ๊ผญ ํ•„์š”ํ•œ ๊ณณ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ํ…Œ์ŠคํŠธ์˜ ์šฉ์ด์„ฑ (Testability)
    ๋ชจ๋“ˆ์ด ์ž˜ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์œผ๋ฉด ํŠน์ • ๊ธฐ๋Šฅ์„ ๊ฒ€์ฆํ•  ๋•Œ ๋‹ค๋ฅธ ์˜์กด์„ฑ์„ ๊ฐ€์งœ(Mock)๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ์‰ฌ์›Œ์ง€๋ฉฐ ์ด๋Š” ๊ณง ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์œผ๋กœ ์ด์–ด์ง„๋‹ค.


์ด์ „ ๊ธ€
๐Ÿ“ž ํ•œ ๋ˆˆ์— ์ •๋ฆฌํ•˜๋Š” JS ๋น„๋™๊ธฐ 3๋‹จ๊ณ„: Callback, Promise, Async/Await
๋‹ค์Œ ๊ธ€
๋‹ค์Œ ๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค ( ฮ‡ . ฮ‡)
์žฅ์‹์šฉ ๋กœ๊ณ