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

๋ฐ˜์‘ํ˜•

๐Ÿ“Œ NestJS ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ: ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹ค์ „๊นŒ์ง€ - NestJS Docker ๋ฐฐํฌ ๋ฐ CI/CD ์‹ค์ „ ๊ฐ€์ด๋“œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค๋ฉด, ์ด์ œ๋Š” **์•ˆ์ •์ ์œผ๋กœ ๋ฐฐํฌํ•˜๊ณ  ์ง€์†์ ์œผ๋กœ ํ†ตํ•ฉ/๋ฐฐํฌ(CI/CD)**ํ•˜๋Š” ๊ณผ์ •์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” NestJS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Docker๋กœ ์ปจํ…Œ์ด๋„ˆํ™”ํ•˜๊ณ , GitHub Actions๋ฅผ ํ™œ์šฉํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๐Ÿš€


14.1 NestJS Docker ๋ฐฐํฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

โœ” ์–ด๋””์„œ๋‚˜ ๋™์ผํ•œ ํ™˜๊ฒฝ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ
โœ” ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ์šด์˜ ํ™˜๊ฒฝ ๊ฐ„ ์ฐจ์ด๋ฅผ ์ตœ์†Œํ™”
โœ” CI/CD ๋„๊ตฌ์™€ ์‰ฝ๊ฒŒ ํ†ตํ•ฉ


14.2 NestJS Dockerfile ์ž‘์„ฑ

๐Ÿ“‚ Dockerfile

# ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์„ค์ •
FROM node:18-alpine

# ์•ฑ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ ๋ฐ ์„ค์ •
WORKDIR /app

# ์ข…์†์„ฑ ์„ค์น˜๋ฅผ ์œ„ํ•œ package ํŒŒ์ผ ๋ณต์‚ฌ
COPY package*.json ./

# ํŒจํ‚ค์ง€ ์„ค์น˜
RUN npm install

# NestJS ์ฝ”๋“œ ๋ณต์‚ฌ
COPY . .

# ์•ฑ ๋นŒ๋“œ
RUN npm run build

# ํฌํŠธ ์„ค์ •
EXPOSE 3000

# ์•ฑ ์‹คํ–‰
CMD ["node", "dist/main"]

14.3 .dockerignore ํŒŒ์ผ ์ถ”๊ฐ€

๐Ÿ“‚ .dockerignore

node_modules
dist
.git
.env

โœ… ๋นŒ๋“œ ์‹œ ํ•„์š” ์—†๋Š” ํŒŒ์ผ ์ œ์™ธ
โœ… ๋นŒ๋“œ ์†๋„ ํ–ฅ์ƒ, ๋ณด์•ˆ ์œ„ํ—˜ ๊ฐ์†Œ


14.4 Docker Compose๋กœ PostgreSQL ์—ฐ๋™

๋ฐ˜์‘ํ˜•

๐Ÿ“‚ docker-compose.yml

version: '3.8'
services:
  app:
    build: .
    ports:
      - '3000:3000'
    environment:
      - DATABASE_URL=postgres://postgres:password@db:5432/nest
    depends_on:
      - db
  db:
    image: postgres:15
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: nest
    ports:
      - '5432:5432'

๐Ÿ’ก NestJS์˜ .env์— DATABASE_URL์„ ์„ค์ •ํ•ด ๋‘๋ฉด ORM๊ณผ ์—ฐ๋™ ๊ฐ€๋Šฅ


14.5 ๋กœ์ปฌ์—์„œ Docker ์‹คํ–‰

docker-compose up --build

โœ… ์•ฑ์€ localhost:3000์—์„œ ์‹คํ–‰
โœ… PostgreSQL์€ localhost:5432์—์„œ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ


14.6 GitHub Actions๋กœ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ

๐Ÿ“‚ .github/workflows/deploy.yml

name: NestJS CI/CD

