API Specification - Team-likelion-3rd-Project/likelion-devops-7th-3rd-team01 GitHub Wiki

API ๋ช…์„ธ์„œ โ€” AI ๋‰ด์Šค ๋ธŒ๋ฆฌํ•‘ ์„œ๋น„์Šค (IT)

ํ•ญ๋ชฉ ๋‚ด์šฉ
์„œ๋น„์Šค AI ๋‰ด์Šค ๋ธŒ๋ฆฌํ•‘ ์„œ๋น„์Šค (๋ฐฑ์—”๋“œ ํŒŒํŠธ)
๋ฒ”์œ„ IT ๋‰ด์Šค 6๊ฐœ ๋ถ„์•ผ (AI, IT ์ผ๋ฐ˜, ๋ชจ๋ฐ”์ผ/ํ†ต์‹ , ์ปดํ“จํ„ฐ, ์ธํ„ฐ๋„ท, ๊ณผํ•™)
์ธ์ฆ JWT๋ฅผ httpOnly ์ฟ ํ‚ค(ACCESS_TOKEN)๋กœ ์ „๋‹ฌ / ํ™ˆยท๋ถ„์•ผ ์š”์•ฝ ์กฐํšŒ๋Š” ์ธ์ฆ ๋ถˆํ•„์š”
Base URL (๋กœ์ปฌ) http://localhost:8080
๋ฐ์ดํ„ฐ ํ˜•์‹ JSON (Content-Type: application/json)

๋ณ€๊ฒฝ (10/14): ๋ถ„์•ผ๋ฅผ ์ผ๋ฐ˜ ๋‰ด์Šค 6๊ฐœ(์ •์น˜ยท๊ฒฝ์ œยท์‚ฌํšŒยท์ƒํ™œ/๋ฌธํ™”ยทIT/๊ณผํ•™ยท์Šคํฌ์ธ )์—์„œ IT ์•ˆ์˜ 6๊ฐœ ๋ถ„์•ผ๋กœ ๋ฐ”๊ฟจ๋‹ค. ํ™ˆ ์นด๋“œ ์ˆ˜(6์žฅ)๋Š” ๊ฐ™๋‹ค. ํ›„๋ณด ๊ธฐ๋Šฅ์ด๋˜ ์ €์žฅํ•œ ๊ธฐ์‚ฌ API(์˜› 5.3~5.5)๋Š” ์ œ์™ธํ–ˆ๋‹ค. AI ๋ชจ๋ธ์€ Bedrock Nova Lite๋กœ ์ œ์•ˆ๋จ (7์žฅ, ๊ฒ€์ฆ ์ „).

๋ณ€๊ฒฝ (10/15): FE ์ œ์•ˆ์œผ๋กœ ๋ถ„์•ผ์—์„œ ๊ฒŒ์ž„(GAME)์„ ๋นผ๊ณ  AI(AI)๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค (AI๊ฐ€ ํ™ˆ ์ฒซ ์นด๋“œ). ๋ถ„์•ผ ์ด์Šˆ์— keyPointsยทtimelineยทglossary, ํ™ˆ ์ด์Šˆ์— **summary**๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. summary๋Š” ํ•œ ์ค„ ์š”์•ฝ์ด๋‹ค. ๋งˆ์ดํŽ˜์ด์ง€ ์ €์žฅํ•œ ๊ธฐ์‚ฌ(5.3~5.6)๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ํ–ˆ๋‹ค.


๊ณตํ†ต ๊ทœ์น™

