DOM (Feat. REACT)

๐Ÿš€ 1. CI/CD (Continuous Integration / Continuous Deployment)

์ฝ”๋“œ ํ†ตํ•ฉ๊ณผ ์ž๋™ ๋ฐฐํฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ž๋™ํ™”ํ•˜๋Š” ๊ธฐ์ˆ ์  ํŒŒ์ดํ”„๋ผ์ธ

๐Ÿ›  CI (Continuous Integration)

  • ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ์— ์ž‘์—…ํ•œ ์ฝ”๋“œ๋ฅผ ์ž์ฃผ ๋ณ‘ํ•ฉ(Merge) ํ•˜๋Š” ๊ณผ์ •.
  • ๋ณ‘ํ•ฉํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ค์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๊ฒŒ ํ•จ.
  • ๊ฐœ๋ฐœ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ ํ’ˆ์งˆ ์œ ์ง€.

์˜ˆ: GitHub์— ์ฝ”๋“œ Push โ†’ ํ…Œ์ŠคํŠธ ์ž๋™ ์‹คํ–‰ โ†’ ๋ฌธ์ œ ์—†์œผ๋ฉด main ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ

๐Ÿš€ CD (Continuous Deployment or Continuous Delivery)

  • CI๊ฐ€ ๋๋‚œ ๋‹ค์Œ, ์ž๋™์œผ๋กœ ๋ฐฐํฌ(์„œ๋ฒ„์— ๋ฐ˜์˜) ๊นŒ์ง€ ์ด์–ด์ง€๋Š” ๊ณผ์ •.
  • Continuous Delivery๋Š” ์ž๋™ ๋ฐฐํฌ ์ „ ์ˆ˜๋™ ํ™•์ธ ์žˆ์Œ.
  • Continuous Deployment๋Š” ํ‘ธ์‹œ ํ›„ ์ž๋™์œผ๋กœ ์‹ค์„œ๋ฒ„ ๋ฐ˜์˜๋จ.

์˜ˆ: CI๋กœ ๋นŒ๋“œ ์„ฑ๊ณต โ†’ AWS๋‚˜ Vercel์— ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋จ

์žฅ์ :

  • ๋ฐฐํฌ ์†๋„ ํ–ฅ์ƒ, ์—๋Ÿฌ ์ตœ์†Œํ™”, ๋ฐ˜๋ณต ์—…๋ฌด ๊ฐ์†Œ

๐Ÿ”ง CI/CD์—์„œ GitHub Actions ๋งŽ์ด ์“ฐ๋Š” ์ด์œ :

  1. GitHub ์ž์ฒด ํ†ตํ•ฉ โ€“ GitHub์—์„œ ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ์–ด์„œ ์„ค์ •์ด ํŽธํ•ด.
  2. ์›Œํฌํ”Œ๋กœ์šฐ ๊ตฌ์„ฑ ์‰ฌ์›€ โ€“ .yml ํŒŒ์ผ๋กœ ์ž๋™ํ™” ํ๋ฆ„ ์ •์˜ ๊ฐ€๋Šฅ.
  3. ๊ด‘๋ฒ”์œ„ํ•œ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค โ€“ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŒ๋“  ์•ก์…˜์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ: ํ…Œ์ŠคํŠธ ์‹คํ–‰, ๋ฐฐํฌ, ์ฝ”๋“œ ๋ฆฐํŠธ, S3 ์—…๋กœ๋“œ ๋“ฑ.
  4. ๋ฌด๋ฃŒ ์š”๊ธˆ์ œ ์ œ๊ณต โ€“ ํผ๋ธ”๋ฆญ ์ €์žฅ์†Œ๋Š” ๋ฌด์ œํ•œ ๋ฌด๋ฃŒ, ํ”„๋ผ์ด๋น—์€ ์ผ์ • ์‚ฌ์šฉ๋Ÿ‰(2,000๋ถ„/์›”๊นŒ์ง€)์€ ๋ฌด๋ฃŒ.

