Dev-ops

๐Ÿš€ Next.js ์›Œํฌํ”Œ๋กœ์šฐ ์™„์ „ ์ •๋ณต

xeunnie 2025. 3. 20. 01:00
728x90
๋ฐ˜์‘ํ˜•

๐Ÿš€ Next.js ์›Œํฌํ”Œ๋กœ์šฐ ์™„์ „ ์ •๋ณต

 

Next.js ํ”„๋กœ์ ํŠธ์—์„œ ํšจ์œจ์ ์ธ CI/CD๋ฅผ ์œ„ํ•œ GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ ์„ค์ •

 

๐Ÿ“Œ ๋ชฉ์ฐจ

1๏ธโƒฃ Next.js์—์„œ CI/CD๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

2๏ธโƒฃ Next.js ์›Œํฌํ”Œ๋กœ์šฐ ๊ธฐ๋ณธ ๊ตฌ์กฐ

3๏ธโƒฃ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ (on, jobs, steps, needs ๋“ฑ)

4๏ธโƒฃ Next.js CI/CD ์ž๋™ํ™” ์„ค์ • ์˜ˆ์ œ

5๏ธโƒฃ ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ์ตœ์ ํ™” ์ „๋žต

6๏ธโƒฃ ๊ฒฐ๋ก 

1๏ธโƒฃ Next.js์—์„œ CI/CD๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

 

Next.js ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ •์  ์ƒ์„ฑ(SSG), ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR), API Routes, Image Optimization ๋“ฑ

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐํฌ ์ž๋™ํ™”์™€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•ด์š”.

CI/CD๋ฅผ ํ†ตํ•ด ๐Ÿš€

โœ… ์ž๋™์œผ๋กœ ๋นŒ๋“œ & ๋ฐฐํฌํ•ด์„œ ์‹ค์ˆ˜๋ฅผ ์ค„์ด๊ณ ,

โœ… ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ฆํ•ด์„œ ์•ˆ์ „ํ•œ ๋ฐฐํฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”.

 

โœ… CI/CD ์—†์ด ๋ฐฐํฌํ•  ๊ฒฝ์šฐ?

โŒ ๋กœ์ปฌ์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ

โŒ ๋ฐฐํฌ ์‹œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ๋ˆ„๋ฝ๋  ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ

โŒ ์ •์  ํŽ˜์ด์ง€ & ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ํŽ˜์ด์ง€ ์บ์‹ฑ ๋ฌธ์ œ ๋ฐœ์ƒ

 

์ด์ œ Next.js์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋ฉด ์ข‹์„์ง€ ์‚ดํŽด๋ณด์ž! ๐ŸŽฏ

2๏ธโƒฃ Next.js ์›Œํฌํ”Œ๋กœ์šฐ ๊ธฐ๋ณธ ๊ตฌ์กฐ

 

Next.js ํ”„๋กœ์ ํŠธ์—์„œ CI/CD๋ฅผ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ณดํ†ต GitHub Actions๋ฅผ ํ™œ์šฉํ•ด์š”.

GitHub Actions๋Š” YAML ํŒŒ์ผ์„ ์ด์šฉํ•ด์„œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ •์˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š”๋ฐ,

๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”.

name: Next.js CI/CD

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v3

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 18

      - name: Install Dependencies
        run: npm ci

      - name: Build Project
        run: npm run build

๐Ÿ“Œ ์œ„ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด?

โœ… on: ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‹คํ–‰ํ• ์ง€ ์„ค์ •

โœ… jobs: ์‹คํ–‰ํ•  ์ž‘์—…๋“ค์„ ์ •์˜

โœ… steps: ํ•œ ๊ฐœ์˜ ์ž‘์—…(job) ์•ˆ์—์„œ ๋‹จ๊ณ„๋ณ„๋กœ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด

 

์ด์ œ ๊ฐ๊ฐ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž! ๐Ÿง

3๏ธโƒฃ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ (on, jobs, steps, needs ๋“ฑ)

 

โœ”๏ธ on: ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰ ์กฐ๊ฑด

 

on ํ‚ค์›Œ๋“œ๋Š” GitHub Actions์—์„œ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ์กฐ๊ฑด์„ ์ •์˜ํ•ด์š”.

Next.js์—์„œ๋Š” ์ฃผ๋กœ push, pull_request, workflow_dispatch ๋“ฑ์„ ์‚ฌ์šฉํ•ด์š”.

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
  workflow_dispatch:  # ์ˆ˜๋™ ์‹คํ–‰

โœ… ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด?

โœ”๏ธ main ๋ธŒ๋žœ์น˜์— push ๋˜๋Š” PR์ด ๋ฐœ์ƒํ•˜๋ฉด ์‹คํ–‰

โœ”๏ธ workflow_dispatch ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด GitHub Actions์—์„œ ์ง์ ‘ ์‹คํ–‰ ๊ฐ€๋Šฅ

โœ”๏ธ jobs: ์‹คํ–‰ํ•  ์ž‘์—… ๊ทธ๋ฃน

 

jobs ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ job์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋นŒ๋“œ → ํ…Œ์ŠคํŠธ → ๋ฐฐํฌ ์ˆœ์„œ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ฐ๊ฐ์˜ job์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์š”.

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v3

      - name: Install Dependencies
        run: npm ci

      - name: Build Next.js
        run: npm run build

