ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿ“Œ NestJS ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ: ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹ค์ „๊นŒ์ง€ - NestJS๋ž€? ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐœ์š” ๋ฐ ํŠน์ง•

NestJS๋Š” Node.js ๊ธฐ๋ฐ˜์˜ ๊ฐ•๋ ฅํ•œ ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, TypeScript๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP), ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(FP), ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(FRP) ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ฒฐํ•ฉํ•œ ๊ตฌ์กฐ์ ์ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” NestJS์˜ ๊ฐœ๋…๊ณผ ํŠน์ง•, ๊ธฐ์กด Express.js์™€์˜ ์ฐจ์ด์ , ๊ทธ๋ฆฌ๊ณ  NestJS๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿš€


1.1 NestJS๋ž€?

NestJS๋Š” Node.js ๊ธฐ๋ฐ˜์˜ ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, Express.js ๋˜๋Š” Fastify์™€ ๊ฐ™์€ HTTP ์„œ๋ฒ„๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
TypeScript ์ง€์›, ์˜์กด์„ฑ ์ฃผ์ž…(DI), ๋ชจ๋“ˆํ™”๋œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ†ตํ•ด ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

โœ… NestJS์˜ ํ•ต์‹ฌ ํŠน์ง•

โœ” TypeScript ๊ธฐ๋ฐ˜ → ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ๋กœ ์•ˆ์ •์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ
โœ” ๋ชจ๋“ˆํ™”๋œ ์•„ํ‚คํ…์ฒ˜ → ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚จ
โœ” ์˜์กด์„ฑ ์ฃผ์ž…(DI, Dependency Injection) → ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ž„
โœ” Express.js & Fastify ์ง€์› → ๊ธฐ์กด Node.js ๊ฐœ๋ฐœ ๋ฐฉ์‹๊ณผ์˜ ํ˜ธํ™˜์„ฑ ์ œ๊ณต
โœ” GraphQL, WebSocket, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์ง€์› → ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ํ™œ์šฉ ๊ฐ€๋Šฅ
โœ” ํ…Œ์ŠคํŒ… ์นœํ™”์  ํ™˜๊ฒฝ → Jest ๊ธฐ๋ฐ˜์˜ ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŠธ ์ง€์›

๐Ÿ’ก NestJS๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์ ํ•ฉํ•œ ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.


1.2 NestJS vs Express.js

๋ฐ˜์‘ํ˜•

NestJS๋Š” Express.js๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ, ๋” ๊ตฌ์กฐ์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜ ํ‘œ๋Š” NestJS์™€ Express.js์˜ ์ฃผ์š” ์ฐจ์ด์ ์„ ๋น„๊ตํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋น„๊ต ํ•ญ๋ชฉ NestJS Express.js

๊ธฐ๋ณธ ์–ธ์–ด TypeScript JavaScript/TypeScript
์•„ํ‚คํ…์ฒ˜ ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋ฐ˜
์˜์กด์„ฑ ์ฃผ์ž…(DI) โœ… ์ง€์› โŒ ์ง์ ‘ ๊ด€๋ฆฌ ํ•„์š”
REST API ์ง€์› โœ… ๊ธฐ๋ณธ ์ œ๊ณต โœ… ์ง์ ‘ ์„ค์ • ํ•„์š”
GraphQL ์ง€์› โœ… ๊ธฐ๋ณธ ์ œ๊ณต โŒ ๋ณ„๋„ ํŒจํ‚ค์ง€ ํ•„์š”
๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์ง€์› โœ… ๊ธฐ๋ณธ ์ง€์› โŒ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ

๐Ÿ’ก NestJS๋Š” ๊ธฐ์กด Express.js์˜ ์žฅ์ ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„, ๋” ๊ตฌ์กฐ์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.


1.3 NestJS ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

