ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 /users

     

    NestJS์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    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 /users

     

    getUsers() ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

     

    ๊ฐ™์€ ๊ธฐ๋Šฅ์„ 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์˜ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ๋Š” ๋Œ€๋ถ€๋ถ„ ์ดํ•ดํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Designed by Tistory.