-
[Node.js] NestJS ๊ตฌ์กฐ ์ดํดํ๊ธฐ๐ Node.js 2026. 8. 17. 13:26
NestJS๋ ๊ฐ๋จํ๊ฒ ์ด ์ธ๊ฐ์ง๋ฅผ ๊ธฐ์ตํ๋ฉด ๋๋ค.
Controller → ์์ฒญ ๋ฐ๊ธฐ
Service → ๋ก์ง ์ฒ๋ฆฌ
Module → Controller + Service ๊ด๋ฆฌ์ด ์ธ๊ฐ์ง๋ฅผ ๊ธฐ์ตํ๋ฉด์ ํ๋ก์ ํธ๋ฅผ ์์ฑ๋ถํฐ ํด๋ณด๊ฒ ๋ค.
1. NestJS ํ๋ก์ ํธ ์์ฑ ๐
NestJS๋ CLI๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก์ ํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
npm i -g @nestjs/cli nest new my-projectํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๋น์ทํ ๊ตฌ์กฐ๊ฐ ๋ง๋ค์ด์ง๋ค.
my-project/ โโโ src/ # ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ โ โโโ app.controller.ts # ์์ฒญ(URL)์ ๋ฐ์์ ์๋ต โ โโโ app.service.ts # ์ค์ ๋น์ฆ๋์ค ๋ก์ง โ โโโ app.module.ts # Controller, Service ๋ฑ์ ๋ฌถ์ด์ ๊ด๋ฆฌ โ โโโ main.ts # ์๋ฒ ์คํ ์์์ โโโ test/ # ํ ์คํธ ์ฝ๋ โโโ package.json # ์ค์น๋ ํจํค์ง์ ์คํ ๋ช ๋ น์ด ๊ด๋ฆฌ โโโ tsconfig.json # TypeScript ์ค์ ์ฒ์ ๋ณด๋ฉด ํ์ผ์ด ์ฌ๋ฌ ๊ฐ๋ผ์ Express๋ณด๋ค ๋ณต์กํด ๋ณด์ผ ์ ์๋ค.
ํ์ง๋ง ๊ฐ๊ฐ์ ์ญํ ์ ๋๋ ์ ๋ณด๋ฉด ์ดํดํ๊ธฐ ์ฝ๋ค.
main.ts - ์ ํ๋ฆฌ์ผ์ด์ ์์ AppModule - ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๊ตฌ์ฑ Controller - HTTP ์์ฒญ์ ๋ฐ์ Service - ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌ2. Controller๋? ๐น๏ธ
NestJS์์ Controller๋ ํด๋ผ์ด์ธํธ์ HTTP ์์ฒญ์ ๋ฐ๋ ์ญํ ์ ํ๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ API๋ฅผ ๋ง๋ ๋ค๊ณ ํด๋ณด์.
GET /usersNestJS์์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
import { Controller, Get } from '@nestjs/common'; @Controller('users') export class UserController { @Get() getUsers() { return [ { id: 1, name: 'ํ๊ธธ๋' } ]; } }์ด ์ฝ๋๋ฅผ ํ๋์ฉ ์ดํด๋ณด๊ฒ ๋ค.
@Controller('users')@Controller๊ฐ /users ๊ฒฝ๋ก๋ฅผ ๋ด๋นํ๋ค๋ ์๋ฏธ๋ค.
@Get()@Get()์ HTTP GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ค๋ ์๋ฏธ์ด๋ค.
๋ฐ๋ผ์ get์์ฒญ์ด ๋ค์ด์ค๋ฉด,
GET /usersgetUsers() ๋ฉ์๋๊ฐ ์คํ๋๋ค.
๊ฐ์ ๊ธฐ๋ฅ์ Express๋ก ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Express
app.get('/users', (req, res) => { res.json([ { id: 1, name: 'ํ๊ธธ๋' } ]); });NestJS
@Controller('users') export class UserController { @Get() getUsers() { return [ { id: 1, name: 'ํ๊ธธ๋' } ]; } }๋ ๋ค ๊ฒฐ๊ตญ ๊ฐ์ ์ญํ ์ ํ๋ค.
GET /users ↓ ์ฌ์ฉ์ ๋ชฉ๋ก ๋ฐํ์ฐจ์ด์ ์ NestJS์์๋ Decorator๋ฅผ ์ด์ฉํด์ ๋ผ์ฐํ ๊ณผ Controller์ ์ญํ ์ ๊ตฌ์กฐ์ ์ผ๋ก ํํํ๋ค๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ Decorator๋ฅผ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด ํด๋์ค, ๋ฉ์๋, ๋ณ์ ๋ฑ์ ํน๋ณํ ๊ธฐ๋ฅ์ด๋ ์ ๋ณด๋ฅผ ๋ถ์ฌ์ฃผ๋ ๋ฌธ๋ฒ์ด๋ค.
@Controller('users') export class UserController { @Get() getUsers() { return [ { id: 1, name: 'ํ๊ธธ๋' } ]; } }์์ ์ฝ๋๋ก ์์๋ฅผ ๋ค์์๋
@Controller('users') : ์ด ํด๋์ค๊ฐ Controller์์ ์ง์
@Get() : ์ด ๋ฉ์๋๊ฐ GET ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ก ์ง์
์ฆ, @๋ก ์์ํ๋ ๊ฒ์ด Decorator์ด๊ณ ,
NestJS์๊ฒ "์ด ์ฝ๋๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง" ์๋ ค์ฃผ๋ ์ญํ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.3. Service๋?
Nest.js๋ฅผ ์ฌ์ฉํ๋ ์ค์ ํ๋ก์ ํธ์์๋ Controller๊ฐ ๋๋ฌด ๋ง์ ์ผ์ ๋ด๋นํ์ง ์๋๋ก ํ๋ ๊ฒ์ด ์ข๋ค.
์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ๋ชฉ๋ก์ DB์์ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ด ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ๋ค..
Controller ↓ DB ์กฐํ ↓ ๋ฐ์ดํฐ ๊ฐ๊ณต ↓ ์๋ต์์ฒ๋ผ Controller๊ฐ DB์กฐํ๋ฅผ ํ๊ณ , ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ณ , ๊ฐ๊ณตํ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ ์๋ต์ ํ๋
๋ชจ๋ ์ผ์ ๋ด๋นํ๊ฒ ๋๋ฉด ์ฝ๋๋ ์ ์ ๋ณต์กํด์ง๋ค.
๊ทธ๋์ NestJS์์๋ ์ด๋ฐ ๋น์ฆ๋์ค ๋ก์ง์ Service๋ก ๋ถ๋ฆฌํ๋ค.
import { Injectable } from '@nestjs/common'; @Injectable() export class UserService { getUsers() { return [ { id: 1, name: 'ํ๊ธธ๋' } ]; } }๊ทธ๋ฆฌ๊ณ Controller์์๋ Service๋ฅผ ์ฌ์ฉํ๋ค.
import { Controller, Get } from '@nestjs/common'; import { UserService } from './user.service'; @Controller('users') export class UserController { constructor( private readonly userService: UserService, ) {} @Get() getUsers() { return this.userService.getUsers(); } }์ด๋ ๊ฒ ํ๋ฉด ์ญํ ์ด ๋ถ๋ฆฌ๋๋ค.
Controller → HTTP ์์ฒญ์ ๋ฐ๋๋ค. Service → ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.์ด๋ฌํ ๊ตฌ์กฐ๋ ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก ํฐ ์ฅ์ ์ด ๋๋ค.
๊ทธ๋ฆฌ๊ณ
์ ์ฝ๋์์ ์ฒ์ NestJS๋ฅผ ์ ํ๋ฉด ๋ค์ ๋ถ๋ถ์ด ์กฐ๊ธ ๋ฏ์ค ์ ์๋ค.
constructor( private readonly userService: UserService, ) {}๊ฐ๋ฐ์๊ฐ ์ง์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์๋ค.
const userService = new UserService();์ด๊ฒ์ด NestJS์ ์ค์ํ ๊ฐ๋ ์ค ํ๋์ธ Dependency Injection(DI)โ์ด๋ค.
NestJS๊ฐ ํ์ํ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๊ณ Controller์ ์ฃผ์ ํด์ค๋ค.
์ฝ๊ฒ ๋งํ๋ฉด,
Controller ↓ "UserService๊ฐ ํ์ํด" ↓ NestJS ↓ UserService๋ฅผ ๋ง๋ค์ด์ ์ ๋ฌ๊ฐ๋ฐ์๊ฐ ๊ฐ์ฒด ์์ฑ๊ณผ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ง์ ํ์ง ์์๋ ๋๋ ์์ฃผ ํฐ ์ฅ์ ์ด ์๋ค.
4. Module์ด๋?
Module์ ์ฝ๊ฒ ๋งํด์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ํ๋์ ๋จ์๋ก ๋ฌถ์ด ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
User โโโ UserController โโโ UserService โโโ UserModule์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ๊ธฐ๋ฅ์ด ์๋ค๋ฉด ์์ฒ๋ผ ๊ตฌ์ฑํ ์ ์๋ค.
import { Module } from '@nestjs/common'; import { UserController } from './user.controller'; import { UserService } from './user.service'; @Module({ controllers: [UserController], providers: [UserService], }) export class UserModule {}๊ทธ๋ฆฌ๊ณ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ด Module์ ๊ฐ์ ธ์จ๋ค.
AppModule โ โโโ UserModule โโโ AuthModule โโโ DocumentModule โโโ ...ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก ๊ธฐ๋ฅ๋ณ๋ก Module์ ๋๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์ฑ ์์ ๋ถ๋ฆฌํ๊ธฐ ์ฝ๋ค.
5. NestJS์ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ
์ง๊ธ๊น์ง ์ค๋ช ํ ๋ด์ฉ์ ํ๋๋ก ์ฐ๊ฒฐํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Client โ โ HTTP Request โผ Controller โ โ ์์ฒญ ์ฒ๋ฆฌ โผ Service โ โ ๋น์ฆ๋์ค ๋ก์ง โผ Repository / Model โ โผ Database๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ Module์ด ๋ฌถ์ด์ค๋ค.
AppModule โ โโโ AuthModule โ โโโ AuthController โ โโโ AuthService โ โโโ UserModule โ โโโ UserController โ โโโ UserService โ โโโ DocumentModule โโโ DocumentController โโโ DocumentService์ด ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ฉด NestJS์ ๊ธฐ๋ณธ์ ์ธ ํํ๋ ๋๋ถ๋ถ ์ดํดํ๋ค๊ณ ๋ณผ ์ ์๋ค.
'๐ Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Node.js] NestJS ์ฃผ์ ๊ธฐ๋ฅ ์์๋ณด๊ธฐ(DTO, Validation, Guard, ์ธ์ฆ๊ณผ ์์ธ์ฒ๋ฆฌ) (0) 2026.08.17 [Node.js] NestJS๋? (0) 2026.08.17 [Node.js] JWT(Json Web Token)๋ฅผ ์ด์ฉํ ๋ก๊ทธ์ธ ์ธ์ฆ ๊ตฌํ (0) 2026.07.14 cloudflare R2 ์ฐ๋ (1) 2026.04.07 [Node.js] Express๋? (์ ์ ๋ฐ ์ฌ์ฉ๋ฒ) (0) 2024.11.07