NestJS๋Š” ๋ชจ๋“ˆ(Module), ์ปจํŠธ๋กค๋Ÿฌ(Controller), ํ”„๋กœ๋ฐ”์ด๋”(Provider), ์„œ๋น„์Šค(Service) ๋“ฑ์˜ ๊ฐœ๋…์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

โœ… NestJS์˜ ์ฃผ์š” ๊ฐœ๋…

๐Ÿ“Œ ๋ชจ๋“ˆ(Module) → ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์—ญํ• 
๐Ÿ“Œ ์ปจํŠธ๋กค๋Ÿฌ(Controller) → HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ˜ํ™˜
๐Ÿ“Œ ํ”„๋กœ๋ฐ”์ด๋”(Provider) → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ
๐Ÿ“Œ ์„œ๋น„์Šค(Service) → ํ”„๋กœ๋ฐ”์ด๋”์˜ ์ผ์ข…์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์™€ ์—ฐ๊ฒฐ๋จ

์•„๋ž˜๋Š” NestJS์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

๐Ÿ“‚ src/app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

โœ… ๋ชจ๋“ˆ(Module)์€ @Module() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋จ

๐Ÿ“‚ src/app.controller.ts

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

โœ… ์ปจํŠธ๋กค๋Ÿฌ(Controller)๋Š” @Controller() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋จ
โœ… @Get() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•จ

๐Ÿ“‚ src/app.service.ts

import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello, NestJS!';
  }
}

โœ… ์„œ๋น„์Šค(Service)๋Š” @Injectable() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ ์ฃผ์ž…(DI)์ด ๊ฐ€๋Šฅํ•จ

๐Ÿ’ก NestJS์˜ ์•„ํ‚คํ…์ฒ˜๋Š” ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.


1.4 NestJS๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

NestJS๋Š” ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊นŒ์ง€ ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

โœ… NestJS๊ฐ€ ํŠนํžˆ ์œ ์šฉํ•œ ๊ฒฝ์šฐ

โœ” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•ด์•ผ ํ•  ๋•Œ → ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋กœ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚จ
โœ” GraphQL, WebSocket, REST API๋ฅผ ํ•œ ๋ฒˆ์— ์ง€์›ํ•ด์•ผ ํ•  ๋•Œ → ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›
โœ” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ๋ฐ ORM์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ → TypeORM, Prisma ๋“ฑ๊ณผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉ ๊ฐ€๋Šฅ
โœ” ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(TDD)์„ ์ ์šฉํ•ด์•ผ ํ•  ๋•Œ → Jest ๊ธฐ๋ฐ˜์˜ ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์ œ๊ณต
โœ” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒฝ์šฐ → Kafka, gRPC, RabbitMQ์™€์˜ ์—ฐ๋™ ์ง€์›

๐Ÿ’ก NestJS๋Š” ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋›ฐ์–ด๋‚œ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์ตœ์ ํ™”๋œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.


1.5 ๊ฒฐ๋ก : NestJS๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ์„ ํƒ

โœ… NestJS๋Š” TypeScript ๊ธฐ๋ฐ˜์œผ๋กœ ์•ˆ์ „ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ
โœ… ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋กœ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚จ
โœ… Express.js์˜ ์žฅ์ ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„, ์˜์กด์„ฑ ์ฃผ์ž…๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
โœ… GraphQL, WebSocket, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๊นŒ์ง€ ํญ๋„“๊ฒŒ ์ง€์›

์ด์ œ NestJS์˜ ๊ฐœ๋…๊ณผ ์ฃผ์š” ํŠน์ง•์„ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค!
๋‹ค์Œ ๊ธ€์—์„œ๋Š” **"NestJS ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ดํ•ด"**๋ฅผ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿš€


๐Ÿ”Ž ๋‹ค์Œ ๊ธ€ ์˜ˆ๊ณ : NestJS ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ดํ•ด

๐Ÿ“Œ ๋‹ค์Œ ํŽธ: 2. NestJS ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ดํ•ด


 

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•