โš™๏ธ ์–ด๋–ป๊ฒŒ ์“ฐ๋Š” ๊ฑด๋ฐ?

  1. .github/workflows/ci.yml ๊ฐ™์€ ์›Œํฌํ”Œ๋กœ์šฐ ํŒŒ์ผ ์ƒ์„ฑ
  2. ์•ˆ์— on: push ๊ฐ™์€ ํŠธ๋ฆฌ๊ฑฐ์™€, ์–ด๋–ค ์ž‘์—…์„ ํ•  ๊ฑด์ง€ jobs: ์•ˆ์— ์ž‘์„ฑ
  3. ์˜ˆ์‹œ:
name: CI Test

on: [push]

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

      - name: Install Dependencies
        run: npm install

      - name: Run Tests
        run: npm test

์ด๊ฑฐ ์ปค๋ฐ‹ํ•˜๊ฑฐ๋‚˜ pushํ•˜๋ฉด ์ž๋™์œผ๋กœ ์‹คํ–‰๋ผ.
CD(๋ฐฐํฌ)๋„ ๋น„์Šทํ•˜๊ฒŒ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ผ.

์˜ค์ผ€์ด, Vercel๋กœ ํ”„๋ก ํŠธ๋งŒ ๋ฐฐํฌํ•  ๊ฑฐ๋ฉด GitHub Actions๋ฅผ ์“ธ ํ•„์š”๊ฐ€ ๊ฑฐ์˜ ์—†์–ด.

์™œ๋ƒ๋ฉด Vercel์€ GitHub์— ํ‘ธ์‹œ๋งŒ ํ•ด๋„ ์ž๋™์œผ๋กœ CI/CD ๋˜๊ฑฐ๋“ . ์•„์ฃผ ํŽธํ•˜๋”” ํŽธํ•œ ์‹œ์Šคํ…œ์ด์•ผ.

โธป

โœ… Vercel ์ž๋™ ๋ฐฐํฌ ํ๋ฆ„ (ํ”„๋ก ํŠธ์—”๋“œ ๊ธฐ์ค€)

  1. Vercel์— GitHub ์—ฐ๋™

  2. ํŠน์ • ๋ธŒ๋žœ์น˜(ex. main)์— ํ‘ธ์‹œ โ†’ ์ž๋™์œผ๋กœ ๋นŒ๋“œ & ๋ฐฐํฌ

  3. .env ์„ค์ •๋„ Vercel ์›น UI์—์„œ ๊ฐ€๋Šฅ

โธป

๐Ÿ” ํ•˜์ง€๋งŒ GitHub Actions๋„ ์จ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

โ€ข ํ…Œ์ŠคํŠธ ์ž๋™ํ™” (CI): npm test, eslint, prettier ๊ฐ™์€ ๊ฑฐ ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ  ํ‘ธ์‹œํ• ์ง€ ํŒ๋‹จํ•˜๊ณ  ์‹ถ์„ ๋•Œ

โ€ข ๋นŒ๋“œ ์ตœ์ ํ™” ์ฒดํฌ

โ€ข ๋‹ค์–‘ํ•œ ๋ธŒ๋žœ์น˜์— ๋”ฐ๋ฅธ ์กฐ๊ฑด๋ถ€ ๋ฐฐํฌ

โ€ข Storybook ๋ฐฐํฌ (GitHub Pages) ๊ฐ™์€ ๋ณ„๋„ ์ •์  ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

โธป

๊ทธ๋Ÿผ ๋„ˆํ•œํ…Œ ํ•„์š”ํ•œ ์ „๋žต ์š”์•ฝ:

โ€ข ์šฐ์„ ์€ GitHub โ†’ Vercel ์ž๋™ํ™”๋กœ ์ถฉ๋ถ„

โ€ข ์ดํ›„ CI ๊ฒ€์ฆ, Storybook ๋ฐฐํฌ ๋“ฑ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ GitHub Actions ๋„์ž…

๐Ÿ”ง ๋‹ค์Œ์œผ๋กœ ํ•˜๋ฉด ์ข‹์€ ๊ฑฐ:

  1. .env ๋ณ€์ˆ˜ ์„ค์ • (Vercel์—์„œ)

โ€ข Vercel Dashboard โ†’ Project โ†’ Settings โ†’ Environment Variables

โ€ข API ํ‚ค๋‚˜ ๋น„๋ฐ€๊ฐ’์€ ์—ฌ๊ธฐ์—

  1. ์ปค์Šคํ…€ ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ (์„ ํƒ)