โœ… ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด?

โœ”๏ธ ubuntu-latest ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰

โœ”๏ธ npm ci๋กœ ์˜์กด์„ฑ ์„ค์น˜ ํ›„ npm run build ์‹คํ–‰

โœ”๏ธ steps: ๊ฐ ์ž‘์—…์—์„œ ์‹คํ–‰ํ•  ๋‹จ๊ณ„

 

๊ฐ job์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ steps(๋‹จ๊ณ„)๊ฐ€ ๋“ค์–ด๊ฐ€์š”.

GitHub Actions์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์•ก์…˜(uses)์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ๋ช…๋ น์–ด(run)๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.

steps:
  - name: Checkout Repository
    uses: actions/checkout@v3

  - name: Set up Node.js
    uses: actions/setup-node@v3
    with:
      node-version: 18

  - name: Install Dependencies
    run: npm ci

โœ… ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด?

โœ”๏ธ checkout@v3 → ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ฝ”๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ

โœ”๏ธ setup-node@v3 → Node.js 18 ๋ฒ„์ „ ์„ค์ •

โœ”๏ธ npm ci → ํŒจํ‚ค์ง€ ์„ค์น˜

โœ”๏ธ needs: ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰ ์ˆœ์„œ ์ง€์ •

 

needs๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • job์ด ์™„๋ฃŒ๋œ ํ›„์— ๋‹ค๋ฅธ job์ด ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋นŒ๋“œ๊ฐ€ ๋๋‚˜์•ผ ๋ฐฐํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Install Dependencies
        run: npm ci
      - name: Build Next.js
        run: npm run build

  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Deploy Application
        run: echo "๋ฐฐํฌ ์ง„ํ–‰ ์ค‘..."

โœ… ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด?

โœ”๏ธ build ์ž‘์—…์ด ๋๋‚œ ํ›„์—๋งŒ deploy ์‹คํ–‰!

4๏ธโƒฃ Next.js CI/CD ์ž๋™ํ™” ์„ค์ • ์˜ˆ์ œ

 

๋นŒ๋“œ + ํ…Œ์ŠคํŠธ + ๋ฐฐํฌ๊นŒ์ง€ ์ž๋™ํ™”๋œ Next.js CI/CD ์„ค์ •์„ ๋งŒ๋“ค์–ด๋ณด์ž!

name: Next.js CI/CD Pipeline

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v3
      - name: Install Dependencies
        run: npm ci
      - name: Build Next.js
        run: npm run build

  test:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Run Tests
        run: npm test

  deploy:
    runs-on: ubuntu-latest
    needs: test
    steps:
      - name: Deploy Application
        run: echo "๋ฐฐํฌ ์ง„ํ–‰ ์ค‘..."

๐Ÿ“Œ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด?

1๏ธโƒฃ build → Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ

2๏ธโƒฃ test → ๋นŒ๋“œ ์™„๋ฃŒ ํ›„ ํ…Œ์ŠคํŠธ ์‹คํ–‰

3๏ธโƒฃ deploy → ํ…Œ์ŠคํŠธ ์™„๋ฃŒ ํ›„ ๋ฐฐํฌ ์ง„ํ–‰

5๏ธโƒฃ ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ์ตœ์ ํ™” ์ „๋žต

 

๋ฐฐํฌ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ์„ค์ •์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

โœ… ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

 

Next.js์—์„œ .env ํŒŒ์ผ์„ CI/CD์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด GitHub Actions์˜ secrets ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด์•ผ ํ•ด์š”.

- name: Set Environment Variables
  run: echo "NEXT_PUBLIC_API_KEY=${{ secrets.API_KEY }}" >> .env

โœ… Vercel์„ ์ด์šฉํ•œ ์ž๋™ ๋ฐฐํฌ

 

Next.js๋Š” Vercel๊ณผ ๊ถํ•ฉ์ด ์ข‹์•„์š”! Vercel์„ ์ด์šฉํ•˜๋ฉด ๋ฐฐํฌ๋ฅผ ์‰ฝ๊ฒŒ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.

Vercel CLI๋ฅผ ์ด์šฉํ•ด์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ์„ค์ •ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ํ‘ธ์‹œ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ฐฐํฌ ๊ฐ€๋Šฅ!

- name: Deploy to Vercel
  run: vercel --prod --token=${{ secrets.VERCEL_TOKEN }}

๐ŸŽฏ ๊ฒฐ๋ก : Next.js CI/CD ์ž๋™ํ™” ๋งˆ์Šคํ„ฐ!

 

โœ”๏ธ CI/CD ์›Œํฌํ”Œ๋กœ์šฐ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ

โœ”๏ธ ํ…Œ์ŠคํŠธ & ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ํ†ตํ•ด ์•ˆ์ •์ ์ธ ํ”„๋กœ์ ํŠธ ์šด์˜ ๊ฐ€๋Šฅ

โœ”๏ธ Vercel๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์†์‰ฝ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Œ

 

๐Ÿ’ก ์ด์ œ Next.js ํ”„๋กœ์ ํŠธ์—์„œ๋„ CI/CD๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๊ณ ,

์ž๋™์œผ๋กœ ๋ฐฐํฌ๋˜๋Š” ๋ฉ‹์ง„ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด๋ณด์ž! ๐Ÿš€

 

๐ŸŒท ์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น! ๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•