๐ก NestJS๋ Node.js ์์์ ๋์ํ๋ ๋ฐฑ์๋ ํ๋ ์์ํฌ
๐ก Express.js ๋๋ Fastify ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฉฐ, ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์กฐ์ ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋๋ก ๋์.
๐ก TypeScript๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๋ฉฐ, ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP), ํจ์ํ ํ๋ก๊ทธ๋๋ฐ(FP), ๊ทธ๋ฆฌ๊ณ MVC ํจํด์ ๊ฒฐํฉํ ๊ฐ๋ ฅํ ๊ตฌ์กฐ๋ฅผ ์ ๊ณต.
| ํน์ง | ์ค๋ช |
|---|---|
| Node.js ๊ธฐ๋ฐ | NestJS๋ Node.js์์ ๋์ํ๋ ์๋ฒ ํ๋ ์์ํฌ |
| Express.js ๋๋ Fastify ์ฌ์ฉ ๊ฐ๋ฅ | ๊ธฐ๋ณธ์ ์ผ๋ก Express.js๋ฅผ ์ฌ์ฉํ์ง๋ง, Fastify๋ ์ง์ |
| TypeScript ๊ธฐ๋ณธ ์ง์ | ์์ ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ (JavaScript๋ ์ฌ์ฉ ๊ฐ๋ฅ) |
| ๋ชจ๋(Module) ๊ธฐ๋ฐ ๊ตฌ์กฐ | ์ฝ๋๊ฐ ๊ธฐ๋ฅ๋ณ๋ก ์ ๋ถ๋ฆฌ๋์ด ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ |
| ๋ฐ์ฝ๋ ์ดํฐ(Decorator) ํจํด ์ฌ์ฉ | @Controller(), @Injectable() ๋ฑ์ ๋ฐ์ฝ๋ ์ดํฐ ์ฌ์ฉ |
| DI(์์กด์ฑ ์ฃผ์ , Dependency Injection) | ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์ |
| REST API & GraphQL ์ง์ | REST API, GraphQL, WebSocket ๋ฑ์ ๋ค์ํ ํต์ ๋ฐฉ์ ์ง์ |
๐ ์ฆ, NestJS๋ "๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํ Node.js ํ๋ ์์ํฌ"์ผ! ๐
โ
Express.js๋ณด๋ค ๋ ๊ตฌ์กฐ์ ์ธ ๊ฐ๋ฐ ๋ฐฉ์ ์ ๊ณต
โ
๋๊ท๋ชจ ํ๋ก์ ํธ์์ ์ฝ๋ ์ ์ง๋ณด์๊ฐ ์ฌ์
โ
TypeScript ๊ธฐ๋ณธ ์ง์์ผ๋ก ์์ ์ ์ธ ๊ฐ๋ฐ ๊ฐ๋ฅ
โ
๋ชจ๋ ์์คํ
์ ํตํด ๊ธฐ๋ฅ๋ณ๋ก ์ฝ๋ ๋ถ๋ฆฌ ๊ฐ๋ฅ
โ
๋ฐฑ์๋ API ๊ฐ๋ฐ์ ํ์ํ ๋ค์ํ ๊ธฐ๋ฅ ๋ด์ฅ (์: ์ธ์ฆ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋ ๋ฑ)
๐ ์ฆ, Express.js์ฒ๋ผ ์์ ๋กญ๊ฒ ๊ฐ๋ฐํ ์๋ ์์ง๋ง, ๋ ์ฒด๊ณ์ ์ธ ๊ตฌ์กฐ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณต!
npx @nestjs/cli new my-nest-app
cd my-nest-app
npm run start
๐ ์ด ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด ๊ธฐ๋ณธ NestJS ํ๋ก์ ํธ๊ฐ ์์ฑ๋จ.
๐ http://localhost:3000 ์์ ์๋ฒ๊ฐ ์คํ๋จ.
๐ NestJS์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋๋ app.controller.ts (์ปจํธ๋กค๋ฌ ํ์ผ)
import { Controller, Get } from "@nestjs/common";
@Controller()
export class AppController {
@Get()
getHello(): string {
return "Hello, NestJS!";
}
}
๐ ์ค๋ช
:
โ
@Controller() โ ์ด ํด๋์ค๊ฐ API ์๋ํฌ์ธํธ๋ฅผ ๊ด๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ์์ ์๋ฏธ
โ
@Get() โ HTTP GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ
โ
getHello() โ http://localhost:3000/์ ์ ์ํ๋ฉด "Hello, NestJS!"๊ฐ ๋ฐํ๋จ
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
@Module({
controllers: [AppController],
})
export class AppModule {}
๐ ์ค๋ช
:
โ
@Module() โ NestJS๋ ๋ชจ๋ ๋จ์๋ก ๋์ํ๋ฉฐ, ์ฌ๊ธฐ์์ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ฑ๋กํจ.
โ
controllers: [AppController] โ AppController๋ฅผ ์ด ๋ชจ๋์ ํฌํจ
| ๊ฐ๋ | ์ค๋ช |
|---|---|
| ์ปจํธ๋กค๋ฌ(Controller) | ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ๋ API ์๋ํฌ์ธํธ |
| ์๋น์ค(Service) | ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ๊ณ์ธต |
| ๋ชจ๋(Module) | ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ๋ฌถ์ด ์ฝ๋ ๋ถ๋ฆฌ ๋ฐ ๊ด๋ฆฌ |
| ์์กด์ฑ ์ฃผ์ (DI, Dependency Injection) | ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌ |
| ๋ฐ์ฝ๋ ์ดํฐ(Decorator) | @Controller(), @Get(), @Injectable() ๋ฑ์ ์ฌ์ฉํด ๋ฉํ๋ฐ์ดํฐ ์ถ๊ฐ |
| ๋ฏธ๋ค์จ์ด(Middleware) | ์์ฒญ์ ๊ฐ๋ก์ฑ์ ๋ก์ง์ ์คํํ๋ ๊ธฐ๋ฅ |
| ๊ฐ๋(Guard) | ์ธ์ฆ ๋ฐ ๊ถํ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ ๊ธฐ๋ฅ |
๐ ์ฆ, NestJS๋ ์ผ๋ฐ์ ์ธ Express.js๋ณด๋ค ๋ ์ฒด๊ณ์ ์ผ๋ก API ์๋ฒ๋ฅผ ๊ฐ๋ฐํ ์ ์๋๋ก ๋์์ฃผ๋ ํ๋ ์์ํฌ!
| ๋น๊ต ํญ๋ชฉ | NestJS | Express.js |
|---|---|---|
| ํ๋ ์์ํฌ ํ์ | ๊ตฌ์กฐํ๋ ํ๋ ์์ํฌ | ๋ฏธ๋๋ฉํ ํ๋ ์์ํฌ |
| ์ธ์ด ์ง์ | TypeScript (๊ธฐ๋ณธ) + JavaScript | JavaScript (TypeScript๋ ๊ฐ๋ฅ) |
| ์ํคํ ์ฒ | ๋ชจ๋ ์์คํ ๊ธฐ๋ฐ | ์์ ๋ก์ด ์ฝ๋ ๊ตฌ์กฐ |
| ์์กด์ฑ ์ฃผ์ (DI) | ๋ด์ฅ๋์ด ์์ | ์ง์ ๊ตฌํํด์ผ ํจ |
| ๋ฐ์ฝ๋ ์ดํฐ(Decorator) | @Controller(), @Get() ๋ฑ ์ฌ์ฉ | ์์ |
| ์ ์ง๋ณด์์ฑ | ๋๊ท๋ชจ ํ๋ก์ ํธ์ ์ ํฉ | ์๊ท๋ชจ ํ๋ก์ ํธ์ ์ ํฉ |
| ์ฑ๋ฅ | Express.js ๊ธฐ๋ฐ (๋น์ทํ ์ฑ๋ฅ) | ๊ฐ๋ฒผ์ด ๊ตฌ์กฐ๋ก ๋น ๋ฆ |
๐ NestJS๋ Express.js๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด์, ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์๋๋ก ๊ตฌ์กฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํจ.
โ
๋๊ท๋ชจ ๋ฐฑ์๋ API๋ฅผ ๊ฐ๋ฐํ ๋
โ
TypeScript ๊ธฐ๋ฐ์ ์์ ์ ์ธ ์๋ฒ ๊ฐ๋ฐ์ด ํ์ํ ๋
โ
Express.js๋ณด๋ค ๋ ์ฒด๊ณ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ํ ๋
โ
์์กด์ฑ ์ฃผ์
(DI) ๋ฐ ๋ชจ๋ ๊ธฐ๋ฐ ๊ฐ๋ฐ์ด ํ์ํ ๋
๐ ์ฆ, NestJS๋ Node.js์์ ๋ ์์ ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํ ํ๋ ์์ํฌ!
๐ก NestJS๋ Node.js ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ์ด์ง๋ง, Node.js์๋ ๋ณ๊ฐ
๐ก ์ฆ, NestJS๋ Node.js ์์์ ๋์ํ๋ ์๋ฒ ํ๋ ์์ํฌ
| ํญ๋ชฉ | Node.js | NestJS |
|---|---|---|
| ์ ์ | JavaScript ๋ฐํ์ (์๋ฒ์์ JavaScript ์คํ) | Node.js ๊ธฐ๋ฐ ๋ฐฑ์๋ ํ๋ ์์ํฌ |
| ์ญํ | JavaScript๋ก ์๋ฒ ๊ฐ๋ฐ ๊ฐ๋ฅํ๊ฒ ํด์ค | Node.js์์ ๊ตฌ์กฐํ๋ API ์๋ฒ ๊ฐ๋ฐ ์ง์ |
| ์ธ์ด | JavaScript (ES6+), TypeScript ๊ฐ๋ฅ | TypeScript ๊ธฐ๋ฐ (JavaScript๋ ์ง์) |
| ํ๋ ์์ํฌ/๋ผ์ด๋ธ๋ฌ๋ฆฌ | Express.js, Koa, Fastify ๋ฑ ์ฌ์ฉ ๊ฐ๋ฅ | Express.js ๋๋ Fastify๋ฅผ ๋ด์ฅ |
| ๋น๊ต ๋์ | ๋ฐํ์ ํ๊ฒฝ (์๋ฒ ์ญํ ๊ฐ๋ฅ) | ๋ฐฑ์๋ ํ๋ ์์ํฌ (๊ตฌ์ฒด์ ์ธ ์๋ฒ ๊ฐ๋ฐ ์ง์) |
| ์ฌ์ฉ ๋ชฉ์ | ์๋ฒ ํ๊ฒฝ ๊ตฌ์ถ, CLI ๋๊ตฌ ์คํ, ํ์ผ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฑ | ๊ตฌ์กฐํ๋ API ๊ฐ๋ฐ, ๋๊ท๋ชจ ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ |
โ ์ฆ, Node.js๋ JavaScript๋ฅผ ์คํํ๋ ๋ฐํ์์ด๊ณ , NestJS๋ Node.js์์ ์๋ฒ๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๋๋ก ๋์์ฃผ๋ ํ๋ ์์ํฌ.
๐ก NestJS๋ Node.js ์์์ ๋์ํ๋ ํ๋ ์์ํฌ
๐ก ์ฆ, Node.js๊ฐ ์์ผ๋ฉด NestJS๋ ์คํํ ์ ์์!
๐ก NestJS๋ ๋ด๋ถ์ ์ผ๋ก Express.js ๋๋ Fastify ๊ฐ์ ์๋ฒ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด์ ๋์
๐ NestJS์ ๋ด๋ถ ๊ตฌ์กฐ
Node.js โ NestJS โ Express.js (or Fastify) โ API ๋ผ์ฐํธ ๋ฐ ๋น์ฆ๋์ค ๋ก์ง
โ
๋๊ท๋ชจ ํ๋ก์ ํธ์ ์ ํฉํ ๊ตฌ์กฐ ์ ๊ณต (์ํคํ
์ฒ ํจํด ์ ์ฉ)
โ
TypeScript ๊ธฐ๋ณธ ์ง์ (์์ ์ ์ธ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ)
โ
๋ชจ๋ ์์คํ
์ผ๋ก ์ฝ๋ ๋ถ๋ฆฌ ๋ฐ ๊ด๋ฆฌ ์ฉ์ด
โ
Express.js ๋๋ Fastify ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ ๊ฐ๋ฅ
โ
REST API & GraphQL ๊ฐ๋ฐ ์ง์
โ
Middleware, Guards, Interceptors ๋ฑ ํ์ฅ ๊ธฐ๋ฅ ์ ๊ณต
๐ ์ฆ, NestJS๋ "Node.js์์ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์๋ฒ ๊ฐ๋ฐ์ ์ํ ํ๋ ์์ํฌ" ๐
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("Hello, Node.js!");
});
app.listen(3000, () => {
console.log("์๋ฒ๊ฐ http://localhost:3000 ์์ ์คํ ์ค!");
});
๐ ํน์ง:
โ
Node.js์ ๊ธฐ๋ณธ์ ์ธ ์น ์๋ฒ
โ
Express.js๋ฅผ ์ฌ์ฉํ์ฌ API ๋ผ์ฐํ
์ ๊ณต
โ
ํ๋ก์ ํธ ๊ตฌ์กฐ๊ฐ ๋น๊ต์ ๋จ์
import { Controller, Get } from "@nestjs/common";
import { NestFactory } from "@nestjs/core";
import { Module } from "@nestjs/common";
@Controller()
class AppController {
@Get()
getHello() {
return "Hello, NestJS!";
}
}
@Module({
controllers: [AppController],
})
class AppModule {}
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
๐ ํน์ง:
โ
NestJS์ Controller, Module, Decorator ํจํด ์ฌ์ฉ
โ
TypeScript ๊ธฐ๋ฐ์ ๊ฐ์ฒด ์งํฅ์ ์ธ ๊ตฌ์กฐ
โ
Express.js๋ณด๋ค ๋ ๊ตฌ์กฐํ๋ ํ๋ก์ ํธ ๋ฐฉ์
โ Node.js๋ ๋ฐํ์ ํ๊ฒฝ โ JavaScript๋ก ์๋ฒ ์คํ ๊ฐ๋ฅ
โ NestJS๋ ํ๋ ์์ํฌ โ Node.js์์ ๋ ๊ตฌ์กฐ์ ์ธ ์๋ฒ ๊ฐ๋ฐ์ ์ง์
โ NestJS๋ ๋ด๋ถ์ ์ผ๋ก Node.js์ Express.js๋ฅผ ์ฌ์ฉํจ
โ Node.js ์์ด NestJS๋ฅผ ์คํํ ์ ์์
โ ์ฆ, Node.js๋ ์๋ฒ๋ฅผ ์คํํ๋ ๊ธฐ๋ฐ ๊ธฐ์ ์ด๊ณ , NestJS๋ ์๋ฒ ๊ฐ๋ฐ์ ๋ ์ฝ๊ฒ ํด์ฃผ๋ ํ๋ ์์ํฌ