โ€ข ๋ฌด๋ฃŒ ์„œ๋ธŒ๋„๋ฉ”์ธ: your-project.vercel.app

โ€ข ๊ฐœ์ธ ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ (Vercel์—์„œ DNS ์„ค์ • ์ง€์›)

  1. ํ‘ธ์‹œ ๋ธŒ๋žœ์น˜ ์ •ํ•˜๊ธฐ

โ€ข ๋ณดํ†ต main ๋ธŒ๋žœ์น˜ ๊ธฐ์ค€ ์ž๋™ ๋ฐฐํฌ

โ€ข dev ๋ธŒ๋žœ์น˜ ๋”ฐ๋กœ ๋‘๊ณ  ํ”„๋ฆฌ๋ทฐ๋กœ ๋ฐฐํฌํ•  ์ˆ˜๋„ ์žˆ์–ด

โธป

๐Ÿค– GitHub Actions ์–ธ์ œ ์“ฐ๋ฉด ์ข‹๋ƒ?

๋„ˆ๊ฐ€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ํ•  ์ƒ๊ฐ์ด๋ฉด ์จ๋ด:

โ€ข main ํ‘ธ์‹œ ์ „์— ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ•„์ˆ˜ ์กฐ๊ฑด ๊ฑธ๊ณ  ์‹ถ๋‹ค

โ€ข Storybook์„ GitHub Pages๋‚˜ ๋‹ค๋ฅธ ์ •์  ํ˜ธ์ŠคํŒ…์— ์ž๋™ ๋ฐฐํฌํ•˜๊ณ  ์‹ถ๋‹ค

โ€ข SSR, ๋ฐฑ์—”๋“œ ๊ฐ™์ด ๋ฌถ์€ ํ”„๋กœ์ ํŠธ๋ผ Vercel ๋ง๊ณ  Cloudflare๋‚˜ AWS์— ๋ฐฐํฌํ•  ์˜ˆ์ •์ด๋‹ค

โธป

ํ•„์š”ํ•˜๋ฉด GitHub Actions ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ๋„ ๋งŒ๋“ค์–ด์ค„๊ฒŒ.

๊ถ๊ธˆํ•œ ํฌ์ธํŠธ ์žˆ์œผ๋ฉด ๋งํ•ด๋ด. ์ž๋™ํ™”๋Š” ๊ท€์ฐจ๋‹ˆ์ฆ˜์„ ์ •๋‹นํ™”ํ•˜๋Š” ์œ ์ผํ•œ ๊ธฐ์ˆ ์ด๋‹ˆ๊นŒ.

name: Deploy to Vercel

on:
  push:
    branches:
      - main

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

      - name: Install Vercel CLI
        run: npm install -g vercel

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

์—ฌ๊ธฐ ๋„ˆ๋ฅผ ์œ„ํ•œ Vercel ๋ฐฐํฌ ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ์•ผ. ์ด YAML ํŒŒ์ผ์„ GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฃจํŠธ์— .github/workflows/deploy.yml๋กœ ์ €์žฅํ•˜๋ฉด, main ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ Vercel์— ๋ฐฐํฌ๋ผ.

๋‹ค์Œ ํ•ด์•ผ ํ•  ๊ฑด:

  1. GitHub ๋ฆฌํฌ์— VERCEL_TOKEN์ด๋ผ๋Š” secret์„ ์„ค์ •ํ•ด.
  2. Vercel ํ”„๋กœ์ ํŠธ๋ž‘ GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•ด.

์ด์ œ ๋” ์ด์ƒ vercel --prod ์ง์ ‘ ์•ˆ ์ณ๋„ ๋ผ. ๊ธฐ๊ณ„๊ฐ€ ๋„ˆ ๋Œ€์‹  ์ผํ•  ๊ฑฐ์•ผ. ๋ถ€๋Ÿฝ์ง€?


๐ŸŽจ 2. ๋””์ž์ธ ์‹œ์Šคํ…œ (Design System)

์ผ๊ด€๋œ UI/UX๋ฅผ ์œ„ํ•ด ๋งŒ๋“  ์‹œ๊ฐ์ ยท๊ตฌ์กฐ์  ๊ฐ€์ด๋“œ ๋ชจ์Œ์ง‘

