-
Notifications
You must be signed in to change notification settings - Fork 0
๐ฅ๏ธGitHub Actions๋ก CI CD ๊ตฌ์ถ ๋ฐฉ๋ฒ
Environment
- OS: Raspberry Pi OS (64 bit)
- ๊ฐ์
- CI/CD๋?
- GitHub Actions๋?
- Step 1 - GitHub Actions ์์ํ๊ธฐ
- Step 2 - Workflow ์์ฑํ๊ธฐ
- Step 3 - CI/CD ํ ์คํธํ๊ธฐ
- ์ฐธ๊ณ ์๋ฃ
์ด๋ฒ ๊ธ์์๋ GitHub Actions
๋ก CI/CD ๊ตฌ์ถ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
CI/CD๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ๊ณ ํจ์จํํ๋ ๋ฐฉ๋ฒ๋ก ์ผ๋ก, Continuous Integration(์ง์์ ํตํฉ)
๊ณผ Continuous Deployment(์ง์์ ๋ฐฐํฌ)
๋ฅผ ์๋ฏธํฉ๋๋ค.
CI๋ ์๋ก์ด ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ ๊ธฐ์ ์ผ๋ก ๋น๋ ๋ฐ ํ ์คํธ๋์ด ๊ณต์ Repository์ ํตํฉ๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. CI์ ์ฃผ์ ๋ชฉํ๋ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋น ๋ฅด๊ฒ ๋ณํฉํ๊ณ , ์๋ํ๋ ๋น๋ ๋ฐ ํ ์คํธ๋ฅผ ํตํด ์ฝ๋ ํ์ง์ ๋ณด์ฅํ๋ ๊ฒ์ ๋๋ค. CI๋ฅผ ํ์ฉํ๋ฉด ์ฝ๋ ํ์ง์ด ๋์์ง๊ณ , ๋ฒ๊ทธ๊ฐ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌ๋๋ฏ๋ก ์ฝ๋์ ์์ ์ฑ์ด ์ฆ๊ฐํ๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ์ถฉ๋์ด ์ ๊ณ , ๊ฐ๋ฐ์ ๊ฐ ํ์ ์ด ์ํํด์ง๋ค๋ ์ฅ์ ๋ ์์ต๋๋ค.
CD๋ ์ฝ๋๊ฐ ํตํฉ๋ ํ ํ๋ก๋์ ํ๊ฒฝ์ ๋ฐฐํฌํ๋ ๊ฒ์ ์๋ํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. CD๋ฅผ ํ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ํธ์ํ ๋๋ง๋ค ์๋์ผ๋ก ํ๋ก๋์ ์ ๋ฐฐํฌ๋์ด, ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๋ก ํ์ธํ ์ ์์ต๋๋ค. ๋ํ ๋ฐฐํฌ ๊ณผ์ ์ ์ค๋ฅ๊ฐ ์ค์ด๋ค๊ณ , ๋ฐฐํฌ ์๋๊ฐ ๋นจ๋ผ์ง๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
GitHub Actions
๋ GitHub์์ ์ ๊ณตํ๋ CI/CD(Continuous Integration/Continuous Deployment)
์๋น์ค๋ก, ํ๋ก์ ํธ ๋ด์ workflow๋ฅผ ์๋ํํ ์ ์๊ฒ ๋์์ค๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ ๋น๋, ํ
์คํธ, ๋ฐฐํฌ ๋ฑ์ ์์
์ GitHub Repository ๋ด์์ ์ง์ ์ค์ ํ๊ณ ์คํํ ์ ์์ต๋๋ค. GitHub Actions๋ GitHub์ YAML ๊ธฐ๋ฐ ์ค์ ํ์ผ์ ํตํด ๋ค์ํ ์ด๋ฒคํธ(Ex. Push, Pull Request ๋ฑ)์ ๋ฐ๋ผ ์คํ๋๋๋ก workflow๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
GitHub Actions ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
Workflow
์๋ํ๋ ์์ ์ ์งํฉ์ ๋๋ค.
.github/workflows/
๋๋ ํ ๋ฆฌ ์๋์ YAML ํ์ผ๋ก ์ค์ ํ๋ฉฐ, ์ฌ๋ฌ ๊ฐ์ ์์ (Ex. ๋น๋, ํ ์คํธ, ๋ฐฐํฌ ๋ฑ)์ ๋จ๊ณ๋ณ๋ก ์ ์ํ ์ ์์ต๋๋ค. -
Event
workflow
๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ์ด๋ฒคํธ๋ก, ์ฃผ๋ก ์ฝ๋ ํธ์(Push), PR ์์ฑ(Pull Request), release, issue ์์ฑ ๋ฑ์ GitHub ํ๋์ด ์์ต๋๋ค. ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ workflow๊ฐ ์๋์ผ๋ก ์คํ๋ฉ๋๋ค. -
Job
workflow
์์์ ๋ณ๋ ฌ๋ก ์คํํ ์ ์๋ ์์ ๋จ์์ ๋๋ค. ๊ฐ job์ ์ฌ๋ฌ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋์ด ์๊ณ , ์๋ก ๋ค๋ฅธ ํ๊ฒฝ์์ ๋ณ๋ ฌ ์คํ์ด ๊ฐ๋ฅํฉ๋๋ค. -
Step
job
๋ด๋ถ์์ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ ๊ฐ๋ณ ์์ ์ ๋๋ค. Shell ๋ช ๋ น์ด๋ฅผ ์คํํ๊ฑฐ๋, GitHub์์ ์ ๊ณตํ๋ ์ก์ (Action)์ ์ฌ์ฉํ์ฌ ์ค์ ํ ์ ์์ต๋๋ค. -
Action
GitHub Actions์์ ์ ๊ณตํ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์์ ๋จ์์ ๋๋ค. Node.js ์ค์น, AWS S3์ ํ์ผ ์ ๋ก๋ ๋ฑ์ ์ก์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
GitHub Actions์ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ yml ์ค์ ํ์ผ์ ์์ฑํด์ผ ํฉ๋๋ค. yml ์ค์ ํ์ผ์ GitHub Repository์์ ์ง์ ๋ง๋ค์ด๋ ๋๊ณ , ์๋๋ฉด VSCode์์ ๋ง๋ค์ด๋ ๋ฉ๋๋ค.
๋จผ์ ๋ค์๊ณผ ๊ฐ์ด GitHub Repository์ Actions ํญ์ ํด๋ฆญํฉ๋๋ค.
ํด๋น ํ์ด์ง๋ก ๋ค์ด๊ฐ๋ฉด ์์ ๊ฐ์ด GitHub์์ ์ฌ๋ฌ ๊ฐ์ง ํ
ํ๋ฆฟ์ ์ ๊ณตํด ์ค๋๋ค. ์ํ๋ ํ
ํ๋ฆฟ์ ๊ฒ์ํ์ฌ configure ๋ฒํผ์ ํด๋ฆญํ๊ฑฐ๋, ํ
ํ๋ฆฟ ์์ด ์งํํ๋ ค๋ฉด set up a workflow yourself
๋ฅผ ํด๋ฆญํฉ๋๋ค.
๋จผ์ ๋ค์๊ณผ ๊ฐ์ด VSCode์์ GitHub Actions
Extensions์ ์ค์นํฉ๋๋ค.
์ดํ ํ๋ก์ ํธ ์ต์๋จ ๋๋ ํ ๋ฆฌ์์ .github
ํด๋๋ฅผ ์์ฑํ๊ณ ๊ทธ ์์ workflows
๋ผ๋ ํด๋๋ฅผ ์์ฑํ ํ yml ์ค์ ํ์ผ์ ์์ฑํฉ๋๋ค. ํ์ผ๋ช
์ ์ํ๋ ๋๋ก ์ง์ผ๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐฐํฌ ๊ด๋ จ workflow ์ค์ ํ์ผ์ ์์ฑํ๋ค๋ฉด .github/workflows/deploy.yml
๊ตฌ์กฐ๊ฐ ๋ ์ ์์ต๋๋ค.
๋ค์ ์์๋ Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ Raspberry Pi์ ๋ฐฐํฌํ๊ณ ์ CI/CD๋ฅผ ๊ตฌ์ถํ ์์์ ๋๋ค.
์์ workflow ์ค์ ์ ๋ํด ์ค๋ช ํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
# workflow ์ด๋ฆ ์ค์
name: GitHub Actions๋ก Next.js ์ฑ CI/CD ๊ตฌ์ถ ์์
๋จผ์ ์์ ๊ฐ์ด workflow ์ด๋ฆ์ ์ค์ ํด์ผ ํฉ๋๋ค. workflow ์ด๋ฆ์ name
ํ๋์์ ์ค์ ํฉ๋๋ค. ์ด ์ด๋ฆ์ GitHub์ Actions ํญ์ ํ์๋ฉ๋๋ค.
# workflow๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ์ด๋ฒคํธ ์ค์
on:
push:
# main ๋ธ๋์น์ ํธ์ํ ๋ ์คํ
branches: ["main"]
on
ํ๋์์๋ workflow๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ์ด๋ฒคํธ๋ฅผ ์ ์ํฉ๋๋ค. ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ์ด๋ฒคํธ๋ก๋ push, pull_request ๋ฑ์ด ์์ต๋๋ค. ์์ ์์๋ main ๋ธ๋์น์ ์ฝ๋ ํธ์๊ฐ ์ด๋ฃจ์ด์ง ๋ workflow๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
jobs
ํ๋๋ workflow ๋ด์์ ์คํ๋ ๊ฐ๋ณ ์์
์ ์ ์ํฉ๋๋ค. ๊ฐ job์ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ํฌํจํ ์ ์์ผ๋ฉฐ ๋ณ๋ ฌ๋ก ์คํ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋จผ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ job์ ์ด๋ฆ์ ์ค์ ํด์ผ ํฉ๋๋ค. ์ด๋ฆ์ ์์ ๋กญ๊ฒ ์ง์ ์ ์์ต๋๋ค. ์ ์ ๊ฒฝ์ฐ์๋ ๋น๋ ํ ๋ฐฐํฌ๋ฅผ ํ๋ job์ ์ ์ํ์๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ build-and-deploy
๋ผ๊ณ ์ง์์ต๋๋ค.
# ์คํํ jobs ์ค์
jobs:
# job ์ด๋ฆ ์ค์
build-and-deploy:
๋ค์์ผ๋ก ํด๋น job์ด ์คํ๋ ํ๊ฒฝ์ ์ง์ ํฉ๋๋ค. GitHub์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ runs-on
๋ ubuntu-latest
, macos-latest
, windows-latest
๋ฑ์ด ์์ต๋๋ค.
# Ubuntu ํ๊ฒฝ์์ ์คํ
runs-on: ubuntu-latest
steps
ํ๋์๋ job ๋ด๋ถ์์ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ ๊ฐ๋ณ ์์
์ ์ ์ํฉ๋๋ค. Shell ๋ช
๋ น์ด๋ฅผ ์คํํ๊ฑฐ๋, GitHub์์ ์ ๊ณตํ๋ ์ก์
(Action)์ ์ฌ์ฉํ์ฌ ์ค์ ํ ์ ์์ต๋๋ค.
์ ๋ Next.js๋ก ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ Raspberry Pi์ ๋ฐฐํฌํ๋ ์์ ์ ์ ์ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ฐฐํฌ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ์์ต๋๋ค.
- GitHub Repository์ push๋ ์ฝ๋ ๊ฐ์ ธ์ค๊ธฐ
- Node.js ์ค์นํ๊ธฐ
- Next.js ์ ํ๋ฆฌ์ผ์ด์ ๋น๋ํ๊ธฐ
- scp๋ฅผ ์ฌ์ฉํด ๋น๋ ํ์ผ์ Raspberry Pi๋ก ์ ์กํ๊ธฐ
- ssh๋ฅผ ์ฌ์ฉํด Raspberry Pi์ ์๊ฒฉ ์ ์ํ ํ pm2๋ฅผ ์ฌ์ฉํด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ๊ธฐ
1. GitHub Repository์ push๋ ์ฝ๋ ๊ฐ์ ธ์ค๊ธฐ
๋จผ์ GitHub Repository์ ์๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. GitHub์์ ์ ๊ณตํ๋ ์ก์ ์ผ๋ก actions/checkout์ด ์์ผ๋ฉฐ, ํด๋น ์ก์ ์ ์ฌ์ฉํด์ Repository์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
steps:
- name: Checkout code
uses: actions/checkout@v4
name
ํ๋๋ ๊ฐ ๋จ๊ณ์ ์ด๋ฆ์ ์ง์ ํ๋ ๋ถ๋ถ์ผ๋ก, job ์คํ ์ ๋ก๊ทธ์ ํ์๋ฉ๋๋ค. ์ด๋ฆ์ ํด๋น ๋จ๊ณ๊ฐ ํ๊ณ ์ ํ๋ ์์
์ ์ดํดํ ์ ์๊ฒ ์์ฑํ๋ฉด ๋ฉ๋๋ค. uses
ํ๋๋ GitHub์์ ์ ๊ณตํ๋ ์ก์
๋๋ ์๋ํํฐ ์ก์
์ ์ฌ์ฉํ ๋ ์ง์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, actions/checkout@v4๋ Code Repository๋ฅผ ์ฒดํฌ์์(=์ฝ๋ ๊ฐ์ ธ์ค๊ธฐ)ํ๋ ์ก์
์
๋๋ค.
2. Node.js ์ค์นํ๊ธฐ
์ฝ๋๋ฅผ ๊ฐ์ ธ์จ ํ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋น๋ํ ์ ์๋๋ก Node.js๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค. GitHub์์๋ ๋ค์๊ณผ ๊ฐ์ด Node.js๋ฅผ ์ค์นํ ์ ์๋ ์ก์
์ ์ ๊ณตํฉ๋๋ค. ์ด ๋, ํน์ ์ก์
์ ์ถ๊ฐ ์ธ์๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉํ๋ with
ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค์นํ๊ณ ์ ํ๋ Node.js ๋ฒ์ ์ ์ง์ ํด์ผ ํฉ๋๋ค.
- name: Set up Node.js
uses: actions/setup-node@v4
with:
# Node.js ๋ฒ์ ์ค์
node-version: 20
3. Next.js ์ ํ๋ฆฌ์ผ์ด์ ๋น๋ํ๊ธฐ
๋ค์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ๋น๋ํ๊ธฐ ์ํด npm install
๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ ์์กด์ฑ ์ค์น๋ฅผ ์งํํ ํ ์ ํ๋ฆฌ์ผ์ด์
์ ๋น๋ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉํ run
์ ์
ธ ๋ช
๋ น์ด๋ฅผ ์คํํ ๋ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ช
๋ น์ด๋ ์ ์๋ ํ๊ฒฝ์์ ์คํ๋ฉ๋๋ค.
- name: Install dependencies
run: npm install
- name: Build Next.js Project
run: npm run build
4. scp๋ฅผ ์ฌ์ฉํด ๋น๋ ํ์ผ์ Raspberry Pi๋ก ์ ์กํ๊ธฐ
์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ํ์๋ scp๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ ํ์ผ์ Raspberry Pi๋ก ์ ์กํด์ผ ํฉ๋๋ค. ์ ๋ appleboy/scp-action@v0.1.7๋ผ๋ ์๋ํํฐ ์ก์ ์ ์ฌ์ฉํ์์ต๋๋ค.
Next.js์์๋ ๋น๋ ์ .next
ํด๋๊ฐ ์์ฑ๋๋ฏ๋ก ํด๋น ํด๋๋ฅผ source๋ก ์ง์ ํ๋ฉด ๋ฉ๋๋ค. ๋ํ ์์์ Raspberry Pi์ IP ์ฃผ์๋ ๋น๋ฐ๋ฒํธ, ํฌํธ ๋ฒํธ ๋ฑ์ ์ค์ํ ์ ๋ณด์ด๋ฏ๋ก yml ํ์ผ์ ์ง์ ์์ฑํ์ง ์์ต๋๋ค. ๋์ GitHub Secrets
๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
GitHub Secrets
๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ผ๋ก, yml ํ์ผ ๋ด์์ secrets.<SECRET_NAME>
ํํ๋ก ์ฐธ์กฐํ ์ ์์ต๋๋ค.
GitHub Secrets๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ๋ค์๊ณผ ๊ฐ์ด GitHub Repository ๋ด์์ settings > Secrets and variable > Actions
๋ก ์ด๋ํฉ๋๋ค.
์ดํ New repository secret
์ ํด๋ฆญํ์ฌ secrets
๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
5. ssh๋ฅผ ์ฌ์ฉํด Raspberry Pi์ ์๊ฒฉ ์ ์ํ ํ pm2๋ฅผ ์ฌ์ฉํด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ๊ธฐ
๋น๋ ํ์ผ์ ์ ์กํ ํ์๋ ssh๋ฅผ ์ฌ์ฉํ์ฌ Raspberry Pi์ ์๊ฒฉ ์ ์ํ ํ ์ด์ ์ ์คํ๋๊ณ ์๋ ํ๋ก๋์
์๋ฒ๋ฅผ ์ข
๋ฃํ ํ pm2
๋ฅผ ์ฌ์ฉํด ์๋กญ๊ฒ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ ์ ์๋๋ก ํฉ๋๋ค. ์ ๋ appleboy/ssh-action@v1.1.0๋ผ๋ ์๋ํํฐ ์ก์
์ ์ฌ์ฉํ์์ต๋๋ค.
์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ค๋ช ํ์๋ฉด ๋จผ์ ๋น๋ ํ์ผ์ด ์๋ ํด๋๋ก ์ด๋ํ ํ ์์กด์ฑ ์ ๋ฐ์ดํธ๋ฅผ ์งํํฉ๋๋ค. ์ดํ ์ด์ ์ ์คํ๋๊ณ ์๋ ํ๋ก๋์ ์๋ฒ๋ฅผ ์ข ๋ฃํ ํ ์๋ก์ด ํ๋ก๋์ ์๋ฒ๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํฉ๋๋ค.
CI/CD ํ ์คํธ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
web12-MafiaCamp
๐ฏํ๋ก์ ํธ ๊ท์น
๐ปํ๋ก์ ํธ ๊ธฐํ
๐๊ธฐ์ ์คํ
- ๐ป Next.js 15๋ฅผ ์ ํํ ์ด์
- ๐ NestJS๋ฅผ ์ ํํ ์ด์
- ๐ฅ๏ธ OpenVidu๋ฅผ ์ ํํ ์ด์
- ๐ TypeORM์ ์ ํํ ์ด์
- ๐ฌ ์ฑํ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํด WebSocket์ ์ ํํ ์ด์
- ๐ WebRTC ๊ฐ๋ ์ ๋ฆฌ
- ๐พ WebRTC โ Nest.js์ React๋ก ํ๋ ๊ฐ๋จ ํ์์ฑํ ์์
- ๐ฅ๏ธ GitHub Actions๋ก CI/CD ๊ตฌ์ถ ๋ฐฉ๋ฒ
- ๐ฆ Docker์ ๊ฐ๋ ๊ณผ ์ฌ์ฉ ๋ฐฉ๋ฒ
- ๐ OAuth ๊ธฐ๋ณธ ์ธ์ฆ ๊ณผ์ ๊ณผ ์์
๐๊ทธ๋ฃน ํ๊ณ
๐๊ฐ๋ฐ ์ผ์ง
๐๋ฌธ์ ํด๊ฒฐ ๊ฒฝํ
- ์น์์ผ ๋ฐฉ ๊ด๋ฆฌ ๊ตฌ์กฐ ๊ฐ์
- Pub-Sub ํจํด์ ํตํ ์ค์๊ฐ ๋ฐฉ ๋ชฉ๋ก ์กฐํ ๊ธฐ๋ฅ ๊ฐ๋ฐ
- ์ ํ ์ํ ๊ธฐ๊ณ๋ฅผ ์ด์ฉํ ๊ฒ์ ์งํ ๋ชจ๋ธ๋ง
- ๐ ๋์์ฑ ์ด์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ LockManager ๋ง๋ค๊ธฐ
- โฐ RxJS๋ก ์ค์๊ฐ ํ์ด๋จธ ๊ตฌ์ถํ๊ธฐ
- ๐ณNext.js์ Docker๋ฅผ ์ฌ์ฉํ ๋น๋ ์ต์ ํํ๊ธฐ
- ๐ข Redis๋ฅผ ํตํ ์ ์ ์จ๋ผ์ธ ์ํ ๊ด๋ฆฌ ์์คํ ๊ตฌํํ๊ธฐ
- openvidu ์๋ฌ ๋๋ฒ๊น ์ ์ํ Docker ๊ฐ๋ฐํ๊ฒฝ ์ค์
๐งํธ๋ฌ๋ธ ์ํ
- NestJS, mkcert CA ์ธ์ฆ์ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
- openvidu ICE ํ๋ณด ๊ด๋ จ ์ค๋ฅ
- Enterํค ์ด๋ฒคํธ ์ค๋ณต ํธ์ถ ๋ฌธ์
- mutex lock ๋ฌธ์
- ํฌํ ๋์์ ์ง์ ์ค๋ฅ
- openvidu ์ธ์ ์ข ๋ฃ ๋ฉ์๋ ์ค๋ฅ
- ์บ์๋ก ์ธํ ๋ฏธ๋ค์จ์ด ๋ฏธํธ์ถ ๋ฐ ํ์ด์ง ์ ํ ์ค๋ฅ
- ๋คํฌ ๋ชจ๋์์ ํ ์คํธ๊ฐ ๋ณด์ด์ง ์๋ ๋ฌธ์
- ๊ฒ์ ๋ฐฉ์์ ์๋ก๊ณ ์นจ ๋๋ ๋ธ๋ผ์ฐ์ ํญ์ ๋ซ์ ๋์ ์์ธ ์ฒ๋ฆฌ