๋ฉ”์ธ ์ฝ˜ํ…์ธ ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿš€ Render ์•ฑ ๋ฐฐํฌ ์™„์ „ ๊ฐ€์ด๋“œ

๋‹ฌ์˜์ด์„ฑ
๋‹ฌ์˜์ด์„ฑ
โ€ข์กฐํšŒ์ˆ˜ 498

๐Ÿš€ Render ์•ฑ ๋ฐฐํฌ ์™„์ „ ๊ฐ€์ด๋“œ


๐Ÿ”‘ OpenAI API ํ‚ค ํš๋“ ๋ฐฉ๋ฒ•

1๋‹จ๊ณ„: OpenAI ๊ณ„์ • ์ƒ์„ฑ

  1. OpenAI ์›น์‚ฌ์ดํŠธ ์ ‘์†

  2. "Sign up" ํด๋ฆญํ•˜์—ฌ ๊ณ„์ • ์ƒ์„ฑ

  3. ์ด๋ฉ”์ผ ์ธ์ฆ ์™„๋ฃŒ

2๋‹จ๊ณ„: API ํ‚ค ์ƒ์„ฑ

  1. OpenAI API ํ‚ค ํŽ˜์ด์ง€ ์ ‘์†

  2. "Create new secret key" ํด๋ฆญ

  3. ํ‚ค ์ด๋ฆ„ ์ž…๋ ฅ (์˜ˆ: "My Render App")

  4. ์ƒ์„ฑ๋œ ํ‚ค ๋ณต์‚ฌ (sk-proj-... ๋˜๋Š” sk-...๋กœ ์‹œ์ž‘)

  5. โš ๏ธ ์ค‘์š”: ํ‚ค๋Š” ํ•œ ๋ฒˆ๋งŒ ํ‘œ์‹œ๋˜๋ฏ€๋กœ ์•ˆ์ „ํ•œ ๊ณณ์— ์ €์žฅ