๊ตฌ์„ฑ ์š”์†Œ:

  • ์ปดํฌ๋„ŒํŠธ: ๋ฒ„ํŠผ, ์ž…๋ ฅ์ฐฝ, ๋ชจ๋‹ฌ ๋“ฑ UI ์กฐ๊ฐ
  • ํ† ํฐ: ์ƒ‰์ƒ, ํฐํŠธ, ๊ฐ„๊ฒฉ, ๊ทธ๋ฆผ์ž ๋“ฑ ์Šคํƒ€์ผ ๊ทœ์น™
  • ๋ฌธ์„œํ™”: ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™, ์ฝ”๋“œ ์˜ˆ์ œ, ์ ‘๊ทผ์„ฑ ๊ฐ€์ด๋“œ

์™œ ํ•„์š”ํ•จ?

  • ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋””์ž์ธ ๋“ค์‘ฅ๋‚ ์‘ฅ โ†’ ์œ ์ง€๋ณด์ˆ˜ ๋น„ํšจ์œจ
  • ํŒ€์ด ์ปค์งˆ์ˆ˜๋ก ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋น„์šฉ ์ฆ๊ฐ€
  • ๋””์ž์ด๋„ˆ-๊ฐœ๋ฐœ์ž ํ˜‘์—… ๊ฐ„์†Œํ™”

์˜ˆ: Google์˜ Material Design, IBM์˜ Carbon, Kakao Design System


๐Ÿงช 3. ํ”„๋กœํ† ํƒ€์ž… (Prototype)

์ตœ์ข… ์ œํ’ˆ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฏธ๋ฆฌ ์‹œ๊ฐํ™”ํ•œ ์‹œ์ œํ’ˆ

์ข…๋ฅ˜:

  • ๋กœ์šฐํŒŒ์ด (Low-fi): ์†๊ทธ๋ฆผ, ์™€์ด์–ดํ”„๋ ˆ์ž„
  • ํ•˜์ดํŒŒ์ด (High-fi): ์‹ค์ œ UI ๊ตฌ์„ฑ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ธํ„ฐ๋ž™์…˜ ๊ตฌํ˜„๋จ (Figma ๋“ฑ)

๋ชฉ์ :

  • ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘, ๋ฐฉํ–ฅ์„ฑ ํ…Œ์ŠคํŠธ, ์ดํ•ด๊ด€๊ณ„์ž ์„ค๋“

์˜ˆ: Figma๋กœ ๋งŒ๋“  ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ์•ฑ UI โ†’ ์œ ์ € ํ”Œ๋กœ์šฐ ํ…Œ์ŠคํŠธ


๐Ÿงช 4. PoC (Proof of Concept)

์•„์ด๋””์–ด๋‚˜ ๊ธฐ์ˆ ์ด โ€œ์‹ค์ œ๋กœ ๊ฐ€๋Šฅํ•˜๋‹คโ€๋Š” ๊ฑธ ์ž…์ฆํ•˜๋Š” ์ตœ์†Œ ๊ตฌํ˜„๋ฌผ

์˜ˆ์‹œ ์ƒํ™ฉ:

  • AI๋กœ ์ž๋™ ๋ฒˆ์—ญ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”? โ†’ ์งง์€ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฐ๋ชจ ๋งŒ๋“ค์–ด ํ…Œ์ŠคํŠธ
  • ์„œ๋ฒ„ ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋˜๋‚˜์š”? โ†’ ์†Œ๊ทœ๋ชจ ๊ธฐ๋Šฅ๋งŒ ๋งŒ๋“ค์–ด ํ™•์ธ

PoC vs ํ”„๋กœํ† ํƒ€์ž… ์ฐจ์ด:

  • PoC๋Š” โ€œ๊ธฐ์ˆ ์  ๊ฐ€๋Šฅ์„ฑโ€ ํ™•์ธ ์ค‘์‹ฌ
  • ํ”„๋กœํ† ํƒ€์ž…์€ โ€œ์‚ฌ์šฉ ๊ฒฝํ—˜โ€ ์ค‘์‹ฌ

โœจ ์š”์•ฝ ์ •๋ฆฌ