๐ Render ์ฑ ๋ฐฐํฌ ์์ ๊ฐ์ด๋

๐ Render ์ฑ ๋ฐฐํฌ ์์ ๊ฐ์ด๋
๐ OpenAI API ํค ํ๋ ๋ฐฉ๋ฒ
1๋จ๊ณ: OpenAI ๊ณ์ ์์ฑ
OpenAI ์น์ฌ์ดํธ ์ ์
"Sign up" ํด๋ฆญํ์ฌ ๊ณ์ ์์ฑ
์ด๋ฉ์ผ ์ธ์ฆ ์๋ฃ
2๋จ๊ณ: API ํค ์์ฑ
OpenAI API ํค ํ์ด์ง ์ ์
"Create new secret key" ํด๋ฆญ
ํค ์ด๋ฆ ์ ๋ ฅ (์: "My Render App")
์์ฑ๋ ํค ๋ณต์ฌ (sk-proj-... ๋๋ sk-...๋ก ์์)
โ ๏ธ ์ค์: ํค๋ ํ ๋ฒ๋ง ํ์๋๋ฏ๋ก ์์ ํ ๊ณณ์ ์ ์ฅ
3๋จ๊ณ: ์ฌ์ฉ๋ ๋ฐ ๊ฒฐ์ ์ค์
Billing ํ์ด์ง ์ ์
๊ฒฐ์ ๋ฐฉ๋ฒ ์ถ๊ฐ (์ ์ฉ์นด๋ ๋ฑ)
์ฌ์ฉ๋ ํ๋ ์ค์ (๊ถ์ฅ: ์ $5-10)
4๋จ๊ณ: API ํค ํ ์คํธ
# ํฐ๋ฏธ๋์์ API ํค ํ
์คํธ
curl -X POST "https://api.openai.com/v1/chat/completions"
-H "Authorization: Bearer YOUR_API_KEY_HERE"
-H "Content-Type: application/json"
-d '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "Hello!"}],
"max_tokens": 10
}'
๐ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก
OpenAI API ํค ๋ณด์
์ ๋ ํ๋์ฝ๋ฉ ๊ธ์ง
render.yaml
ํ์ผ์ ์ง์ ์ ๋ ฅ ๊ธ์ง์ฝ๋ ํ์ผ์ ํ๋์ฝ๋ฉ ๊ธ์ง
๋ก๊ทธ ํ์ผ์ ์ถ๋ ฅ ๊ธ์ง
์์ ํ ์ค์ ๋ฐฉ๋ฒ
# โ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ - key: OPENAI_API_KEY sync: false # โ ์๋ชป๋ ๋ฐฉ๋ฒ - key: OPENAI_API_KEY value: "sk-proj-actual-key-here"
API ํค ํ์ (์ ๊ธฐ์ ๊ฐฑ์ )
3-6๊ฐ์๋ง๋ค ์ ํค ์์ฑ
์ด์ ํค ์ญ์
๋ชจ๋ ํ๊ฒฝ์์ ์ ๋ฐ์ดํธ
์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง
OpenAI ๋์๋ณด๋์์ ์ฌ์ฉ๋ ํ์ธ
์ด์ ์ฌ์ฉ ํจํด ๊ฐ์ง ์ ์ฆ์ ํค ๊ต์ฒด
ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ
๊ฐ๋ฐ/์ด์ ํ๊ฒฝ ๋ถ๋ฆฌ
# ๊ฐ๋ฐ์ฉ - key: OPENAI_API_KEY sync: false # ๊ฐ๋ฐ์ฉ ํค ์ฌ์ฉ # ์ด์์ฉ - key: OPENAI_API_KEY sync: false # ์ด์์ฉ ํค ์ฌ์ฉ (๋ณ๋ ํค ๊ถ์ฅ)
์ ๊ทผ ๊ถํ ๊ด๋ฆฌ
ํ์ํ ํ์๋ง API ํค ์ ๊ทผ ํ์ฉ
Render ํ๋ก์ ํธ ๊ถํ ๊ด๋ฆฌ
๐ ๋ชฉ์ฐจ
๐ ์ฌ์ ์ค๋น์ฌํญ
ํ์ ์ค๋น๋ฌผ
GitHub ๊ณ์ (์ฝ๋ ์ ์ฅ์)
๋ฐฐํฌํ ์ฑ์ ์์ค์ฝ๋
render.yaml
ํ์ผ (Blueprint ์ค์ ํ์ผ)ํ์ํ API ํค๋ค (์: OpenAI API ํค)
OpenAI ๊ณ์ ๋ฐ ์ ํจํ API ํค (sk-proj-... ๋๋ sk-...๋ก ์์)
ํ๋ก์ ํธ ๊ตฌ์กฐ ํ์ธ
your-project/
โโโ render.yaml # Render ๋ฐฐํฌ ์ค์ ํ์ผ
โโโ frontend/ # ํ๋ก ํธ์๋ ์ฝ๋
โโโ backend/ # ๋ฐฑ์๋ ์ฝ๋
โโโ README.md
render.yaml ํ์ผ ์์
# render.yaml ์์
services:
# ๋ฐฑ์๋ ์๋น์ค
- type: web
name: my-app-backend
runtime: python # ๋๋ node, go ๋ฑ
plan: free
buildCommand: pip install -r requirements.txt
startCommand: python app.py
envVars:
# OpenAI API ํค - ๋ณด์์ ์ํด sync: false ์ฌ์ฉ
- key: OPENAI_API_KEY
sync: false
# CORS ์ค์ (๋ฐฐํฌ ํ ์
๋ฐ์ดํธ ํ์)
- key: CORS_ORIGINS
value: "http://localhost:3000"
# ๊ธฐํ ํ๊ฒฝ ๋ณ์๋ค
- key: PORT
value: "8000"
# ํ๊ฒฝ ๊ทธ๋ฃน ์ฌ์ฉ (์ ํ์ฌํญ)
- fromGroup: shared-secrets
# ํ๋ก ํธ์๋ ์๋น์ค
- type: web
name: my-app-frontend
runtime: static
plan: free
buildCommand: npm install && npm run build
staticPublishPath: ./build # ๋๋ ./dist
# ํ๊ฒฝ ๊ทธ๋ฃน ์ ์ (์ ํ์ฌํญ)
envVarGroups:
- name: shared-secrets
envVars:
- key: JWT_SECRET
generateValue: true
- key: DATABASE_URL
fromDatabase:
name: mydb
property: connectionString
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ (ํ์์)
databases:
- name: mydb
plan: starter
region: oregon
๐ง ๊ณ ๊ธ ํ๊ฒฝ ๋ณ์ ์ค์
Environment Groups ์ฌ์ฉ
์ฌ๋ฌ ์๋น์ค์์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ํ๊ฒฝ ๋ณ์๊ฐ ์๋ค๋ฉด Environment Groups๋ฅผ ํ์ฉํ์ธ์:
# 1. ํ๊ฒฝ ๊ทธ๋ฃน ์ ์
envVarGroups:
- name: api-keys
envVars:
- key: OPENAI_API_KEY
sync: false
- key: JWT_SECRET
generateValue: true
# 2. ์๋น์ค์์ ๊ทธ๋ฃน ์ฌ์ฉ
services:
- type: web
name: backend
envVars:
- fromGroup: api-keys # ๊ทธ๋ฃน์ ๋ชจ๋ ๋ณ์ ํฌํจ
- key: PORT
value: "8000"
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ฐธ์กฐ
envVars:
- key: DATABASE_URL
fromDatabase:
name: mydb
property: connectionString
๐ Render ๊ณ์ ์์ฑ
1๋จ๊ณ: Render ์น์ฌ์ดํธ ์ ์
์น๋ธ๋ผ์ฐ์ ์์ render.com ์ ์
์ฐ์ธก ์๋จ์ "Sign Up" ๋ฒํผ ํด๋ฆญ
2๋จ๊ณ: ํ์๊ฐ์
GitHub ๊ณ์ ์ผ๋ก ๊ฐ์ (๊ถ์ฅ)
"Continue with GitHub" ์ ํ
GitHub ๋ก๊ทธ์ธ ํ ๊ถํ ์น์ธ
๋๋ ์ด๋ฉ์ผ๋ก ๊ฐ์
์ด๋ฉ์ผ ์ฃผ์ ์ ๋ ฅ
๋น๋ฐ๋ฒํธ ์ค์
์ด๋ฉ์ผ ์ธ์ฆ ์๋ฃ
3๋จ๊ณ: ๊ณ์ ์ค์
ํ๋กํ ์ ๋ณด ์ ๋ ฅ
๋ฌด๋ฃ ํ๋ ์ ํ (๊ฐ์ธ ํ๋ก์ ํธ์ฉ)
๋์๋ณด๋ ์ ์ ํ์ธ
๐ฏ Blueprint ์ธ์คํด์ค ์์ฑ
Render์์ ์ฑ์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค:
๐ ๋ฐฉ๋ฒ 1: Blueprint ์ฌ์ฉ (๊ถ์ฅ)
render.yaml ํ์ผ์ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ
โ๏ธ ๋ฐฉ๋ฒ 2: ์๋ ์ค์
๊ฐ ์๋น์ค๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ
๐ ๋ฐฉ๋ฒ 1: Blueprint ์ฌ์ฉ (์๋ ์ค์ )
1๋จ๊ณ: ์ ์๋น์ค ์์ฑ
Render ๋์๋ณด๋์์ "New +" ๋ฒํผ ํด๋ฆญ
๋๋กญ๋ค์ด ๋ฉ๋ด์์ "Blueprint" ์ ํ
2๋จ๊ณ: GitHub ์ฐ๊ฒฐ
"Connect GitHub" ํด๋ฆญ
GitHub ๊ณ์ ๋ก๊ทธ์ธ (์์ง ์ฐ๊ฒฐ๋์ง ์์ ๊ฒฝ์ฐ)
Render์ ์ ์ฅ์ ์ ๊ทผ ๊ถํ ๋ถ์ฌ
3๋จ๊ณ: ์ ์ฅ์ ์ ํ
๋ฐฐํฌํ ํ๋ก์ ํธ ์ ์ฅ์ ์ ํ
์:
your-username/pascal-docx
"Connect" ๋ฒํผ ํด๋ฆญ
4๋จ๊ณ: Blueprint ๊ฐ์ง ํ์ธ
Render๊ฐ ์๋์ผ๋ก
render.yaml
ํ์ผ ๊ฐ์ง์ค์ ์ ๋ณด ํ์ธ:
์๋น์ค ์ ํ (Web Service, Static Site ๋ฑ)
๋น๋ ๋ช ๋ น์ด
์์ ๋ช ๋ น์ด
ํ๊ฒฝ ๋ณ์ ๋ชฉ๋ก
๐ง ๋ฐฉ๋ฒ 2: ์๋ ์ค์ (๊ฐ๋ณ ์๋น์ค)
render.yaml ํ์ผ์ด ์๊ฑฐ๋ ๋ ์ธ๋ฐํ ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
1๋จ๊ณ: ๋ฐฑ์๋ ์๋น์ค ์์ฑ
๊ธฐ๋ณธ ์ค์
Render ๋์๋ณด๋์์ "New +" โ "Web Service" ์ ํ
GitHub ์ ์ฅ์ ์ฐ๊ฒฐ
๋ค์ ์ค์ ๊ฐ ์ ๋ ฅ:
์๋น์ค ๊ธฐ๋ณธ ์ ๋ณด:
Name:
pascal-docx-backend
(๋๋your-app-backend
)Region:
Oregon (US West)
Branch:
master
(๋๋main
)Root Directory:
backend
โ ๏ธ ์ค์: ๋ชจ๋ ธ๋ ํฌ์ ๋ฐฑ์๋ ํด๋ ์ง์
๋น๋ ๋ฐ ์คํ ์ค์ :
Build Command:
pip install -r requirements.txt
Start Command:
uvicorn api_server:app --host 0.0.0.0 --port $PORT
Instance Type:
Free
ํ๊ฒฝ ๋ณ์ ์ค์
"Add Environment Variable" ๋ฒํผ์ ํด๋ฆญํ์ฌ ๋ค์ ๋ณ์๋ค ์ถ๊ฐ:
Key: OPENAI_API_KEY
Value: sk-proj-your-actual-key-here
Key: PYTHON_VERSION
Value: 3.11.9
Key: OPENAI_API_BASE
Value: https://api.openai.com/v1
Key: DEBUG
Value: false
Key: CORS_ORIGINS
Value: http://localhost:3000 (์์๊ฐ, ๋์ค์ ์
๋ฐ์ดํธ)
"Create Web Service" ํด๋ฆญ
2๋จ๊ณ: ํ๋ก ํธ์๋ ์๋น์ค ์์ฑ
๊ธฐ๋ณธ ์ค์
๋์๋ณด๋์์ "New +" โ "Web Service" ์ ํ
๊ฐ์ GitHub ์ ์ฅ์ ์ ํ
๋ค์ ์ค์ ๊ฐ ์ ๋ ฅ:
์๋น์ค ๊ธฐ๋ณธ ์ ๋ณด:
Name:
pascal-docx-frontend
(๋๋your-app-frontend
)Region:
Oregon (US West)
Branch:
master
(๋๋main
)Root Directory:
frontend
โ ๏ธ ์ค์: ๋ชจ๋ ธ๋ ํฌ์ ํ๋ก ํธ์๋ ํด๋ ์ง์
๋น๋ ๋ฐ ์คํ ์ค์ :
Build Command:
npm install && npm run build
Start Command:
npx serve -s dist
Instance Type:
Free
ํ๊ฒฝ ๋ณ์ ์ค์
"Add Environment Variable" ๋ฒํผ์ ํด๋ฆญํ์ฌ ๋ค์ ๋ณ์ ์ถ๊ฐ:
Key: VITE_API_URL
Value: [๋งํฌ ์์ด์ฝ ํด๋ฆญ โ pascal-docx-backend ์๋น์ค ์ ํ]
๐ก ํ: ๋งํฌ ์์ด์ฝ์ ์ฌ์ฉํ๋ฉด ๋ฐฑ์๋ ์๋น์ค์ ๋ด๋ถ URL์ด ์๋์ผ๋ก ์ค์ ๋ฉ๋๋ค.
"Create Web Service" ํด๋ฆญ
3๋จ๊ณ: ์๋น์ค ์ฐ๊ฒฐ ์ค์
๋ฐฑ์๋ CORS ์ ๋ฐ์ดํธ
ํ๋ก ํธ์๋ ๋ฐฐํฌ ์๋ฃ ํ URL ํ์ธ (์:
https://pascal-docx-frontend.onrender.com
)๋ฐฑ์๋ ์๋น์ค โ Environment ํญ
CORS_ORIGINS
๋ณ์ ๊ฐ์ ํ๋ก ํธ์๋ URL๋ก ์ ๋ฐ์ดํธ:๋ณ๊ฒฝ ์ : http://localhost:3000๋ณ๊ฒฝ ํ: https://pascal-docx-frontend.onrender.com
"Save Changes" ํด๋ฆญ
4๋จ๊ณ: ๋ฐฐํฌ ํ์ธ
๋ ์๋น์ค ๋ชจ๋ ๋ฐฐํฌ ์๋ฃ ํ์ธ
ํ๋ก ํธ์๋ URL ์ ์ ํ ์คํธ
๋ฐฑ์๋ API ์ฐ๊ฒฐ ํ ์คํธ
๐ ๋ ๋ฐฉ๋ฒ ๋น๊ต
๊ตฌ๋ถ | Blueprint ๋ฐฉ์ | ์๋ ์ค์ ๋ฐฉ์ |
---|---|---|
์ค์ ํ์ผ | render.yaml ํ์ | ๋ถํ์ |
์ค์ ์๋ | ๋น ๋ฆ (์ผ๊ด ์ค์ ) | ๋๋ฆผ (๊ฐ๋ณ ์ค์ ) |
์ ์ง๋ณด์ | ์ฝ๋์ ํจ๊ป ๋ฒ์ ๊ด๋ฆฌ | ๋์๋ณด๋์์๋ง ๊ด๋ฆฌ |
์ฌ๋ฐฐํฌ | ํ์ผ ์์ ๋ง์ผ๋ก ๊ฐ๋ฅ | ๋์๋ณด๋์์ ์๋ ๋ณ๊ฒฝ |
๋ณต์ก๋ | ์ด๊ธฐ ์ค์ ๋ณต์ก | ๋จ์ํ๊ณ ์ง๊ด์ |
์ถ์ฒ ์ํฉ | ํ๋ก๋์ ํ๊ฒฝ | ํ ์คํธ ๋๋ ๊ฐ๋จํ ์ฑ |
๐ ์๋ ์ค์ ์ฒดํฌ๋ฆฌ์คํธ
๋ฐฑ์๋ ์๋น์ค
์๋น์ค ์ด๋ฆ ์ค์
์ฌ๋ฐ๋ฅธ Root Directory ์ง์
๋น๋ ๋ช ๋ น์ด ์ค์
์์ ๋ช ๋ น์ด ์ค์
๋ชจ๋ ํ๊ฒฝ ๋ณ์ ์ถ๊ฐ
๋ฐฐํฌ ์๋ฃ ํ์ธ
ํ๋ก ํธ์๋ ์๋น์ค
์๋น์ค ์ด๋ฆ ์ค์
์ฌ๋ฐ๋ฅธ Root Directory ์ง์
๋น๋ ๋ช ๋ น์ด ์ค์
์์ ๋ช ๋ น์ด ์ค์
๋ฐฑ์๋ URL ์ฐ๊ฒฐ
๋ฐฐํฌ ์๋ฃ ํ์ธ
์ฐ๊ฒฐ ์ค์
๋ฐฑ์๋ CORS ์ค์ ์ ๋ฐ์ดํธ
ํ๋ก ํธ์๋-๋ฐฑ์๋ ํต์ ํ ์คํธ
์ ์ฒด ๊ธฐ๋ฅ ํ ์คํธ
โ๏ธ ํ๊ฒฝ ๋ณ์ ์ค์
ํ๊ฒฝ ๋ณ์ ์ค์ ๋ฐฉ๋ฒ์ ๋ฐฐํฌ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๐ Blueprint ๋ฐฉ์ ํ๊ฒฝ ๋ณ์ ์ค์
1๋จ๊ณ: ํ๊ฒฝ ๋ณ์ ์๋ณ
render.yaml
ํ์ผ์์ ํ์ํ ํ๊ฒฝ ๋ณ์ ํ์ธ:
envVars:
# OpenAI API ํค - ๋ณด์์ ์ํด sync: false ์ฌ์ฉ (๊ถ์ฅ)
- key: OPENAI_API_KEY
sync: false # ๋์๋ณด๋์์ ์์ ํ๊ฒ ์
๋ ฅ
# ๋๋ ์๋ ์์ฑ ๋ฐฉ์ (๋ ๊ถ์ฅ)
# - key: OPENAI_API_KEY
# generateValue: true
- key: CORS_ORIGINS
value: "http://localhost:3000" # ๋์ค์ ์์ ํ์
2๋จ๊ณ: OpenAI API ํค ์์ ํ๊ฒ ์ค์ ํ๊ธฐ
๐ ๋ฐฉ๋ฒ 1: sync: false ์ฌ์ฉ (๊ฐ์ฅ ์์ ํ ๋ฐฉ๋ฒ)
envVars:
- key: OPENAI_API_KEY
sync: false
์ฅ์ :
์ฝ๋์ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ๋ ธ์ถ๋์ง ์์
GitHub ์ ์ฅ์์ API ํค๊ฐ ์ ์ฅ๋์ง ์์
๋ฐฐํฌ ์ Render ๋์๋ณด๋์์ ์์ ํ๊ฒ ์ ๋ ฅ
์ฌ์ฉ ๋ฐฉ๋ฒ:
render.yaml
์sync: false
๋ก ์ค์ ๋ฐฐํฌ ์ Render ๋์๋ณด๋์์ ํ๋กฌํํธ ์ฐฝ์ API ํค ์ ๋ ฅ
์ ๋ ฅ๋ ๊ฐ์ ์ํธํ๋์ด ์ ์ฅ๋จ
๐ ๋ฐฉ๋ฒ 2: generateValue: true ์ฌ์ฉ (์๋ ์์ฑ)
envVars:
- key: OPENAI_API_KEY
generateValue: true
์ฃผ์์ฌํญ:
์ด ๋ฐฉ๋ฒ์ ์์์ ๊ฐ์ ์๋ ์์ฑํ๋ฏ๋ก ์ค์ OpenAI API ํค๊ฐ ์๋
์ค์ ํ๋ก์ ํธ์์๋ ๋ฐฉ๋ฒ 1์ ์ฌ์ฉํ์ธ์
โ ๋ฐฉ๋ฒ 3: ํ๋์ฝ๋ฉ (์ ๋ ๊ธ์ง)
envVars:
- key: OPENAI_API_KEY
value: "sk-your-actual-api-key" # ์ ๋ ์ด๋ ๊ฒ ํ์ง ๋ง์ธ์!
์ํ์ฑ:
GitHub์ API ํค๊ฐ ๋ ธ์ถ๋จ
๋ณด์ ์ทจ์ฝ์ ๋ฐ์
API ํค ๋จ์ฉ ์ํ
3๋จ๊ณ: ํ๊ฒฝ ๋ณ์ ์ ๋ ฅ ๊ณผ์
sync: false๋ก ์ค์ ํ ๊ฒฝ์ฐ:
Blueprint ์์ฑ ์ ๋ค์๊ณผ ๊ฐ์ ํ๋กฌํํธ ์ฐฝ์ด ๋ํ๋จ:
Environment Variables โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ OPENAI_API_KEY โ โ [ ] โ โ Enter your OpenAI API key โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
์ฌ๊ธฐ์ ์ค์ OpenAI API ํค ์ ๋ ฅ (์: sk-proj-...)
์ ๋ ฅํ API ํค ์ค๋น:
OpenAI ๊ณ์ ๋ก๊ทธ์ธ โ API Keys ํ์ด์ง
"Create new secret key" ํด๋ฆญ
์์ฑ๋ ํค ๋ณต์ฌ (sk-proj-...๋ก ์์)
โ ๏ธ ์ค์: ํค๋ ํ ๋ฒ๋ง ํ์๋๋ฏ๋ก ์์ ํ ๊ณณ์ ์ ์ฅ
โ๏ธ ์๋ ์ค์ ๋ฐฉ์ ํ๊ฒฝ ๋ณ์ ์ค์
๋ฐฑ์๋ ์๋น์ค ํ๊ฒฝ ๋ณ์
"Add Environment Variable" ๋ฒํผ์ ํด๋ฆญํ์ฌ ๋ค์ ๋ณ์๋ค ์ถ๊ฐ:
Key: OPENAI_API_KEY
Value: sk-proj-your-actual-key-here
Key: PYTHON_VERSION
Value: 3.11.9
Key: OPENAI_API_BASE
Value: https://api.openai.com/v1
Key: DEBUG
Value: false
Key: CORS_ORIGINS
Value: http://localhost:3000 (์์๊ฐ, ๋์ค์ ์
๋ฐ์ดํธ)
ํ๋ก ํธ์๋ ์๋น์ค ํ๊ฒฝ ๋ณ์
Key: VITE_API_URL
Value: [๋งํฌ ์์ด์ฝ ํด๋ฆญ โ ๋ฐฑ์๋ ์๋น์ค ์ ํ]
๐ก ํ: ๋งํฌ ์์ด์ฝ์ ์ฌ์ฉํ๋ฉด ๋ฐฑ์๋ ์๋น์ค์ ๋ด๋ถ URL์ด ์๋์ผ๋ก ์ค์ ๋ฉ๋๋ค.
์๋ ์ค์ ์ ๋ณด์ ๊ณ ๋ ค์ฌํญ
โ ๏ธ ์ฃผ์: ์๋ ์ค์ ์์๋ sync: false
์ต์
์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ค์ ์ฌํญ์ ์ค์ํ์ธ์:
API ํค ์ง์ ์ ๋ ฅ
๋์๋ณด๋์์ ์ง์ ์ ๋ ฅ
์ ๋ ์คํฌ๋ฆฐ์ท์ด๋ ๋ก๊ทธ์ ๋ ธ์ถํ์ง ์๊ธฐ
์ฆ์ ํค ์ญ์
๋ณต์ฌํ API ํค๋ ์ ๋ ฅ ํ ์ฆ์ ํด๋ฆฝ๋ณด๋์์ ์ญ์
์์ ํ์ผ์ด๋ ๋ฉ๋ชจ์ ์ ์ฅํ์ง ์๊ธฐ
์ ๊ทผ ๊ถํ ์ ํ
Render ํ๋ก์ ํธ ์ ๊ทผ ๊ถํ์ ํ์ํ ์ธ์์ผ๋ก ์ ํ
ํ์ ์ด๋ ์ ์ญํ ๊ถํ ์ค์
3๋จ๊ณ: ๊ธฐํ ํ๊ฒฝ ๋ณ์ ์ค์
CORS_ORIGINS: ์์๋ก ๊ธฐ๋ณธ๊ฐ ์ ์ง
PORT: ์๋ ์ค์ (์์ ๋ถํ์)
๊ธฐํ ํ์ํ ๋ณ์๋ค: ํ๋ก์ ํธ๋ณ๋ก ์ค์
๐ ๋ฐฐํฌ ์คํ
1๋จ๊ณ: ๋ฐฐํฌ ์์
๋ชจ๋ ์ค์ ํ์ธ ํ "Create Blueprint Instance" ํด๋ฆญ
๋ฐฐํฌ ํ๋ก์ธ์ค ์์ ํ์ธ
2๋จ๊ณ: ๋น๋ ๊ณผ์ ๋ชจ๋ํฐ๋ง
๋ก๊ทธ ํ์ธ:
๊ฐ ์๋น์ค๋ณ ๋น๋ ๋ก๊ทธ ์ค์๊ฐ ํ์ธ
์ค๋ฅ ๋ฐ์ ์ ์ฆ์ ํ์ ๊ฐ๋ฅ
๋น๋ ๋จ๊ณ:
์ข ์์ฑ ์ค์น
์ ํ๋ฆฌ์ผ์ด์ ๋น๋
๋ฐฐํฌ ํจํค์ง ์์ฑ
3๋จ๊ณ: ๋ฐฐํฌ ์๋ฃ ํ์ธ
์ฑ๊ณต ๋ฉ์์ง ํ์ธ
์๋น์ค URL ์์ฑ ํ์ธ:
ํ๋ก ํธ์๋:
https://your-app-name.onrender.com
๋ฐฑ์๋:
https://your-api-name.onrender.com
๐ง ๋ฐฐํฌ ํ ์ค์
1๋จ๊ณ: CORS ์ค์ ์ ๋ฐ์ดํธ
๋ฐฑ์๋ ์๋น์ค ์ค์ ํ์ด์ง๋ก ์ด๋
Environment ํญ ํด๋ฆญ
CORS_ORIGINS ๋ณ์ ์์ :
๋ณ๊ฒฝ ์ : http://localhost:3000๋ณ๊ฒฝ ํ: https://your-app-name.onrender.com
"Save Changes" ํด๋ฆญ
2๋จ๊ณ: ์๋น์ค ์ฌ๋ฐฐํฌ
์ค์ ๋ณ๊ฒฝ ํ ์๋ ์ฌ๋ฐฐํฌ ์์
๋ก๊ทธ์์ ์ฌ๋ฐฐํฌ ์๋ฃ ํ์ธ
3๋จ๊ณ: ์ต์ข ํ ์คํธ
ํ๋ก ํธ์๋ URL ์ ์ ํ ์คํธ
๋ฐฑ์๋ API ์ฐ๊ฒฐ ํ ์คํธ
OpenAI API ํค ์๋ ํ์ธ:
๋ฐฑ์๋ ๋ก๊ทธ์์ OpenAI API ํธ์ถ ์ฑ๊ณต ํ์ธ
์ ํ๋ฆฌ์ผ์ด์ ์์ OpenAI ๊ธฐ๋ฅ ํ ์คํธ
๋ชจ๋ ๊ธฐ๋ฅ ์ ์ ์๋ ํ์ธ
4๋จ๊ณ: ํ๊ฒฝ ๋ณ์ ํ์ธ ๋ฐฉ๋ฒ
Render ๋์๋ณด๋์์ ํ์ธ:
์๋น์ค ํ์ด์ง โ Environment ํญ
์ค์ ๋ ํ๊ฒฝ ๋ณ์ ๋ชฉ๋ก ํ์ธ
OPENAI_API_KEY
๊ฐ[hidden]
๋ก ํ์๋๋์ง ํ์ธ
๋ก๊ทธ์์ ํ์ธ:
์๋น์ค ๋ก๊ทธ์์ ํ๊ฒฝ ๋ณ์ ๋ก๋ฉ ํ์ธ
โ ๏ธ ์ฃผ์: ์ค์ API ํค ๊ฐ์ด ๋ก๊ทธ์ ๋ ธ์ถ๋์ง ์๋๋ก ์ฃผ์
๐ ๋ฌธ์ ํด๊ฒฐ ๊ฐ์ด๋
์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ค
1. ๋น๋ ์คํจ
์ฆ์: ๋น๋ ๊ณผ์ ์์ ์ค๋ฅ ๋ฐ์
Blueprint ๋ฐฉ์ ํด๊ฒฐ์ฑ :
๋ก๊ทธ์์ ๊ตฌ์ฒด์ ์ธ ์ค๋ฅ ๋ฉ์์ง ํ์ธ
package.json
์ข ์์ฑ ํ์ธ๋น๋ ๋ช ๋ น์ด ๊ฒ์ฆ
render.yaml
ํ์ผ ๊ตฌ๋ฌธ ์ค๋ฅ ํ์ธ
์๋ ์ค์ ๋ฐฉ์ ํด๊ฒฐ์ฑ :
Root Directory ์ค์ ํ์ธ (์:
backend
,frontend
)๋น๋ ๋ช ๋ น์ด ์ ํ์ฑ ํ์ธ
๋ธ๋์น ์ ํ ํ์ธ
1-1. ๋ชจ๋ ธ๋ ํฌ ๊ด๋ จ ๋น๋ ์ค๋ฅ
์ฆ์: "package.json not found" ๋๋ "No such file or directory"
ํด๊ฒฐ์ฑ :
Root Directory ์ค์ ํ์ธ
๋ฐฑ์๋:
backend
ํ๋ก ํธ์๋:
frontend
ํด๋ ๊ตฌ์กฐ์ ์ผ์นํ๋์ง ํ์ธ:
your-project/โโโ backend/โ โโโ requirements.txtโ โโโ api_server.pyโโโ frontend/โ โโโ package.jsonโ โโโ src/โโโ render.yaml
2. ํ๊ฒฝ ๋ณ์ ์ค๋ฅ
์ฆ์: ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ ์ค์ ์ค๋ฅ
Blueprint ๋ฐฉ์ ํด๊ฒฐ์ฑ :
๋ชจ๋ ํ์ ํ๊ฒฝ ๋ณ์ ์ค์ ํ์ธ
๋ณ์๋ช ์คํ ๊ฒ์ฌ
๋ฏผ๊ฐํ ์ ๋ณด๋ Secret์ผ๋ก ์ค์
์๋ ์ค์ ๋ฐฉ์ ํด๊ฒฐ์ฑ :
๊ฐ ์๋น์ค๋ณ๋ก ํ๊ฒฝ ๋ณ์ ๊ฐ๋ณ ํ์ธ
์๋น์ค ๊ฐ ์ฐ๊ฒฐ ์ค์ ํ์ธ
ํ๊ฒฝ ๋ณ์ ๊ฐ ํ์ ํ์ธ
2-1. OpenAI API ํค ๊ด๋ จ ์ค๋ฅ
์ฆ์: Invalid API key
๋๋ Authentication failed
์ค๋ฅ
ํด๊ฒฐ์ฑ :
OpenAI API ํค ํ์ ํ์ธ (sk-proj-... ๋๋ sk-...๋ก ์์)
API ํค ๋ง๋ฃ ์ฌ๋ถ ํ์ธ
OpenAI ๊ณ์ ๊ฒฐ์ ์ ๋ณด ํ์ธ
ํ๊ฒฝ ๋ณ์๋ช ํ์ธ:
OPENAI_API_KEY
(๋์๋ฌธ์ ์ฃผ์)
๋๋ฒ๊น ๋ฐฉ๋ฒ:
# Python ๋ฐฑ์๋์์ ํ๊ฒฝ ๋ณ์ ํ์ธ (๊ฐ๋ฐ ์์๋ง)
import os
print(f"API Key exists: {bool(os.getenv('OPENAI_API_KEY'))}")
print(f"API Key length: {len(os.getenv('OPENAI_API_KEY', ''))}")
# ์ ๋ ์ค์ ํค ๊ฐ์ ์ถ๋ ฅํ์ง ๋ง์ธ์!
2-2. ํ๊ฒฝ ๋ณ์ ์ ๋ฐ์ดํธ
๊ธฐ์กด ์๋น์ค์ ํ๊ฒฝ ๋ณ์ ์์ ๋ฐฉ๋ฒ:
Render ๋์๋ณด๋ โ ์๋น์ค ์ ํ
Environment ํญ ํด๋ฆญ
ํ๊ฒฝ ๋ณ์ ์ถ๊ฐ/์์
"Save Changes" ํด๋ฆญ โ ์๋ ์ฌ๋ฐฐํฌ
sync: false ์ฌ์ฉ ์ ์ฃผ์์ฌํญ:
์ต์ด ๋ฐฐํฌ ์์๋ง ๊ฐ์ ์ ๋ ฅํ ์ ์์
๊ธฐ์กด Blueprint ์ ๋ฐ์ดํธ ์
sync: false
๋ณ์๋ ๋ฌด์๋จ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ ๋์๋ณด๋์์ ์ง์ ์์ ํด์ผ ํจ
2-3. Preview ํ๊ฒฝ ๊ด๋ จ
Preview ํ๊ฒฝ์์ sync: false ๋ณ์ ๋๋ฝ ๋ฌธ์ :
Preview ํ๊ฒฝ์์๋
sync: false
๋ณ์๊ฐ ์๋ ํฌํจ๋์ง ์์ํด๊ฒฐ ๋ฐฉ๋ฒ: Environment Groups ์ฌ์ฉ ๊ถ์ฅ
envVarGroups:
- name: secrets
envVars:
- key: OPENAI_API_KEY
sync: false
services:
- name: my-app
envVars:
- fromGroup: secrets
3. CORS ์ค๋ฅ
์ฆ์: ํ๋ก ํธ์๋์์ ๋ฐฑ์๋ API ํธ์ถ ์คํจ
Blueprint ๋ฐฉ์ ํด๊ฒฐ์ฑ :
CORS_ORIGINS
์ ํ๋ก ํธ์๋ URL ์ถ๊ฐ์์ผ๋์นด๋
*
์ฌ์ฉ ์ ๋ณด์ ์ฃผ์
์๋ ์ค์ ๋ฐฉ์ ํด๊ฒฐ์ฑ :
ํ๋ก ํธ์๋ ๋ฐฐํฌ ์๋ฃ ํ URL ํ์ธ
๋ฐฑ์๋ ์๋น์ค โ Environment ํญ
CORS_ORIGINS
์ ๋ฐ์ดํธ:๋ณ๊ฒฝ ์ : http://localhost:3000๋ณ๊ฒฝ ํ: https://your-frontend-url.onrender.com
3-1. ์๋น์ค ๊ฐ ํต์ ์ค๋ฅ
์ฆ์: ํ๋ก ํธ์๋์์ ๋ฐฑ์๋ API ํธ์ถ ์ 404 ๋๋ 500 ์ค๋ฅ
์๋ ์ค์ ๋ฐฉ์ ํด๊ฒฐ์ฑ :
๋ฐฑ์๋ ์๋น์ค๊ฐ ์ ์์ ์ผ๋ก ์คํ๋๋์ง ํ์ธ
ํ๋ก ํธ์๋์
VITE_API_URL
์ค์ ํ์ธ์๋น์ค ๋งํฌ ์ฐ๊ฒฐ ์ํ ํ์ธ
4. ๋ฐฐํฌ ์๊ฐ ์ด๊ณผ
์ฆ์: ๋ฐฐํฌ๊ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๊ฑฐ๋ ์คํจ
ํด๊ฒฐ์ฑ :
๋น๋ ์บ์ ํ์ธ
๋ถํ์ํ ํ์ผ
.gitignore
์ ์ถ๊ฐ๋น๋ ์คํฌ๋ฆฝํธ ์ต์ ํ
์ข ์์ฑ ์ต์ ํ
5. ์๋ ์ค์ ํนํ ๋ฌธ์ ๋ค
5-1. ์๋น์ค ์ฐ๊ฒฐ ์คํจ
์ฆ์: ํ๋ก ํธ์๋์์ ๋ฐฑ์๋ ์๋น์ค๋ฅผ ์ฐพ์ ์ ์์
ํด๊ฒฐ์ฑ :
์๋น์ค ์ด๋ฆ ํ์ธ (์:
pascal-docx-backend
)์๋น์ค ๋งํฌ ์ค์ ์ฌํ์ธ
๋ ์๋น์ค๊ฐ ๊ฐ์ ๋ฆฌ์ ์ ๋ฐฐํฌ๋์๋์ง ํ์ธ
5-2. ๋น๋ ๋ช ๋ น์ด ์ค๋ฅ
์ฆ์: ์๋ชป๋ ๋น๋ ๋ช ๋ น์ด๋ก ์ธํ ์คํจ
์ผ๋ฐ์ ์ธ ์ฌ๋ฐ๋ฅธ ์ค์ :
Python (๋ฐฑ์๋):
Build Command: pip install -r requirements.txt
Start Command: uvicorn api_server:app --host 0.0.0.0 --port $PORT
Node.js (ํ๋ก ํธ์๋):
Build Command: npm install && npm run build
Start Command: npx serve -s dist
5-3. Root Directory ์ค์ ์ค๋ฅ
์ฆ์: ํ์ผ์ ์ฐพ์ ์ ์๋ค๋ ์ค๋ฅ
ํด๊ฒฐ์ฑ :
์ ์ฅ์ ๊ตฌ์กฐ ํ์ธ
์ ํํ ํด๋ ๊ฒฝ๋ก ์ค์
๋์๋ฌธ์ ๊ตฌ๋ถ ์ฃผ์
โ ๋ค๋ฅธ ์ฑ ๋ฐฐํฌ ์ ์ฌ์ฌ์ฉ ์ฒดํฌ๋ฆฌ์คํธ
์ฌ์ ์ค๋น
์ GitHub ์ ์ฅ์ ์์ฑ
๋ฐฐํฌ ๋ฐฉ์ ๊ฒฐ์ (Blueprint vs ์๋ ์ค์ )
render.yaml
ํ์ผ ์์ฑ (Blueprint ๋ฐฉ์ ์ฌ์ฉ ์)OpenAI API ํค ํ๋ ๋ฐ ์ค๋น
ํ์ํ API ํค๋ค ์ค๋น
ํ๋ก์ ํธ ๊ตฌ์กฐ ์ ๋ฆฌ
๐ Blueprint ๋ฐฉ์ ์ฒดํฌ๋ฆฌ์คํธ
Render ์ค์
Render ๋์๋ณด๋ ์ ์
"New +" โ "Blueprint" ์ ํ
GitHub ์ ์ฅ์ ์ฐ๊ฒฐ
Blueprint ์ค์ ํ์ธ
ํ๊ฒฝ ๋ณ์ ์ค์
๋ชจ๋ ํ์ ํ๊ฒฝ ๋ณ์ ์ ๋ ฅ
OpenAI API ํค ์์ ํ ์ค์ (
sync: false
์ฌ์ฉ)๋ฏผ๊ฐํ ์ ๋ณด Secret์ผ๋ก ์ค์
CORS ์ค์ ์์๊ฐ ์ ๋ ฅ
๋ฐฐํฌ ๋ฐ ํ ์คํธ
"Create Blueprint Instance" ํด๋ฆญ
๋น๋ ๋ก๊ทธ ๋ชจ๋ํฐ๋ง
๋ฐฐํฌ ์๋ฃ ํ์ธ
CORS ์ค์ ์ ๋ฐ์ดํธ
์ต์ข ๊ธฐ๋ฅ ํ ์คํธ
โ๏ธ ์๋ ์ค์ ๋ฐฉ์ ์ฒดํฌ๋ฆฌ์คํธ
๋ฐฑ์๋ ์๋น์ค ์ค์
"New +" โ "Web Service" ์ ํ
GitHub ์ ์ฅ์ ์ฐ๊ฒฐ
์๋น์ค ์ด๋ฆ ์ค์ (์:
your-app-backend
)Root Directory ์ค์ (
backend
)๋น๋ ๋ช ๋ น์ด ์ค์
์์ ๋ช ๋ น์ด ์ค์
ํ๊ฒฝ ๋ณ์ ์ถ๊ฐ:
OPENAI_API_KEY
PYTHON_VERSION
OPENAI_API_BASE
DEBUG
CORS_ORIGINS
(์์๊ฐ)
์๋น์ค ์์ฑ ์๋ฃ
ํ๋ก ํธ์๋ ์๋น์ค ์ค์
"New +" โ "Web Service" ์ ํ (๋ ๋ฒ์งธ ์๋น์ค)
๊ฐ์ GitHub ์ ์ฅ์ ์ฐ๊ฒฐ
์๋น์ค ์ด๋ฆ ์ค์ (์:
your-app-frontend
)Root Directory ์ค์ (
frontend
)๋น๋ ๋ช ๋ น์ด ์ค์
์์ ๋ช ๋ น์ด ์ค์
ํ๊ฒฝ ๋ณ์ ์ถ๊ฐ:
VITE_API_URL
(๋ฐฑ์๋ ์๋น์ค ๋งํฌ)
์๋น์ค ์์ฑ ์๋ฃ
์๋น์ค ์ฐ๊ฒฐ ์ค์
ํ๋ก ํธ์๋ URL ํ์ธ
๋ฐฑ์๋
CORS_ORIGINS
์ ๋ฐ์ดํธ์๋น์ค ๊ฐ ํต์ ํ ์คํธ
์ ์ฒด ๊ธฐ๋ฅ ํ ์คํธ
์ฌํ ๊ด๋ฆฌ (๊ณตํต)
๋๋ฉ์ธ ์ค์ (ํ์์)
๋ชจ๋ํฐ๋ง ์ค์
๋ฐฑ์ ๊ณํ ์๋ฆฝ
๋ฌธ์ํ ์ ๋ฐ์ดํธ
ํ์ ์ ๊ทผ ๊ถํ ์ค์
๐ฏ ๋ฐฉ๋ฒ ์ ํ ๊ฐ์ด๋
Blueprint ๋ฐฉ์์ ์ ํํ๋ ๊ฒฝ์ฐ:
ํ๋ก๋์ ํ๊ฒฝ ๋ฐฐํฌ
ํ ํ๋ก์ ํธ (์ค์ ์ ์ฝ๋๋ก ๊ด๋ฆฌ)
๋ณต์กํ ํ๊ฒฝ ๋ณ์ ์ค์
์๋ํ๋ ๋ฐฐํฌ ์ํจ
์ธํ๋ผ as Code ์ ํธ
์๋ ์ค์ ๋ฐฉ์์ ์ ํํ๋ ๊ฒฝ์ฐ:
ํ๋กํ ํ์ ๋๋ ํ ์คํธ ํ๊ฒฝ
๊ฐ๋จํ ๊ฐ์ธ ํ๋ก์ ํธ
๋น ๋ฅธ ๋ฐฐํฌ ํ์
์ง๊ด์ ์ธ UI ์ค์ ์ ํธ
render.yaml ํ์ผ ์์ฑ ์ด๋ ค์
๐ ์๋ฃ!
์ถํํฉ๋๋ค! ์ด์ ์ฌ๋ฌ๋ถ์ ์ฑ์ด ์ ์ธ๊ณ์์ ์ ๊ทผ ๊ฐ๋ฅํ ์ํ์ ๋๋ค.
๐ ๋ฐฐํฌ ์๋ฃ ํ์ธ
Blueprint ๋ฐฉ์์ผ๋ก ๋ฐฐํฌํ ๊ฒฝ์ฐ:
โ ๋ชจ๋ ์๋น์ค๊ฐ
render.yaml
์ค์ ๋๋ก ๋ฐฐํฌ๋จโ ํ๊ฒฝ ๋ณ์๊ฐ ์์ ํ๊ฒ ์ค์ ๋จ
โ ์๋น์ค ๊ฐ ์๋ ์ฐ๊ฒฐ ์๋ฃ
์๋ ์ค์ ์ผ๋ก ๋ฐฐํฌํ ๊ฒฝ์ฐ:
โ ๋ฐฑ์๋ ์๋น์ค ์ ์ ์คํ
โ ํ๋ก ํธ์๋ ์๋น์ค ์ ์ ์คํ
โ ์๋น์ค ๊ฐ ํต์ ์ฐ๊ฒฐ ์๋ฃ
โ CORS ์ค์ ์ ๋ฐ์ดํธ ์๋ฃ
๐ ์ต์ข ํ์ธ์ฌํญ
1. ์๋น์ค ์ํ ํ์ธ
๋ฐฑ์๋ ์๋น์ค:
https://your-backend.onrender.com
ํ๋ก ํธ์๋ ์๋น์ค:
https://your-frontend.onrender.com
๋ชจ๋ ์๋น์ค ์ํ:
Live
2. ๊ธฐ๋ฅ ํ ์คํธ
ํ๋ก ํธ์๋ ํ์ด์ง ๋ก๋ฉ ํ์ธ
๋ฐฑ์๋ API ์๋ต ํ์ธ
OpenAI API ์ฐ๋ ํ ์คํธ
์ ์ฒด ์ํฌํ๋ก์ฐ ํ ์คํธ
3. ํ๊ฒฝ ๋ณ์ ํ์ธ
OPENAI_API_KEY
: ์ค์ ์๋ฃ (๊ฐ์[hidden]
๋ก ํ์)CORS_ORIGINS
: ํ๋ก ํธ์๋ URL๋ก ์ ๋ฐ์ดํธ ์๋ฃ๊ธฐํ ํ์ํ ํ๊ฒฝ ๋ณ์ ๋ชจ๋ ์ค์ ์๋ฃ
๋ค์ ๋จ๊ณ๋ค
์ฌ์ฉ์ ํผ๋๋ฐฑ ์์ง
์ค์ ์ฌ์ฉ์๋ค์ ํผ๋๋ฐฑ ์์ง
์ฑ๋ฅ ๋ฐ ์ฌ์ฉ์ฑ ๊ฐ์ ์ ํ์
์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
Render ๋์๋ณด๋์์ ์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง
์๋ต ์๊ฐ ๋ฐ ์ค๋ฅ์จ ์ถ์
์ง์์ ์ธ ์ ๋ฐ์ดํธ
์ฝ๋ ๋ณ๊ฒฝ ์ ์๋ ๋ฐฐํฌ ํ์ธ
์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ ๋ฐ ๋ฐฐํฌ
๋ณด์ ๊ด๋ฆฌ
์ ๊ธฐ์ ์ธ API ํค ๊ต์ฒด (3-6๊ฐ์)
์ ๊ทผ ๊ถํ ๊ด๋ฆฌ
๋ณด์ ์ ๋ฐ์ดํธ ์ ์ฉ
๐ ๊ณ ๊ธ ํ์ฉ ํ
Blueprint ๋ฐฉ์ ์ฌ์ฉ์๋ฅผ ์ํ ํ:
render.yaml
ํ์ผ์ Git์ผ๋ก ๋ฒ์ ๊ด๋ฆฌํ๊ฒฝ๋ณ ์ค์ ํ์ผ ๋ถ๋ฆฌ (dev, staging, prod)
Preview ํ๊ฒฝ ํ์ฉ์ผ๋ก ํ ์คํธ ์๋ํ
์๋ ์ค์ ์ฌ์ฉ์๋ฅผ ์ํ ํ:
ํ๊ฒฝ ๋ณ์ ๋ฐฑ์ ๋ฐ ๋ฌธ์ํ
์๋น์ค ์ค์ ์คํฌ๋ฆฐ์ท ์ ์ฅ
๋ฐฐํฌ ๊ณผ์ ์๋ํ ์คํฌ๋ฆฝํธ ์์ฑ
๐ ์ถ๊ฐ ํ์ต ๋ฆฌ์์ค
Render ๊ด๋ จ:
๋ฐฐํฌ ์๋ํ:
๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น :
๐ง ๋ฌธ์์ฌํญ์ด๋ ์ถ๊ฐ ๋์์ด ํ์ํ์๋ฉด ์ธ์ ๋ ์ง ๋ง์ํด ์ฃผ์ธ์!