on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: ์ฝ”๋“œ ์ฒดํฌ์•„์›ƒ
        uses: actions/checkout@v3

      - name: Node ์„ค์น˜
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: ์˜์กด์„ฑ ์„ค์น˜
        run: npm install

      - name: ํ…Œ์ŠคํŠธ ์‹คํ–‰
        run: npm run test

      - name: Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ
        run: docker build -t my-nest-app .

      - name: DockerHub ๋กœ๊ทธ์ธ
        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

      - name: Docker ์ด๋ฏธ์ง€ ํ‘ธ์‹œ
        run: docker tag my-nest-app docker.io/${{ secrets.DOCKER_USERNAME }}/my-nest-app:latest && docker push docker.io/${{ secrets.DOCKER_USERNAME }}/my-nest-app:latest

โœ… ๊ตฌ์„ฑ ์š”์•ฝ

  • main ๋ธŒ๋žœ์น˜์— push ์‹œ ์ž๋™ ์‹คํ–‰
  • ์˜์กด์„ฑ ์„ค์น˜ → ํ…Œ์ŠคํŠธ → Docker ๋นŒ๋“œ → DockerHub ํ‘ธ์‹œ
  • secrets๋Š” GitHub Repository → Settings → Secrets์—์„œ ๋“ฑ๋ก

14.7 CI/CD ํ›„ ์„œ๋ฒ„์—์„œ Docker๋กœ ๋ฐฐํฌ

โœ… ์„œ๋ฒ„์— ์ ‘์† ํ›„:

docker pull <your-username>/my-nest-app:latest
docker stop nest-app || true
docker rm nest-app || true
docker run -d --name nest-app -p 3000:3000 <your-username>/my-nest-app:latest

โœ… ์ตœ์‹  ์ด๋ฏธ์ง€๋กœ ์•ฑ ์žฌ์‹คํ–‰
โœ… ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด Nginx + Reverse Proxy + Zero Downtime ์ „๋žต๋„ ๊ณ ๋ ค ๊ฐ€๋Šฅ


14.8 ์‹ค์ „ ์šด์˜ ํŒ

โœ” .env๋Š” Git์— ํฌํ•จ์‹œํ‚ค์ง€ ๋ง๊ณ  secrets ๋˜๋Š” Volume์œผ๋กœ ๊ด€๋ฆฌ
โœ” healthcheck๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง
โœ” Slack, Discord ๋“ฑ์œผ๋กœ ๋ฐฐํฌ ์„ฑ๊ณต/์‹คํŒจ ์•Œ๋ฆผ ์—ฐ๋™
โœ” Rollback์„ ์œ„ํ•ด ์ด์ „ ๋ฒ„์ „ ํƒœ๊ทธ ๊ด€๋ฆฌ


14.9 ๊ฒฐ๋ก : NestJS + Docker + GitHub Actions์œผ๋กœ ์ž๋™ํ™”๋œ ๋ฐฑ์—”๋“œ ์šด์˜ ๋งŒ๋“ค๊ธฐ

โœ… Docker๋กœ ์–ด๋””์„œ๋‚˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ NestJS ํ™˜๊ฒฝ ๊ตฌ์„ฑ
โœ… PostgreSQL ํฌํ•จํ•œ ํ†ตํ•ฉ ํ™˜๊ฒฝ ๊ตฌ์ถ• (docker-compose)
โœ… GitHub Actions๋กœ ํ…Œ์ŠคํŠธ ๋ฐ ์ž๋™ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•
โœ… ์‹ค์ „ ํ™˜๊ฒฝ์—์„œ๋„ ํ™•์žฅ์„ฑ๊ณผ ์žฌํ˜„์„ฑ์„ ๊ฐ–์ถ˜ ์šด์˜ ๊ฐ€๋Šฅ

๋‹ค์Œ ๊ธ€์—์„œ๋Š” NestJS์—์„œ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ๋ณด์•ˆ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๐Ÿš€


๐Ÿ” ๋‹ค์Œ ๊ธ€ ์˜ˆ๊ณ : NestJS ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋ณด์•ˆ ์ „๋žต

๐Ÿ“Œ ๋‹ค์Œ ํŽธ: 15. NestJS ์„ฑ๋Šฅ ์ตœ์ ํ™” & ๋ณด์•ˆ ๊ฐ€์ด๋“œ


 

 

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/04   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•