3๋‹จ๊ณ„: ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ๊ฒฐ์ œ ์„ค์ •

  1. Billing ํŽ˜์ด์ง€ ์ ‘์†

  2. ๊ฒฐ์ œ ๋ฐฉ๋ฒ• ์ถ”๊ฐ€ (์‹ ์šฉ์นด๋“œ ๋“ฑ)

  3. ์‚ฌ์šฉ๋Ÿ‰ ํ•œ๋„ ์„ค์ • (๊ถŒ์žฅ: ์›” $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 ํ‚ค ๋ณด์•ˆ

  1. ์ ˆ๋Œ€ ํ•˜๋“œ์ฝ”๋”ฉ ๊ธˆ์ง€

    • render.yaml ํŒŒ์ผ์— ์ง์ ‘ ์ž…๋ ฅ ๊ธˆ์ง€

    • ์ฝ”๋“œ ํŒŒ์ผ์— ํ•˜๋“œ์ฝ”๋”ฉ ๊ธˆ์ง€

    • ๋กœ๊ทธ ํŒŒ์ผ์— ์ถœ๋ ฅ ๊ธˆ์ง€

  2. ์•ˆ์ „ํ•œ ์„ค์ • ๋ฐฉ๋ฒ•

    # โœ… ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•
    - key: OPENAI_API_KEY
      sync: false
    
    # โŒ ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•
    - key: OPENAI_API_KEY
      value: "sk-proj-actual-key-here"
    
  3. API ํ‚ค ํšŒ์ „ (์ •๊ธฐ์  ๊ฐฑ์‹ )

    • 3-6๊ฐœ์›”๋งˆ๋‹ค ์ƒˆ ํ‚ค ์ƒ์„ฑ

    • ์ด์ „ ํ‚ค ์‚ญ์ œ

    • ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ์—…๋ฐ์ดํŠธ

  4. ์‚ฌ์šฉ๋Ÿ‰ ๋ชจ๋‹ˆํ„ฐ๋ง

    • OpenAI ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ

    • ์ด์ƒ ์‚ฌ์šฉ ํŒจํ„ด ๊ฐ์ง€ ์‹œ ์ฆ‰์‹œ ํ‚ค ๊ต์ฒด

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ

  1. ๊ฐœ๋ฐœ/์šด์˜ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ

    # ๊ฐœ๋ฐœ์šฉ
    - key: OPENAI_API_KEY
      sync: false  # ๊ฐœ๋ฐœ์šฉ ํ‚ค ์‚ฌ์šฉ
    
    # ์šด์˜์šฉ
    - key: OPENAI_API_KEY
      sync: false  # ์šด์˜์šฉ ํ‚ค ์‚ฌ์šฉ (๋ณ„๋„ ํ‚ค ๊ถŒ์žฅ)
    
  2. ์ ‘๊ทผ ๊ถŒํ•œ ๊ด€๋ฆฌ

    • ํ•„์š”ํ•œ ํŒ€์›๋งŒ API ํ‚ค ์ ‘๊ทผ ํ—ˆ์šฉ

    • Render ํ”„๋กœ์ ํŠธ ๊ถŒํ•œ ๊ด€๋ฆฌ


๐Ÿ“‹ ๋ชฉ์ฐจ

  1. OpenAI API ํ‚ค ํš๋“ ๋ฐฉ๋ฒ•

  2. ์‚ฌ์ „ ์ค€๋น„์‚ฌํ•ญ

  3. Render ๊ณ„์ • ์ƒ์„ฑ

  4. Blueprint ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

  5. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

  6. ๋ฐฐํฌ ์‹คํ–‰

  7. ๋ฐฐํฌ ํ›„ ์„ค์ •

  8. ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€์ด๋“œ

  9. ๋‹ค๋ฅธ ์•ฑ ๋ฐฐํฌ ์‹œ ์žฌ์‚ฌ์šฉ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  10. ๋ณด์•ˆ ๋ชจ๋ฒ” ์‚ฌ๋ก€


๐Ÿ“ ์‚ฌ์ „ ์ค€๋น„์‚ฌํ•ญ

ํ•„์ˆ˜ ์ค€๋น„๋ฌผ

  • 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 ์›น์‚ฌ์ดํŠธ ์ ‘์†

  1. ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ render.com ์ ‘์†

  2. ์šฐ์ธก ์ƒ๋‹จ์˜ "Sign Up" ๋ฒ„ํŠผ ํด๋ฆญ

2๋‹จ๊ณ„: ํšŒ์›๊ฐ€์ž…

  1. GitHub ๊ณ„์ •์œผ๋กœ ๊ฐ€์ž… (๊ถŒ์žฅ)

    • "Continue with GitHub" ์„ ํƒ

    • GitHub ๋กœ๊ทธ์ธ ํ›„ ๊ถŒํ•œ ์Šน์ธ

  2. ๋˜๋Š” ์ด๋ฉ”์ผ๋กœ ๊ฐ€์ž…

    • ์ด๋ฉ”์ผ ์ฃผ์†Œ ์ž…๋ ฅ

    • ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ •

    • ์ด๋ฉ”์ผ ์ธ์ฆ ์™„๋ฃŒ

3๋‹จ๊ณ„: ๊ณ„์ • ์„ค์ •

  1. ํ”„๋กœํ•„ ์ •๋ณด ์ž…๋ ฅ

  2. ๋ฌด๋ฃŒ ํ”Œ๋žœ ์„ ํƒ (๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์šฉ)

  3. ๋Œ€์‹œ๋ณด๋“œ ์ ‘์† ํ™•์ธ


๐ŸŽฏ Blueprint ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

Render์—์„œ ์•ฑ์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

๐Ÿ”„ ๋ฐฉ๋ฒ• 1: Blueprint ์‚ฌ์šฉ (๊ถŒ์žฅ)

render.yaml ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

โš™๏ธ ๋ฐฉ๋ฒ• 2: ์ˆ˜๋™ ์„ค์ •

๊ฐ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•


๐Ÿ“‹ ๋ฐฉ๋ฒ• 1: Blueprint ์‚ฌ์šฉ (์ž๋™ ์„ค์ •)

1๋‹จ๊ณ„: ์ƒˆ ์„œ๋น„์Šค ์ƒ์„ฑ

  1. Render ๋Œ€์‹œ๋ณด๋“œ์—์„œ "New +" ๋ฒ„ํŠผ ํด๋ฆญ

  2. ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ "Blueprint" ์„ ํƒ

2๋‹จ๊ณ„: GitHub ์—ฐ๊ฒฐ

  1. "Connect GitHub" ํด๋ฆญ

  2. GitHub ๊ณ„์ • ๋กœ๊ทธ์ธ (์•„์ง ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)

  3. Render์— ์ €์žฅ์†Œ ์ ‘๊ทผ ๊ถŒํ•œ ๋ถ€์—ฌ

3๋‹จ๊ณ„: ์ €์žฅ์†Œ ์„ ํƒ

  1. ๋ฐฐํฌํ•  ํ”„๋กœ์ ํŠธ ์ €์žฅ์†Œ ์„ ํƒ

    • ์˜ˆ: your-username/pascal-docx

  2. "Connect" ๋ฒ„ํŠผ ํด๋ฆญ

4๋‹จ๊ณ„: Blueprint ๊ฐ์ง€ ํ™•์ธ

  1. Render๊ฐ€ ์ž๋™์œผ๋กœ render.yaml ํŒŒ์ผ ๊ฐ์ง€

  2. ์„ค์ • ์ •๋ณด ํ™•์ธ:

    • ์„œ๋น„์Šค ์œ ํ˜• (Web Service, Static Site ๋“ฑ)

    • ๋นŒ๋“œ ๋ช…๋ น์–ด

    • ์‹œ์ž‘ ๋ช…๋ น์–ด

    • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ชฉ๋ก


๐Ÿ”ง ๋ฐฉ๋ฒ• 2: ์ˆ˜๋™ ์„ค์ • (๊ฐœ๋ณ„ ์„œ๋น„์Šค)

render.yaml ํŒŒ์ผ์ด ์—†๊ฑฐ๋‚˜ ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

1๋‹จ๊ณ„: ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค ์ƒ์„ฑ

๊ธฐ๋ณธ ์„ค์ •

  1. Render ๋Œ€์‹œ๋ณด๋“œ์—์„œ "New +" โ†’ "Web Service" ์„ ํƒ

  2. GitHub ์ €์žฅ์†Œ ์—ฐ๊ฒฐ

  3. ๋‹ค์Œ ์„ค์ •๊ฐ’ ์ž…๋ ฅ:

์„œ๋น„์Šค ๊ธฐ๋ณธ ์ •๋ณด:

  • 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  (์ž„์‹œ๊ฐ’, ๋‚˜์ค‘์— ์—…๋ฐ์ดํŠธ)
  1. "Create Web Service" ํด๋ฆญ

2๋‹จ๊ณ„: ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น„์Šค ์ƒ์„ฑ

๊ธฐ๋ณธ ์„ค์ •

  1. ๋Œ€์‹œ๋ณด๋“œ์—์„œ "New +" โ†’ "Web Service" ์„ ํƒ

  2. ๊ฐ™์€ GitHub ์ €์žฅ์†Œ ์„ ํƒ

  3. ๋‹ค์Œ ์„ค์ •๊ฐ’ ์ž…๋ ฅ:

์„œ๋น„์Šค ๊ธฐ๋ณธ ์ •๋ณด:

  • 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์ด ์ž๋™์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

  1. "Create Web Service" ํด๋ฆญ

3๋‹จ๊ณ„: ์„œ๋น„์Šค ์—ฐ๊ฒฐ ์„ค์ •

๋ฐฑ์—”๋“œ CORS ์—…๋ฐ์ดํŠธ

  1. ํ”„๋ก ํŠธ์—”๋“œ ๋ฐฐํฌ ์™„๋ฃŒ ํ›„ URL ํ™•์ธ (์˜ˆ: https://pascal-docx-frontend.onrender.com)

  2. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค โ†’ Environment ํƒญ

  3. CORS_ORIGINS ๋ณ€์ˆ˜ ๊ฐ’์„ ํ”„๋ก ํŠธ์—”๋“œ URL๋กœ ์—…๋ฐ์ดํŠธ:

    ๋ณ€๊ฒฝ ์ „: http://localhost:3000๋ณ€๊ฒฝ ํ›„: https://pascal-docx-frontend.onrender.com
    
  4. "Save Changes" ํด๋ฆญ

4๋‹จ๊ณ„: ๋ฐฐํฌ ํ™•์ธ

  1. ๋‘ ์„œ๋น„์Šค ๋ชจ๋‘ ๋ฐฐํฌ ์™„๋ฃŒ ํ™•์ธ

  2. ํ”„๋ก ํŠธ์—”๋“œ URL ์ ‘์† ํ…Œ์ŠคํŠธ

  3. ๋ฐฑ์—”๋“œ 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 ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ž…๋ ฅ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•:

  1. render.yaml์— sync: false๋กœ ์„ค์ •

  2. ๋ฐฐํฌ ์‹œ Render ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํ”„๋กฌํ”„ํŠธ ์ฐฝ์— API ํ‚ค ์ž…๋ ฅ

  3. ์ž…๋ ฅ๋œ ๊ฐ’์€ ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ๋จ

๐Ÿ”’ ๋ฐฉ๋ฒ• 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๋‹จ๊ณ„: ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ž…๋ ฅ ๊ณผ์ •

  1. sync: false๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ:

    • Blueprint ์ƒ์„ฑ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋กฌํ”„ํŠธ ์ฐฝ์ด ๋‚˜ํƒ€๋‚จ:

    Environment Variables
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚ OPENAI_API_KEY                      โ”‚
    โ”‚ [                                 ] โ”‚
    โ”‚ Enter your OpenAI API key           โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
    
    • ์—ฌ๊ธฐ์— ์‹ค์ œ OpenAI API ํ‚ค ์ž…๋ ฅ (์˜ˆ: sk-proj-...)

  2. ์ž…๋ ฅํ•  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 ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹ค์Œ ์‚ฌํ•ญ์„ ์ค€์ˆ˜ํ•˜์„ธ์š”:

  1. API ํ‚ค ์ง์ ‘ ์ž…๋ ฅ

    • ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ง์ ‘ ์ž…๋ ฅ

    • ์ ˆ๋Œ€ ์Šคํฌ๋ฆฐ์ƒท์ด๋‚˜ ๋กœ๊ทธ์— ๋…ธ์ถœํ•˜์ง€ ์•Š๊ธฐ

  2. ์ฆ‰์‹œ ํ‚ค ์‚ญ์ œ

    • ๋ณต์‚ฌํ•œ API ํ‚ค๋Š” ์ž…๋ ฅ ํ›„ ์ฆ‰์‹œ ํด๋ฆฝ๋ณด๋“œ์—์„œ ์‚ญ์ œ

    • ์ž„์‹œ ํŒŒ์ผ์ด๋‚˜ ๋ฉ”๋ชจ์— ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ

  3. ์ ‘๊ทผ ๊ถŒํ•œ ์ œํ•œ

    • Render ํ”„๋กœ์ ํŠธ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ•„์š”ํ•œ ์ธ์›์œผ๋กœ ์ œํ•œ

    • ํŒ€์› ์ดˆ๋Œ€ ์‹œ ์—ญํ•  ๊ถŒํ•œ ์„ค์ •

3๋‹จ๊ณ„: ๊ธฐํƒ€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

  1. CORS_ORIGINS: ์ž„์‹œ๋กœ ๊ธฐ๋ณธ๊ฐ’ ์œ ์ง€

  2. PORT: ์ž๋™ ์„ค์ • (์ˆ˜์ • ๋ถˆํ•„์š”)

  3. ๊ธฐํƒ€ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋“ค: ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ์„ค์ •


๐Ÿš€ ๋ฐฐํฌ ์‹คํ–‰

1๋‹จ๊ณ„: ๋ฐฐํฌ ์‹œ์ž‘

  1. ๋ชจ๋“  ์„ค์ • ํ™•์ธ ํ›„ "Create Blueprint Instance" ํด๋ฆญ

  2. ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘ ํ™•์ธ

2๋‹จ๊ณ„: ๋นŒ๋“œ ๊ณผ์ • ๋ชจ๋‹ˆํ„ฐ๋ง

  1. ๋กœ๊ทธ ํ™•์ธ:

    • ๊ฐ ์„œ๋น„์Šค๋ณ„ ๋นŒ๋“œ ๋กœ๊ทธ ์‹ค์‹œ๊ฐ„ ํ™•์ธ

    • ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์ฆ‰์‹œ ํŒŒ์•… ๊ฐ€๋Šฅ

  2. ๋นŒ๋“œ ๋‹จ๊ณ„:

    • ์ข…์†์„ฑ ์„ค์น˜

    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ

    • ๋ฐฐํฌ ํŒจํ‚ค์ง€ ์ƒ์„ฑ

3๋‹จ๊ณ„: ๋ฐฐํฌ ์™„๋ฃŒ ํ™•์ธ

  1. ์„ฑ๊ณต ๋ฉ”์‹œ์ง€ ํ™•์ธ

  2. ์„œ๋น„์Šค URL ์ƒ์„ฑ ํ™•์ธ:

    • ํ”„๋ก ํŠธ์—”๋“œ: https://your-app-name.onrender.com

    • ๋ฐฑ์—”๋“œ: https://your-api-name.onrender.com


๐Ÿ”ง ๋ฐฐํฌ ํ›„ ์„ค์ •

1๋‹จ๊ณ„: CORS ์„ค์ • ์—…๋ฐ์ดํŠธ

  1. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค ์„ค์ • ํŽ˜์ด์ง€๋กœ ์ด๋™

  2. Environment ํƒญ ํด๋ฆญ

  3. CORS_ORIGINS ๋ณ€์ˆ˜ ์ˆ˜์ •:

    ๋ณ€๊ฒฝ ์ „: http://localhost:3000๋ณ€๊ฒฝ ํ›„: https://your-app-name.onrender.com
    
  4. "Save Changes" ํด๋ฆญ

2๋‹จ๊ณ„: ์„œ๋น„์Šค ์žฌ๋ฐฐํฌ

  1. ์„ค์ • ๋ณ€๊ฒฝ ํ›„ ์ž๋™ ์žฌ๋ฐฐํฌ ์‹œ์ž‘

  2. ๋กœ๊ทธ์—์„œ ์žฌ๋ฐฐํฌ ์™„๋ฃŒ ํ™•์ธ

3๋‹จ๊ณ„: ์ตœ์ข… ํ…Œ์ŠคํŠธ

  1. ํ”„๋ก ํŠธ์—”๋“œ URL ์ ‘์† ํ…Œ์ŠคํŠธ

  2. ๋ฐฑ์—”๋“œ API ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ

  3. OpenAI API ํ‚ค ์ž‘๋™ ํ™•์ธ:

    • ๋ฐฑ์—”๋“œ ๋กœ๊ทธ์—์„œ OpenAI API ํ˜ธ์ถœ ์„ฑ๊ณต ํ™•์ธ

    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ OpenAI ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ

  4. ๋ชจ๋“  ๊ธฐ๋Šฅ ์ •์ƒ ์ž‘๋™ ํ™•์ธ

4๋‹จ๊ณ„: ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ™•์ธ ๋ฐฉ๋ฒ•

  1. Render ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํ™•์ธ:

    • ์„œ๋น„์Šค ํŽ˜์ด์ง€ โ†’ Environment ํƒญ

    • ์„ค์ •๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ชฉ๋ก ํ™•์ธ

    • OPENAI_API_KEY๊ฐ€ [hidden]๋กœ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธ

  2. ๋กœ๊ทธ์—์„œ ํ™•์ธ:

    • ์„œ๋น„์Šค ๋กœ๊ทธ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋กœ๋”ฉ ํ™•์ธ

    • โš ๏ธ ์ฃผ์˜: ์‹ค์ œ 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. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์—…๋ฐ์ดํŠธ

๊ธฐ์กด ์„œ๋น„์Šค์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ˆ˜์ • ๋ฐฉ๋ฒ•:

  1. Render ๋Œ€์‹œ๋ณด๋“œ โ†’ ์„œ๋น„์Šค ์„ ํƒ

  2. Environment ํƒญ ํด๋ฆญ

  3. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ถ”๊ฐ€/์ˆ˜์ •

  4. "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 ์ถ”๊ฐ€

  • ์™€์ผ๋“œ์นด๋“œ * ์‚ฌ์šฉ ์‹œ ๋ณด์•ˆ ์ฃผ์˜

์ˆ˜๋™ ์„ค์ • ๋ฐฉ์‹ ํ•ด๊ฒฐ์ฑ…:

  1. ํ”„๋ก ํŠธ์—”๋“œ ๋ฐฐํฌ ์™„๋ฃŒ ํ›„ URL ํ™•์ธ

  2. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค โ†’ Environment ํƒญ

  3. 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๋กœ ์—…๋ฐ์ดํŠธ ์™„๋ฃŒ

  • ๊ธฐํƒ€ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ชจ๋‘ ์„ค์ • ์™„๋ฃŒ

๋‹ค์Œ ๋‹จ๊ณ„๋“ค

  1. ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘

    • ์‹ค์ œ ์‚ฌ์šฉ์ž๋“ค์˜ ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘

    • ์„ฑ๋Šฅ ๋ฐ ์‚ฌ์šฉ์„ฑ ๊ฐœ์„ ์  ํŒŒ์•…

  2. ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง

    • Render ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์‚ฌ์šฉ๋Ÿ‰ ๋ชจ๋‹ˆํ„ฐ๋ง

    • ์‘๋‹ต ์‹œ๊ฐ„ ๋ฐ ์˜ค๋ฅ˜์œจ ์ถ”์ 

  3. ์ง€์†์ ์ธ ์—…๋ฐ์ดํŠธ

    • ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์ž๋™ ๋ฐฐํฌ ํ™•์ธ

    • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ ๋ฐฐํฌ

  4. ๋ณด์•ˆ ๊ด€๋ฆฌ

    • ์ •๊ธฐ์ ์ธ API ํ‚ค ๊ต์ฒด (3-6๊ฐœ์›”)

    • ์ ‘๊ทผ ๊ถŒํ•œ ๊ด€๋ฆฌ

    • ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ ์ ์šฉ

๐Ÿš€ ๊ณ ๊ธ‰ ํ™œ์šฉ ํŒ

Blueprint ๋ฐฉ์‹ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ํŒ:

  • render.yaml ํŒŒ์ผ์„ Git์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ

  • ํ™˜๊ฒฝ๋ณ„ ์„ค์ • ํŒŒ์ผ ๋ถ„๋ฆฌ (dev, staging, prod)

  • Preview ํ™˜๊ฒฝ ํ™œ์šฉ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”

์ˆ˜๋™ ์„ค์ • ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ํŒ:

  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐฑ์—… ๋ฐ ๋ฌธ์„œํ™”

  • ์„œ๋น„์Šค ์„ค์ • ์Šคํฌ๋ฆฐ์ƒท ์ €์žฅ

  • ๋ฐฐํฌ ๊ณผ์ • ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

๐Ÿ“š ์ถ”๊ฐ€ ํ•™์Šต ๋ฆฌ์†Œ์Šค

Render ๊ด€๋ จ:

๋ฐฐํฌ ์ž๋™ํ™”:

๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…:


๐Ÿ“ง ๋ฌธ์˜์‚ฌํ•ญ์ด๋‚˜ ์ถ”๊ฐ€ ๋„์›€์ด ํ•„์š”ํ•˜์‹œ๋ฉด ์–ธ์ œ๋“ ์ง€ ๋ง์”€ํ•ด ์ฃผ์„ธ์š”!