์ธ์ฆ (์ฟ ํ‚ค)

  • ๋กœ๊ทธ์ธยทํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต ์‹œ ์„œ๋ฒ„๊ฐ€ ์ฟ ํ‚ค๋ฅผ ๋‚ด๋ ค์ค€๋‹ค. FE๋Š” ํ† ํฐ์„ ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค.
    Set-Cookie: ACCESS_TOKEN=<JWT>; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=86400
    
  • FE๋Š” ๋ชจ๋“  API ์š”์ฒญ์— ์ฟ ํ‚ค๊ฐ€ ์‹ค๋ฆฌ๋„๋ก fetch(url, { credentials: 'include' })๋กœ ํ˜ธ์ถœํ•œ๋‹ค.
  • FE์™€ API๋Š” ๊ฐ™์€ ์‚ฌ์ดํŠธ(๊ฐ™์€ ์ƒ์œ„ ๋„๋ฉ”์ธ)์—์„œ ์„œ๋น„์Šคํ•œ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฟ ํ‚ค๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
    • ์˜จํ”„๋ ˆ๋ฏธ์Šค: Nginx๊ฐ€ /api/* โ†’ ๋ฐฑ์—”๋“œ๋กœ ํ”„๋ก์‹œ (๊ฐ™์€ ์ถœ์ฒ˜, CORS ๋ถˆํ•„์š”)
    • AWS: ํ™”๋ฉด app.{๋„๋ฉ”์ธ} (CloudFront), API api.{๋„๋ฉ”์ธ} (ALB). Route 53 ๋„๋ฉ”์ธ ์‚ฌ์šฉ
    • AWS์™€ ๋กœ์ปฌ ๊ฐœ๋ฐœ(FE dev ์„œ๋ฒ„ โ†’ localhost:8080)์—์„œ๋Š” CORS๋กœ ํ™”๋ฉด ์ฃผ์†Œ๋งŒ ํ—ˆ์šฉํ•˜๊ณ  Access-Control-Allow-Credentials: true๋ฅผ ์ค€๋‹ค.
  • ๋กœ์ปฌ(http)์—์„œ๋Š” Secure ์†์„ฑ์„ ๋ˆ๋‹ค (ํ™˜๊ฒฝ ๋ณ€์ˆ˜ COOKIE_SECURE=false).
  • CSRF: SameSite=Lax + JSON ์š”์ฒญ๋งŒ ํ—ˆ์šฉ์œผ๋กœ ๋ง‰๋Š”๋‹ค.
  • ํ† ํฐ ๋งŒ๋ฃŒ(24์‹œ๊ฐ„) ํ›„์—๋Š” 401 UNAUTHORIZED โ†’ FE๋Š” ๋กœ๊ทธ์ธ ํŒ์—…์„ ๋„์šด๋‹ค.

์‘๋‹ต ํ˜•์‹

  • ์‹คํŒจ ์‘๋‹ต์€ ๋ชจ๋‘ ์•„๋ž˜ ํ˜•ํƒœ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.
    {
      "error": "์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ๋ฉ”์‹œ์ง€",
      "code": "ERROR_CODE"
    }
  • ๋‚ ์งœยท์‹œ๊ฐ„์€ ISO 8601 + ์˜คํ”„์…‹ (2026-10-07T11:30:00+09:00). "10์‹œ๊ฐ„ ์ „" ๊ฐ™์€ ์ƒ๋Œ€ ํ‘œ๊ธฐ๋Š” FE๊ฐ€ ๋งŒ๋“ ๋‹ค.
  • ๋ถ„์•ผ(category)๋Š” ์•„๋ž˜ ์ฝ”๋“œ๋กœ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค. ํ•œ๊ธ€ ์ด๋ฆ„์€ ์‘๋‹ต์˜ categoryName์—๋งŒ ๋„ฃ๋Š”๋‹ค. ํ™ˆ ์นด๋“œ๋Š” ์ด ํ‘œ์˜ ์ˆœ์„œ๋Œ€๋กœ ์˜จ๋‹ค.
code ์ด๋ฆ„
AI AI
IT_GENERAL IT ์ผ๋ฐ˜
MOBILE_TELECOM ๋ชจ๋ฐ”์ผ/ํ†ต์‹ 
COMPUTER ์ปดํ“จํ„ฐ
INTERNET ์ธํ„ฐ๋„ท
SCIENCE ๊ณผํ•™

1. Health Check (Spring Boot Actuator)

๋ฉ”์„œ๋“œ ๊ฒฝ๋กœ ์šฉ๋„
GET /actuator/health/liveness Liveness Probe. ์•ฑ ํ”„๋กœ์„ธ์Šค ์ƒ์กด ์—ฌ๋ถ€
GET /actuator/health/readiness Readiness Probe. DB ์—ฐ๊ฒฐ ํฌํ•จ ์ค€๋น„ ์ƒํƒœ
GET /actuator/info ๋ฐฐํฌ๋œ ์ปค๋ฐ‹ SHAยท๋นŒ๋“œ ์‹œ๊ฐ
GET /actuator/prometheus Prometheus ๋ฉ”ํŠธ๋ฆญ (M4)

์‘๋‹ต (200 OK) / ์ค€๋น„ ์•ˆ ๋จ์ด๋ฉด 503 + "status": "DOWN"

{ "status": "UP" }

Redis๋Š” readiness์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค. Redis๊ฐ€ ์ฃฝ์–ด๋„ DB๋กœ ์„œ๋น„์Šค๊ฐ€ ๊ณ„์†๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ(M6 ์žฅ์•  ์‹œ๋‚˜๋ฆฌ์˜ค), Redis ์žฅ์• ๋กœ Pod๊ฐ€ ํŠธ๋ž˜ํ”ฝ์—์„œ ๋น ์ง€๋ฉด ์•ˆ ๋œ๋‹ค.


2. ์ธ์ฆ (Auth) API

2.1 POST /api/auth/signup โ€” ํšŒ์›๊ฐ€์ž… (์ธ์ฆ ๋ถˆํ•„์š”)

๊ฐ€์ž… ์ฆ‰์‹œ ๋กœ๊ทธ์ธ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค (์ฟ ํ‚ค ๋ฐœ๊ธ‰). ๋กœ๊ทธ์ธ ํŒ์—…์—์„œ ๊ฐ€์ž… ํ›„ ํ•˜๋ ค๋˜ ๋™์ž‘์„ ๋ฐ”๋กœ ์ด์–ด๊ฐ€๊ธฐ ์œ„ํ•จ.

์š”์ฒญ

ํŒŒ๋ผ๋ฏธํ„ฐ ์œ„์น˜ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
email body String Y ์ด๋ฉ”์ผ ํ˜•์‹, ์ตœ๋Œ€ 255์ž
password body String Y 8~64์ž
nickname body String Y 1~20์ž

์‘๋‹ต (201 Created) + Set-Cookie: ACCESS_TOKEN=...

{
  "userId": 1,
  "email": "[email protected]",
  "nickname": "์šฉ๋ฏผ"
}
์ƒํƒœ code ์ƒํ™ฉ
400 VALIDATION_ERROR ํ˜•์‹ยท๊ธธ์ด ์˜ค๋ฅ˜
409 DUPLICATE_EMAIL ์ด๋ฏธ ๊ฐ€์ž…๋œ ์ด๋ฉ”์ผ

2.2 POST /api/auth/login โ€” ๋กœ๊ทธ์ธ (์ธ์ฆ ๋ถˆํ•„์š”)

์š”์ฒญ

ํŒŒ๋ผ๋ฏธํ„ฐ ์œ„์น˜ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
email body String Y ์ด๋ฉ”์ผ
password body String Y ๋น„๋ฐ€๋ฒˆํ˜ธ

์‘๋‹ต (200 OK) + Set-Cookie: ACCESS_TOKEN=...

{
  "userId": 1,
  "email": "[email protected]",
  "nickname": "์šฉ๋ฏผ"
}
์ƒํƒœ code ์ƒํ™ฉ
401 INVALID_CREDENTIALS ์ด๋ฉ”์ผ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถˆ์ผ์น˜

2.3 POST /api/auth/logout โ€” ๋กœ๊ทธ์•„์›ƒ (์ธ์ฆ ๋ถˆํ•„์š”)

์ฟ ํ‚ค๋ฅผ ์‚ญ์ œํ•œ๋‹ค. ๋กœ๊ทธ์ธ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ์–ด๋„ ํ•ญ์ƒ ์„ฑ๊ณตํ•œ๋‹ค.

์‘๋‹ต (204 No Content) + Set-Cookie: ACCESS_TOKEN=; Max-Age=0; Path=/

2.4 GET /api/auth/me โ€” ํ˜„์žฌ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž (์ธ์ฆ ํ•„์š”)

httpOnly ์ฟ ํ‚ค๋Š” JS์—์„œ ์ฝ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, FE๋Š” ์•ฑ ์‹œ์ž‘ ์‹œ ์ด API๋กœ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด ํ—ค๋” ๋ฒ„ํŠผ(๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ)์„ ๊ทธ๋ฆฐ๋‹ค.

์‘๋‹ต (200 OK)

{
  "userId": 1,
  "email": "[email protected]",
  "nickname": "์šฉ๋ฏผ"
}

์‘๋‹ต (401) UNAUTHORIZED โ†’ ๋น„๋กœ๊ทธ์ธ ์ƒํƒœ๋กœ ์ฒ˜๋ฆฌ


3. ๋‰ด์Šค ์š”์•ฝ (News) API

์š”์•ฝ์€ ์„œ๋ฒ„๊ฐ€ 30๋ถ„๋งˆ๋‹ค ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘”๋‹ค. ์กฐํšŒ API๋Š” ์ €์žฅ๋œ ๊ฒฐ๊ณผ๋งŒ ๋Œ๋ ค์ฃผ๋ฏ€๋กœ AI๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐฑ์‹ ์— ์‹คํŒจํ•˜๋ฉด ์ง์ „ ์š”์•ฝ์„ ๊ทธ๋Œ€๋กœ ๋Œ๋ ค์ค€๋‹ค.

  • ์‘๋‹ต์€ Redis์— ์บ์‹œํ•œ๋‹ค (์บ์‹œ ์šฐ์„ , ์—†์œผ๋ฉด DB, TTL 30๋ถ„). ์š”์•ฝ ๋ฐฐ์น˜๊ฐ€ ๋๋‚˜๋ฉด ์บ์‹œ๋ฅผ ๋น„์šฐ๋ฏ€๋กœ ์ƒˆ ์š”์•ฝ์€ ๋ฐ”๋กœ ๋ณด์ธ๋‹ค.
  • Redis๊ฐ€ ์ฃฝ์–ด๋„ DB์—์„œ ์ฝ์–ด ์ •์ƒ ์‘๋‹ตํ•œ๋‹ค (์‘๋‹ต ์‹œ๊ฐ„๋งŒ ๋Š˜์–ด๋‚จ).

3.1 GET /api/news/home โ€” ํ™ˆ (์ธ์ฆ ๋ถˆํ•„์š”)

6๊ฐœ ๋ถ„์•ผ ์นด๋“œ. ๋ถ„์•ผ๋งˆ๋‹ค ์ด์Šˆ ์ œ๋ชฉ 3๊ฐœ. ๋ถ„์•ผ ์ˆœ์„œ๋Š” ์œ„ ๋ถ„์•ผ ์ฝ”๋“œํ‘œ ์ˆœ์„œ.

์‘๋‹ต (200 OK)

{
  "generatedAt": "2026-10-14T11:30:00+09:00",
  "mock": false,
  "categories": [
    {
      "category": "AI",
      "categoryName": "AI",
      "issues": [
        {
          "issueId": 501,
          "title": "AI ๊ธฐ๋ณธ๋ฒ• ์‹œํ–‰๋ น ํ™•์ •โ€ฆ๊ณ ์˜ํ–ฅ AI ์‚ฌ์—…์ž ์˜๋ฌด ๊ตฌ์ฒดํ™”",
          "summary": "์ฑ„์šฉยท์˜๋ฃŒยท๊ธˆ์œต ๋“ฑ ๊ณ ์˜ํ–ฅ ๋ถ„์•ผ AI๋Š” ์œ„ํ—˜ ๊ด€๋ฆฌ์™€ ์„ค๋ช… ์˜๋ฌด๋ฅผ ์ง€๊ฒŒ ๋์–ด์š”."
        },
        { "issueId": 502, "title": "...", "summary": "..." },
        { "issueId": 503, "title": "...", "summary": "..." }
      ]
    }
  ]
}
  • mock: true์ด๋ฉด FE๋Š” ํ™”๋ฉด ์œ„์— "์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ" ๋ ๋ฅผ ๋„์šด๋‹ค.
  • summary: ํ•œ ์ค„ ์š”์•ฝ. FE๋Š” ๋ถ„์•ผ๋งˆ๋‹ค 1๋ฒˆ ์ด์Šˆ์—๋งŒ ๋ณด์—ฌ ์ค€๋‹ค.
  • ์•„์ง ํ•œ ๋ฒˆ๋„ ์š”์•ฝ์ด ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์€ ๋ถ„์•ผ๋Š” issues: [] (FE๋Š” ๋นˆ ๊ฒฐ๊ณผ ์ƒํƒœ ํ‘œ์‹œ).
  • ๊ฐฑ์‹  ์‹คํŒจ ์—ฌ๋ถ€๋Š” ๋ณ„๋„ ํ•„๋“œ ์—†์ด generatedAt์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค. FE๋Š” generatedAt์ด 1์‹œ๊ฐ„ ๋„˜๊ฒŒ ์ง€๋‚ฌ์œผ๋ฉด "๋‰ด์Šค ๊ฐฑ์‹ ์ด ์ง€์—ฐ๋˜๊ณ  ์žˆ์–ด์š”" ์•ˆ๋‚ด๋ฅผ ๋„์šด๋‹ค. (3.2๋„ ๊ฐ™์Œ)

3.2 GET /api/news/categories/{category} โ€” ๋ถ„์•ผ ํŽ˜์ด์ง€ (์ธ์ฆ ๋ถˆํ•„์š”)

์š”์ฒญ

ํŒŒ๋ผ๋ฏธํ„ฐ ์œ„์น˜ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
category path String Y ๋ถ„์•ผ ์ฝ”๋“œ (AI ๋“ฑ)

์‘๋‹ต (200 OK)

{
  "generatedAt": "2026-10-14T11:30:00+09:00",
  "mock": false,
  "category": "AI",
  "categoryName": "AI",
  "issues": [
    {
      "issueId": 501,
      "title": "AI ๊ธฐ๋ณธ๋ฒ• ์‹œํ–‰๋ น ํ™•์ •โ€ฆ๊ณ ์˜ํ–ฅ AI ์‚ฌ์—…์ž ์˜๋ฌด ๊ตฌ์ฒดํ™”",
      "summary": "์ฑ„์šฉยท์˜๋ฃŒยท๊ธˆ์œต ๋“ฑ ๊ณ ์˜ํ–ฅ ๋ถ„์•ผ AI๋Š” ์œ„ํ—˜ ๊ด€๋ฆฌ์™€ ์„ค๋ช… ์˜๋ฌด๋ฅผ ์ง€๊ฒŒ ๋์–ด์š”.",
      "keyPoints": [
        "๊ณ ์˜ํ–ฅ AI์˜ ๋ฒ”์œ„๋ฅผ ์ฑ„์šฉ, ๋Œ€์ถœ ์‹ฌ์‚ฌ, ์˜๋ฃŒ ์ง„๋‹จ ๋“ฑ์œผ๋กœ ๋ช…์‹œ",
        "์ƒ์„ฑํ˜• AI ๊ฒฐ๊ณผ๋ฌผ์—๋Š” AI๊ฐ€ ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ํ‘œ์‹œ ์˜๋ฌดํ™”",
        "๊ณ„๋„ ๊ธฐ๊ฐ„ 1๋…„์„ ๋‘๊ณ  ๊ณผํƒœ๋ฃŒ ๋ถ€๊ณผ๋Š” ์œ ์˜ˆ"
      ],
      "timeline": [
        { "date": "2026-10-13", "text": "AI ๊ธฐ๋ณธ๋ฒ• ์‹œํ–‰๋ น ๊ตญ๋ฌดํšŒ์˜ ์˜๊ฒฐ" },
        { "date": "2026-10-14", "text": "AI ๊ธฐ๋ณธ๋ฒ• ์‹œํ–‰๋ น ํ™•์ •, ๊ณ ์˜ํ–ฅ AI ๊ธฐ์ค€ ๋‚˜์™”๋‹ค" }
      ],
      "glossary": [
        { "term": "๊ณ ์˜ํ–ฅ AI", "description": "์‚ฌ๋žŒ์˜ ์ƒ๋ช…ยท์•ˆ์ „ยท๊ธฐ๋ณธ๊ถŒ์— ํฐ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ถ„์•ผ์— ์“ฐ์ด๋Š” AI์˜ˆ์š”." }
      ],
      "sources": [
        {
          "press": "์ „์ž์‹ ๋ฌธ",
          "title": "AI ๊ธฐ๋ณธ๋ฒ• ์‹œํ–‰๋ น ํ™•์ •, ๊ณ ์˜ํ–ฅ AI ๊ธฐ์ค€ ๋‚˜์™”๋‹ค",
          "url": "https://www.etnews.com/...",
          "publishedAt": "2026-10-14T01:20:00+09:00"
        }
      ]
    }
  ]
}
  • ๋ถ„์•ผ๋‹น ์ด์Šˆ๋Š” ์ตœ๋Œ€ 5๊ฐœ (rank_no ์ˆœ). ํ™ˆ์€ ๊ทธ์ค‘ 1~3๋ฒˆ.
  • summary: ํ•œ ์ค„ ์š”์•ฝ. keyPoints: ํ•ต์‹ฌ ํฌ์ธํŠธ (3๊ฐœ ์•ˆํŒŽ).
  • timeline: ์ „๊ฐœ ํ๋ฆ„. ๊ทผ๊ฑฐ ๊ธฐ์‚ฌ(sources)์˜ ๋ฐœํ–‰์ผ(date, YYYY-MM-DD, KST)๊ณผ ์ œ๋ชฉ(text)์œผ๋กœ ๋งŒ๋“ ๋‹ค (์˜ค๋ž˜๋œ ์ˆœ). AI๊ฐ€ ๊ธฐ์‚ฌ์— ์—†๋Š” ๋‚ ์งœยท์‚ฌ๊ฑด์„ ์ง€์–ด๋‚ด์ง€ ์•Š๊ฒŒ AI์—๊ฒŒ ๋งก๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ๋ฐœํ–‰์ผ ์—†๋Š” ๊ธฐ์‚ฌ๋Š” ๋น ์ง€๋ฏ€๋กœ ๋นˆ ๋ฐฐ์—ด์ผ ์ˆ˜ ์žˆ๋‹ค โ†’ FE๋Š” ๋นˆ ๋ฐฐ์—ด์ด๋ฉด ์˜์—ญ์„ ์ˆจ๊ธด๋‹ค.
  • glossary: ์šฉ์–ด ํ’€์ด. ํ’€ ์šฉ์–ด๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด์ผ ์ˆ˜ ์žˆ๋‹ค.
  • mock์ผ ๋•Œ: summary๋Š” [์ƒ˜ํ”Œ] + ๊ธฐ์‚ฌ ์†Œ๊ฐœ๊ธ€ ์ฒซ ๋ฌธ์žฅ, keyPoints๋Š” ์ด์–ด์ง€๋Š” ๋ฌธ์žฅ(์ตœ๋Œ€ 3๊ฐœ), glossary๋Š” ๊ณ ์ • ์˜ˆ์‹œ 1๊ฐœ.
  • ํ™ˆ์—์„œ ์ œ๋ชฉ์„ ๋ˆŒ๋Ÿฌ ๋“ค์–ด์˜จ ๊ฒฝ์šฐ FE๋Š” issueId๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์ด์Šˆ๋ฅผ ํŽผ์นœ๋‹ค (์˜ˆ: /category/AI?open=501).
์ƒํƒœ code ์ƒํ™ฉ
404 NOT_FOUND ์—†๋Š” ๋ถ„์•ผ ์ฝ”๋“œ (์˜› ์ฝ”๋“œ POLITICS, GAME ๋“ฑ ํฌํ•จ)

4. ์งˆ๋ฌธ (Question) API

์ฒ˜๋ฆฌ ํ๋ฆ„

  1. POST๋กœ ์งˆ๋ฌธ์„ ๋ณด๋‚ด๋ฉด DB์— PENDING์œผ๋กœ ์ฆ‰์‹œ ๊ธฐ๋กํ•˜๊ณ , Redis ๋Œ€๊ธฐ์—ด์— ์งˆ๋ฌธ ID๋ฅผ ๋„ฃ์€ ๋’ค 202๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  2. ์›Œ์ปค(๋ณ„๋„ Deployment, ๋Œ€๊ธฐ์—ด ๊ธธ์ด์— ๋”ฐ๋ผ KEDA๋กœ ํ™•์žฅ)๊ฐ€ ๋Œ€๊ธฐ์—ด์—์„œ ์งˆ๋ฌธ์„ ๊บผ๋‚ด PENDINGโ†’PROCESSING์œผ๋กœ ๋ฐ”๊พธ๊ณ (์ด๋ฏธ ๋‹ค๋ฅธ ์›Œ์ปค๊ฐ€ ๋ฐ”๊ฟจ์œผ๋ฉด ๊ฑด๋„ˆ๋œ€), ๊ด€๋ จ ๊ธฐ์‚ฌ๋ฅผ ์ฐพ์•„ AI๋กœ ๋‹ต์„ ๋งŒ๋“ ๋‹ค.
    • Redis ์žฅ์•  ์ „ํ™˜์œผ๋กœ ๋Œ€๊ธฐ์—ด ํ•ญ๋ชฉ์ด ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, 30์ดˆ ๋„˜๊ฒŒ PENDING์ธ ์งˆ๋ฌธ์€ ์„œ๋ฒ„๊ฐ€ ๋Œ€๊ธฐ์—ด์— ๋‹ค์‹œ ๋„ฃ๋Š”๋‹ค. ์งˆ๋ฌธ์˜ ์‹ค์ œ ์ƒํƒœ๋Š” ํ•ญ์ƒ DB๊ฐ€ ๊ธฐ์ค€์ด๋‹ค.
  3. ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ COMPLETED / REJECTED(๋‰ด์Šค์™€ ๋ฌด๊ด€ํ•œ ์งˆ๋ฌธ) / FAILED๋กœ ๋ฐ”๋€๋‹ค.
  4. FE๋Š” GET /api/questions/{id}๋ฅผ 2์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ํด๋งํ•œ๋‹ค. ์ฒ˜๋ฆฌ ์ค‘ ๋‹ค๋ฅธ ํ™”๋ฉด์œผ๋กœ ๊ฐ€๋„ ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ์ด์–ด์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  5. 60์ดˆ ๋„˜๊ฒŒ ๋๋‚˜์ง€ ์•Š์€ ์งˆ๋ฌธ์€ ์„œ๋ฒ„๊ฐ€ FAILED๋กœ ๋ฐ”๊พผ๋‹ค.
status ์˜๋ฏธ FE ํ‘œ์‹œ
PENDING ์ ‘์ˆ˜๋จ, ๋Œ€๊ธฐ ์ค‘ ์ฒ˜๋ฆฌ ์ค‘
PROCESSING AI ์ฒ˜๋ฆฌ ์ค‘ ์ฒ˜๋ฆฌ ์ค‘
COMPLETED ๋‹ต ์ƒ์„ฑ ์™„๋ฃŒ ๋‹ต + ๊ทผ๊ฑฐ ๊ธฐ์‚ฌ
REJECTED ๋‰ด์Šค์™€ ๋ฌด๊ด€ํ•œ ์งˆ๋ฌธ ๊ฑฐ์ ˆ ์•ˆ๋‚ด (answer์— ์•ˆ๋‚ด ๋ฌธ๊ตฌ)
FAILED ์ฒ˜๋ฆฌ ์‹คํŒจ (AI ์˜ค๋ฅ˜ยทํƒ€์ž„์•„์›ƒ) ์‹คํŒจ ์•ˆ๋‚ด

4.1 POST /api/questions โ€” ์งˆ๋ฌธ ์ ‘์ˆ˜ (์ธ์ฆ ํ•„์š”)

์š”์ฒญ

ํŒŒ๋ผ๋ฏธํ„ฐ ์œ„์น˜ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
query body String Y ์งˆ๋ฌธ ๋‚ด์šฉ, 1~500์ž

์‘๋‹ต (202 Accepted)

{
  "questionId": 123,
  "status": "PENDING"
}
์ƒํƒœ code ์ƒํ™ฉ
400 VALIDATION_ERROR ๋นˆ ์งˆ๋ฌธ, 500์ž ์ดˆ๊ณผ
429 RATE_LIMIT_EXCEEDED ํ•˜๋ฃจ ์งˆ๋ฌธ 10ํšŒ ์ดˆ๊ณผ (์ž์ • KST ๊ธฐ์ค€ ์ดˆ๊ธฐํ™”, ๊ฑฐ์ ˆ(REJECTED)๋œ ์งˆ๋ฌธ์€ ํฌํ•จ, ์‹คํŒจ(FAILED)ํ•œ ์งˆ๋ฌธ์€ ์ œ์™ธ)

4.2 GET /api/questions/{id} โ€” ์งˆ๋ฌธ ์ƒํƒœยท๊ฒฐ๊ณผ ์กฐํšŒ (์ธ์ฆ ํ•„์š”)

์‘๋‹ต (200 OK)

{
  "questionId": 123,
  "status": "COMPLETED",
  "query": "์š”์ฆ˜ AI ๋ฐ˜๋„์ฒด ์‹œ์žฅ ์–ด๋•Œ?",
  "answer": "์ตœ๊ทผ AI ๋ฐ˜๋„์ฒด ์‹œ์žฅ์€ ๋ฐ์ดํ„ฐ์„ผํ„ฐ ์ˆ˜์š”๋กœ ์ธํ•ด...",
  "sources": [
    {
      "press": "์ „์ž์‹ ๋ฌธ",
      "title": "AI ๋ฐ˜๋„์ฒด ํˆฌ์ž ํ™•๋Œ€...",
      "url": "https://www.etnews.com/...",
      "publishedAt": "2026-10-14T09:00:00+09:00"
    }
  ],
  "saved": false,
  "createdAt": "2026-10-14T11:00:00+09:00",
  "completedAt": "2026-10-14T11:00:08+09:00"
}
  • PENDINGยทPROCESSING์ผ ๋•Œ answer, sources, completedAt์€ null.
  • saved: ์งˆ๋ฌธ ์ €์žฅ(๋ณ„) ์—ฌ๋ถ€.
์ƒํƒœ code ์ƒํ™ฉ
404 NOT_FOUND ์—†๋Š” ์งˆ๋ฌธ ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ (์กด์žฌ ์—ฌ๋ถ€๋ฅผ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด 403 ๋Œ€์‹  404)

4.3 DELETE /api/questions/{id} โ€” ์งˆ๋ฌธ ๊ธฐ๋ก ์‚ญ์ œ (์ธ์ฆ ํ•„์š”)

์งˆ๋ฌธ์„ ์‚ญ์ œํ•œ๋‹ค. ์ €์žฅํ•œ ์งˆ๋ฌธ์—์„œ๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค.

์‘๋‹ต (204 No Content)

์ƒํƒœ code ์ƒํ™ฉ
404 NOT_FOUND ์—†๋Š” ์งˆ๋ฌธ ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ

4.4 PUT /api/questions/{id}/saved โ€” ์งˆ๋ฌธ ์ €์žฅ(๋ณ„) (์ธ์ฆ ํ•„์š”)

์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค (์ด๋ฏธ ์ €์žฅ๋œ ์งˆ๋ฌธ์ด๋ฉด ๊ทธ๋Œ€๋กœ ์„ฑ๊ณต).

์‘๋‹ต (204 No Content)

4.5 DELETE /api/questions/{id}/saved โ€” ์งˆ๋ฌธ ์ €์žฅ ํ•ด์ œ (์ธ์ฆ ํ•„์š”)

์‘๋‹ต (204 No Content)

4.4ยท4.5 ๊ณตํ†ต ์˜ค๋ฅ˜: 404 NOT_FOUND (์—†๋Š” ์งˆ๋ฌธ ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ)


5. ๋งˆ์ดํŽ˜์ด์ง€ (MyPage) API

๋งˆ์ดํŽ˜์ด์ง€๋Š” ์งˆ๋ฌธ ๊ธฐ๋ก, ์ €์žฅํ•œ ์งˆ๋ฌธ, ์ €์žฅํ•œ ๊ธฐ์‚ฌ ์„ธ ๊ตฌ์—ญ์ด๋‹ค. ๋ชฉ๋ก์€ ์ตœ์‹ ์ˆœ. ํŽ˜์ด์ง€ ํฌ๊ธฐ๋Š” ๊ณ ์ •(size=20), page๋Š” 0๋ถ€ํ„ฐ.

5.1 GET /api/mypage/questions?page=0 โ€” ์งˆ๋ฌธ ๊ธฐ๋ก (์ธ์ฆ ํ•„์š”)

์‘๋‹ต (200 OK)

{
  "questions": [
    {
      "questionId": 123,
      "query": "์š”์ฆ˜ AI ๋ฐ˜๋„์ฒด ์‹œ์žฅ ์–ด๋•Œ?",
      "status": "COMPLETED",
      "saved": true,
      "createdAt": "2026-10-14T11:00:00+09:00"
    }
  ],
  "hasNext": false
}

5.2 GET /api/mypage/saved-questions?page=0 โ€” ์ €์žฅํ•œ ์งˆ๋ฌธ (์ธ์ฆ ํ•„์š”)

์‘๋‹ต ํ˜•ํƒœ๋Š” 5.1๊ณผ ๊ฐ™๊ณ , saved: true์ธ ์งˆ๋ฌธ๋งŒ ์ €์žฅํ•œ ์ˆœ์„œ(์ตœ์‹ ์ˆœ)๋กœ ์ค€๋‹ค. ์ƒ์„ธ๋Š” GET /api/questions/{id}๋กœ ๋ณธ๋‹ค.

5.3 PUT /api/saved-articles โ€” ๊ทผ๊ฑฐ ๊ธฐ์‚ฌ ์ €์žฅ (์ธ์ฆ ํ•„์š”)

๋ถ„์•ผ ํŽ˜์ด์ง€์˜ ๊ทผ๊ฑฐ ๊ธฐ์‚ฌ(sources ํ•ญ๋ชฉ) ํ•˜๋‚˜๋ฅผ ์ €์žฅํ•œ๋‹ค. ์š”์ฒญ ๋ณธ๋ฌธ์€ sources ํ•ญ๋ชฉ์„ ๊ทธ๋Œ€๋กœ ๋ณด๋‚ธ๋‹ค. ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค (์ด๋ฏธ ์ €์žฅํ•œ ๊ธฐ์‚ฌ๋ฉด ๊ทธ๋Œ€๋กœ ์„ฑ๊ณต). ์›๋ณธ ๊ธฐ์‚ฌ๋Š” 7์ผ ๋’ค ์ง€์›Œ์ง€๋ฏ€๋กœ ์ €์žฅํ•  ๋•Œ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•ด ๋‘”๋‹ค.

์š”์ฒญ

ํŒŒ๋ผ๋ฏธํ„ฐ ์œ„์น˜ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
title body String Y ๊ธฐ์‚ฌ ์ œ๋ชฉ, ์ตœ๋Œ€ 255์ž
url body String Y ๊ธฐ์‚ฌ ์ฃผ์†Œ, http:// ๋˜๋Š” https://๋กœ ์‹œ์ž‘, ์ตœ๋Œ€ 512์ž
press body String N ์–ธ๋ก ์‚ฌ, ์ตœ๋Œ€ 100์ž
publishedAt body String N ๋ฐœํ–‰ ์‹œ๊ฐ (ISO 8601 + ์˜คํ”„์…‹)
{
  "press": "์ „์ž์‹ ๋ฌธ",
  "title": "AI ๊ธฐ๋ณธ๋ฒ• ์‹œํ–‰๋ น ํ™•์ •, ๊ณ ์˜ํ–ฅ AI ๊ธฐ์ค€ ๋‚˜์™”๋‹ค",
  "url": "https://www.etnews.com/20261014000001",
  "publishedAt": "2026-10-14T09:00:00+09:00"
}

์‘๋‹ต (204 No Content)

์ƒํƒœ code ์ƒํ™ฉ
400 VALIDATION_ERROR ์ œ๋ชฉยท์ฃผ์†Œ ์—†์Œ, ๊ธธ์ด ์ดˆ๊ณผ, http(s)๊ฐ€ ์•„๋‹Œ ์ฃผ์†Œ

5.4 DELETE /api/saved-articles?url={๊ธฐ์‚ฌ ์ฃผ์†Œ} โ€” ์ €์žฅ ํ•ด์ œ (์ธ์ฆ ํ•„์š”)

url์€ URL ์ธ์ฝ”๋”ฉํ•ด์„œ ๋ณด๋‚ธ๋‹ค (encodeURIComponent).

์‘๋‹ต (204 No Content)

์ƒํƒœ code ์ƒํ™ฉ
404 NOT_FOUND ์ €์žฅํ•˜์ง€ ์•Š์€ ๊ธฐ์‚ฌ

5.5 GET /api/saved-articles/urls โ€” ์ €์žฅํ•œ ๊ธฐ์‚ฌ ์ฃผ์†Œ ๋ชฉ๋ก (์ธ์ฆ ํ•„์š”)

๋ถ„์•ผ ํŽ˜์ด์ง€์—์„œ ๊ทผ๊ฑฐ ๊ธฐ์‚ฌ๋งˆ๋‹ค ์ €์žฅ ๋ฒ„ํŠผ์„ ์ฑ„์›Œ ๊ทธ๋ฆด์ง€ ํŒ๋‹จํ•  ๋•Œ ์“ด๋‹ค. ๋ถ„์•ผ ์‘๋‹ต์€ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ™์ด ์“ฐ๋Š” ์บ์‹œ๋ผ ์‚ฌ์šฉ์ž๋ณ„ ์ €์žฅ ์—ฌ๋ถ€๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.

์‘๋‹ต (200 OK)

{ "urls": ["https://www.etnews.com/20261014000001"] }

5.6 GET /api/mypage/saved-articles?page=0 โ€” ์ €์žฅํ•œ ๊ธฐ์‚ฌ ๋ชฉ๋ก (์ธ์ฆ ํ•„์š”)

์ตœ๊ทผ์— ์ €์žฅํ•œ ์ˆœ.

์‘๋‹ต (200 OK)

{
  "articles": [
    {
      "savedArticleId": 7,
      "press": "์ „์ž์‹ ๋ฌธ",
      "title": "AI ๊ธฐ๋ณธ๋ฒ• ์‹œํ–‰๋ น ํ™•์ •, ๊ณ ์˜ํ–ฅ AI ๊ธฐ์ค€ ๋‚˜์™”๋‹ค",
      "url": "https://www.etnews.com/20261014000001",
      "publishedAt": "2026-10-14T09:00:00+09:00",
      "savedAt": "2026-10-15T14:00:00+09:00"
    }
  ],
  "hasNext": false
}

6. ์—๋Ÿฌ ์ฝ”๋“œ ์ „์ฒด

์ƒํƒœ code ์ƒํ™ฉ
400 VALIDATION_ERROR ์š”์ฒญ ๊ฐ’ ํ˜•์‹ยท๊ธธ์ด ์˜ค๋ฅ˜
401 INVALID_CREDENTIALS ๋กœ๊ทธ์ธ ์‹œ ์ด๋ฉ”์ผ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถˆ์ผ์น˜
401 UNAUTHORIZED ์ฟ ํ‚ค ์—†์Œ, ํ† ํฐ์ด ์œ ํšจํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋งŒ๋ฃŒ
404 NOT_FOUND ์—†๋Š” ๋ฆฌ์†Œ์Šค ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๋ฆฌ์†Œ์Šค
409 DUPLICATE_EMAIL ์ด๋ฏธ ๊ฐ€์ž…๋œ ์ด๋ฉ”์ผ
429 RATE_LIMIT_EXCEEDED ํ•˜๋ฃจ ์งˆ๋ฌธ 10ํšŒ ์ดˆ๊ณผ
500 INTERNAL_SERVER_ERROR ์„œ๋ฒ„ ๋‚ด๋ถ€ ์˜ค๋ฅ˜

AIยท๋‰ด์Šค API ์‹คํŒจ๋Š” ์‚ฌ์šฉ์ž ์š”์ฒญ์— 500์œผ๋กœ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์š”์•ฝ ๊ฐฑ์‹  ์‹คํŒจ โ†’ ์ง์ „ ์š”์•ฝ ์œ ์ง€, ์งˆ๋ฌธ ์ฒ˜๋ฆฌ ์‹คํŒจ โ†’ ์งˆ๋ฌธ ์ƒํƒœ๊ฐ€ FAILED.


7. ๊ฒฐ์ • ์‚ฌํ•ญ

  • IT 6๋ถ„์•ผ ๋‰ด์Šค ์ˆ˜์ง‘: ์ „์ž์‹ ๋ฌธ ๋ถ„์•ผ๋ณ„ RSS๋ฅผ 30๋ถ„๋งˆ๋‹ค ์ˆ˜์ง‘ํ•œ๋‹ค. ์ œ๋ชฉยท์š”์•ฝ๋ฌธยท๋งํฌยท์–ธ๋ก ์‚ฌยท๋‚ ์งœ๋งŒ ์ €์žฅํ•˜๊ณ  7์ผ ๋ณด๊ด€. ์š”์•ฝ์—๋Š” ์ตœ๊ทผ 48์‹œ๊ฐ„ ๊ธฐ์‚ฌ๋ฅผ ์“ด๋‹ค.

    ๋ถ„์•ผ RSS (rss.etnews.com)
    AI 04046.xml (AIยทSW > AI)
    ๋ชจ๋ฐ”์ผ/ํ†ต์‹  03033.xml (ํ†ต์‹ )
    ์ปดํ“จํ„ฐ 04043.xml (SW)
    ์ธํ„ฐ๋„ท 60.xml (ํ”Œ๋žซํผ/์œ ํ†ต)
    ๊ณผํ•™ 20.xml (๊ณผํ•™)
    IT ์ผ๋ฐ˜ 03.xml, 04.xml, 06.xml (ITยทSWยท์ „์ž ์ƒ์œ„ ํ”ผ๋“œ)

    ๊ฐ™์€ ๊ธฐ์‚ฌ(URL)๋Š” ํ•œ ๋ถ„์•ผ์—๋งŒ ์ €์žฅ๋œ๋‹ค. IT ์ผ๋ฐ˜์€ ์ƒ์œ„ ํ”ผ๋“œ๋ผ ๋‹ค๋ฅธ ๋ถ„์•ผ ๊ธฐ์‚ฌ๊ฐ€ ์„ž์—ฌ ์žˆ์œผ๋ฏ€๋กœ ๋งจ ๋งˆ์ง€๋ง‰์— ์ˆ˜์ง‘ํ•ด์„œ, ์„ธ๋ถ€ ๋ถ„์•ผ์— ๋“ค์–ด๊ฐ€์ง€ ์•Š์€ ๊ธฐ์‚ฌ๋งŒ IT ์ผ๋ฐ˜์ด ๊ฐ–๋Š”๋‹ค.

  • ๋ถ€์กฑํ•œ ๊ธฐ์‚ฌ ๋ณด์™„: ์งˆ๋ฌธ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ์‚ฌ๊ฐ€ DB์— ์—†์œผ๋ฉด ๋„ค์ด๋ฒ„ ๋‰ด์Šค ๊ฒ€์ƒ‰ API๋กœ ๊ฒ€์ƒ‰ํ•ด ๋‹ต๋ณ€ (๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—๋Š” ๋ถ„์•ผ๊ฐ€ ์—†์–ด DB์— ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค). ๊ทธ๋ž˜๋„ ์—†์œผ๋ฉด "์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค"๊ณ  ์•ˆ๋‚ด.

  • AI ์„œ๋น„์Šค (๊ฒ€์ฆ ์ „ ์ œ์•ˆ, 10/14 CL): Amazon Bedrock Nova Lite. ์„œ์šธ ๋ฆฌ์ „(ap-northeast-2)์—์„œ ๊ต์ฐจ ๋ฆฌ์ „ ์ถ”๋ก ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. ํ•œ๊ตญ์–ด ์š”์•ฝยท์ถœ์ฒ˜ ์ •ํ™•์„ฑยท์‘๋‹ต ํ˜•์‹์„ ํ™•์ธํ•œ ๋’ค ํ™•์ •ํ•˜๊ณ , ํ’ˆ์งˆ์ด ๋ถ€์กฑํ•˜๋ฉด Nova Pro์™€ ๋น„๊ตํ•œ๋‹ค. Bedrock์„ ์“ธ ์ˆ˜ ์—†์œผ๋ฉด AI ํšŒ์‚ฌ API ์ง์ ‘ ํ˜ธ์ถœ.

    • ์š”์•ฝ๊ณผ ์งˆ๋ฌธ ๋‹ต๋ณ€ ๋ชจ๋‘ ๊ฐ™์€ ๋ชจ๋ธ์„ ์“ด๋‹ค. ์ „ํ™˜์€ AI_MODE=mock | bedrock (docs/env.md).
    • ์‹ค์ œ AI๋Š” ์ ๊ฒ€์ผ์—๋งŒ ์ผ ๋‹ค: 4์ฃผ์ฐจ ์ ๊ฒ€ยท6์ฃผ์ฐจ ๋ฆฌํ—ˆ์„คยท๋ฐœํ‘œ, ๊ฐ ์ตœ๋Œ€ 4์‹œ๊ฐ„ (์ด 12์‹œ๊ฐ„). ๊ฐœ๋ฐœยท๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋Š” mock.
    • ์˜ˆ์ƒ ์‚ฌ์šฉ๋Ÿ‰: ์งˆ๋ฌธ 150๊ฑด ํฌํ•จ ์ž…๋ ฅ ์•ฝ 160๋งŒยท์ถœ๋ ฅ ์•ฝ 29๋งŒ ํ† ํฐ (์ถ”๊ฐ€ ํ…Œ์ŠคํŠธยท์žฌ์‹œ๋„ ๋ณ„๋„).
  • ์ €์žฅํ•œ ๊ธฐ์‚ฌ: 10/14์— ๋บ๋‹ค๊ฐ€ 10/15 FE ํ™”๋ฉด(๋งˆ์ดํŽ˜์ด์ง€ ํƒญ)์— ๋งž์ถฐ ๋‹ค์‹œ ๋„ฃ์—ˆ๋‹ค. ๋ถ„์•ผ ํŽ˜์ด์ง€์˜ ๊ทผ๊ฑฐ ๊ธฐ์‚ฌ ํ•˜๋‚˜์— ์ €์žฅ ๋ฒ„ํŠผ์ด ๋ถ™๋Š”๋‹ค (5.3~5.6). ํ…Œ์ด๋ธ”์€ V2์—์„œ ์ง€์šฐ๊ณ  V4์—์„œ ๋‹ค์‹œ ๋งŒ๋“ค์—ˆ๋‹ค.

8. ํ›„์† ๋…ผ์˜ ํ•ญ๋ชฉ

  • ํŒ€ AWS ๊ณ„์ •์˜ Nova Lite ํ˜ธ์ถœ ๊ถŒํ•œ ํ™•์ธ โ†’ ํ•œ๊ตญ์–ด ์š”์•ฝ ํ’ˆ์งˆ ๊ฒ€์ฆ ํ›„ ๋ชจ๋ธ ํ™•์ • (4์ฃผ์ฐจ ์ ๊ฒ€ ์ „)
  • FE์™€ ํ•ฉ์˜: ์ƒˆ ๋ถ„์•ผ ์ฝ”๋“œ, ์ฟ ํ‚คยท๊ฐ™์€ ์ถœ์ฒ˜ ๊ตฌ์„ฑ(Nginx /api ํ”„๋ก์‹œ, CloudFront /api/* behavior), ํด๋ง 2์ดˆยทํƒ€์ž„์•„์›ƒ 60์ดˆ
  • IT๊ฐ€ ์•„๋‹Œ ๋‰ด์Šค ์งˆ๋ฌธ(์˜ˆ: ์ •์น˜)์„ ๊ฑฐ์ ˆํ• ์ง€, ๋„ค์ด๋ฒ„ ๊ฒ€์ƒ‰์œผ๋กœ ๋‹ตํ• ์ง€
โš ๏ธ **GitHub.com Fallback** โš ๏ธ