API Specification - Team-likelion-3rd-Project/likelion-devops-7th-3rd-team01 GitHub Wiki
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ์๋น์ค | 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), APIapi.{๋๋ฉ์ธ}(ALB). Route 53 ๋๋ฉ์ธ ์ฌ์ฉ - AWS์ ๋ก์ปฌ ๊ฐ๋ฐ(FE dev ์๋ฒ โ
localhost:8080)์์๋ CORS๋ก ํ๋ฉด ์ฃผ์๋ง ํ์ฉํ๊ณAccess-Control-Allow-Credentials: true๋ฅผ ์ค๋ค.
- ์จํ๋ ๋ฏธ์ค: Nginx๊ฐ
- ๋ก์ปฌ(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 |
๊ณผํ |
| ๋ฉ์๋ | ๊ฒฝ๋ก | ์ฉ๋ |
|---|---|---|
| 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๊ฐ ํธ๋ํฝ์์ ๋น ์ง๋ฉด ์ ๋๋ค.
๊ฐ์ ์ฆ์ ๋ก๊ทธ์ธ ์ํ๊ฐ ๋๋ค (์ฟ ํค ๋ฐ๊ธ). ๋ก๊ทธ์ธ ํ์ ์์ ๊ฐ์ ํ ํ๋ ค๋ ๋์์ ๋ฐ๋ก ์ด์ด๊ฐ๊ธฐ ์ํจ.
์์ฒญ
| ํ๋ผ๋ฏธํฐ | ์์น | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|---|
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 |
์ด๋ฏธ ๊ฐ์ ๋ ์ด๋ฉ์ผ |
์์ฒญ
| ํ๋ผ๋ฏธํฐ | ์์น | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|---|
email |
body | String | Y | ์ด๋ฉ์ผ |
password |
body | String | Y | ๋น๋ฐ๋ฒํธ |
์๋ต (200 OK) + Set-Cookie: ACCESS_TOKEN=...
{
"userId": 1,
"email": "[email protected]",
"nickname": "์ฉ๋ฏผ"
}| ์ํ | code | ์ํฉ |
|---|---|---|
| 401 | INVALID_CREDENTIALS |
์ด๋ฉ์ผ ๋๋ ๋น๋ฐ๋ฒํธ ๋ถ์ผ์น |
์ฟ ํค๋ฅผ ์ญ์ ํ๋ค. ๋ก๊ทธ์ธ ์ํ๊ฐ ์๋์ด๋ ํญ์ ์ฑ๊ณตํ๋ค.
์๋ต (204 No Content) + Set-Cookie: ACCESS_TOKEN=; Max-Age=0; Path=/
httpOnly ์ฟ ํค๋ JS์์ ์ฝ์ ์ ์์ผ๋ฏ๋ก, FE๋ ์ฑ ์์ ์ ์ด API๋ก ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ๋จํด ํค๋ ๋ฒํผ(๋ก๊ทธ์ธ/๋ก๊ทธ์์)์ ๊ทธ๋ฆฐ๋ค.
์๋ต (200 OK)
{
"userId": 1,
"email": "[email protected]",
"nickname": "์ฉ๋ฏผ"
}์๋ต (401) UNAUTHORIZED โ ๋น๋ก๊ทธ์ธ ์ํ๋ก ์ฒ๋ฆฌ
์์ฝ์ ์๋ฒ๊ฐ 30๋ถ๋ง๋ค ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๋ค. ์กฐํ API๋ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ง ๋๋ ค์ฃผ๋ฏ๋ก AI๋ฅผ ํธ์ถํ์ง ์๋๋ค. ๊ฐฑ์ ์ ์คํจํ๋ฉด ์ง์ ์์ฝ์ ๊ทธ๋๋ก ๋๋ ค์ค๋ค.
- ์๋ต์ Redis์ ์บ์ํ๋ค (์บ์ ์ฐ์ , ์์ผ๋ฉด DB, TTL 30๋ถ). ์์ฝ ๋ฐฐ์น๊ฐ ๋๋๋ฉด ์บ์๋ฅผ ๋น์ฐ๋ฏ๋ก ์ ์์ฝ์ ๋ฐ๋ก ๋ณด์ธ๋ค.
- Redis๊ฐ ์ฃฝ์ด๋ DB์์ ์ฝ์ด ์ ์ ์๋ตํ๋ค (์๋ต ์๊ฐ๋ง ๋์ด๋จ).
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๋ ๊ฐ์)
์์ฒญ
| ํ๋ผ๋ฏธํฐ | ์์น | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|---|
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 ๋ฑ ํฌํจ) |
-
POST๋ก ์ง๋ฌธ์ ๋ณด๋ด๋ฉด DB์PENDING์ผ๋ก ์ฆ์ ๊ธฐ๋กํ๊ณ , Redis ๋๊ธฐ์ด์ ์ง๋ฌธ ID๋ฅผ ๋ฃ์ ๋ค202๋ฅผ ๋ฐํํ๋ค. - ์์ปค(๋ณ๋ Deployment, ๋๊ธฐ์ด ๊ธธ์ด์ ๋ฐ๋ผ KEDA๋ก ํ์ฅ)๊ฐ ๋๊ธฐ์ด์์ ์ง๋ฌธ์ ๊บผ๋ด
PENDINGโPROCESSING์ผ๋ก ๋ฐ๊พธ๊ณ (์ด๋ฏธ ๋ค๋ฅธ ์์ปค๊ฐ ๋ฐ๊ฟจ์ผ๋ฉด ๊ฑด๋๋), ๊ด๋ จ ๊ธฐ์ฌ๋ฅผ ์ฐพ์ AI๋ก ๋ต์ ๋ง๋ ๋ค.- Redis ์ฅ์ ์ ํ์ผ๋ก ๋๊ธฐ์ด ํญ๋ชฉ์ด ์ฌ๋ผ์ง ์ ์์ผ๋ฏ๋ก, 30์ด ๋๊ฒ
PENDING์ธ ์ง๋ฌธ์ ์๋ฒ๊ฐ ๋๊ธฐ์ด์ ๋ค์ ๋ฃ๋๋ค. ์ง๋ฌธ์ ์ค์ ์ํ๋ ํญ์ DB๊ฐ ๊ธฐ์ค์ด๋ค.
- Redis ์ฅ์ ์ ํ์ผ๋ก ๋๊ธฐ์ด ํญ๋ชฉ์ด ์ฌ๋ผ์ง ์ ์์ผ๋ฏ๋ก, 30์ด ๋๊ฒ
- ๊ฒฐ๊ณผ์ ๋ฐ๋ผ
COMPLETED/REJECTED(๋ด์ค์ ๋ฌด๊ดํ ์ง๋ฌธ) /FAILED๋ก ๋ฐ๋๋ค. - FE๋
GET /api/questions/{id}๋ฅผ 2์ด ๊ฐ๊ฒฉ์ผ๋ก ํด๋งํ๋ค. ์ฒ๋ฆฌ ์ค ๋ค๋ฅธ ํ๋ฉด์ผ๋ก ๊ฐ๋ ๋ง์ดํ์ด์ง์์ ์ด์ด์ ๋ณผ ์ ์๋ค. - 60์ด ๋๊ฒ ๋๋์ง ์์ ์ง๋ฌธ์ ์๋ฒ๊ฐ
FAILED๋ก ๋ฐ๊พผ๋ค.
| status | ์๋ฏธ | FE ํ์ |
|---|---|---|
PENDING |
์ ์๋จ, ๋๊ธฐ ์ค | ์ฒ๋ฆฌ ์ค |
PROCESSING |
AI ์ฒ๋ฆฌ ์ค | ์ฒ๋ฆฌ ์ค |
COMPLETED |
๋ต ์์ฑ ์๋ฃ | ๋ต + ๊ทผ๊ฑฐ ๊ธฐ์ฌ |
REJECTED |
๋ด์ค์ ๋ฌด๊ดํ ์ง๋ฌธ | ๊ฑฐ์ ์๋ด (answer์ ์๋ด ๋ฌธ๊ตฌ) |
FAILED |
์ฒ๋ฆฌ ์คํจ (AI ์ค๋ฅยทํ์์์) | ์คํจ ์๋ด |
์์ฒญ
| ํ๋ผ๋ฏธํฐ | ์์น | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|---|
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)ํ ์ง๋ฌธ์ ์ ์ธ) |
์๋ต (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) |
์ง๋ฌธ์ ์ญ์ ํ๋ค. ์ ์ฅํ ์ง๋ฌธ์์๋ ํจ๊ป ์ฌ๋ผ์ง๋ค.
์๋ต (204 No Content)
| ์ํ | code | ์ํฉ |
|---|---|---|
| 404 | NOT_FOUND |
์๋ ์ง๋ฌธ ๋๋ ๋ค๋ฅธ ์ฌ์ฉ์์ ์ง๋ฌธ |
์ฌ๋ฌ ๋ฒ ํธ์ถํด๋ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๋ค (์ด๋ฏธ ์ ์ฅ๋ ์ง๋ฌธ์ด๋ฉด ๊ทธ๋๋ก ์ฑ๊ณต).
์๋ต (204 No Content)
์๋ต (204 No Content)
4.4ยท4.5 ๊ณตํต ์ค๋ฅ: 404 NOT_FOUND (์๋ ์ง๋ฌธ ๋๋ ๋ค๋ฅธ ์ฌ์ฉ์์ ์ง๋ฌธ)
๋ง์ดํ์ด์ง๋ ์ง๋ฌธ ๊ธฐ๋ก, ์ ์ฅํ ์ง๋ฌธ, ์ ์ฅํ ๊ธฐ์ฌ ์ธ ๊ตฌ์ญ์ด๋ค. ๋ชฉ๋ก์ ์ต์ ์. ํ์ด์ง ํฌ๊ธฐ๋ ๊ณ ์ (size=20), page๋ 0๋ถํฐ.
์๋ต (200 OK)
{
"questions": [
{
"questionId": 123,
"query": "์์ฆ AI ๋ฐ๋์ฒด ์์ฅ ์ด๋?",
"status": "COMPLETED",
"saved": true,
"createdAt": "2026-10-14T11:00:00+09:00"
}
],
"hasNext": false
}์๋ต ํํ๋ 5.1๊ณผ ๊ฐ๊ณ , saved: true์ธ ์ง๋ฌธ๋ง ์ ์ฅํ ์์(์ต์ ์)๋ก ์ค๋ค. ์์ธ๋ GET /api/questions/{id}๋ก ๋ณธ๋ค.
๋ถ์ผ ํ์ด์ง์ ๊ทผ๊ฑฐ ๊ธฐ์ฌ(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)๊ฐ ์๋ ์ฃผ์ |
url์ URL ์ธ์ฝ๋ฉํด์ ๋ณด๋ธ๋ค (encodeURIComponent).
์๋ต (204 No Content)
| ์ํ | code | ์ํฉ |
|---|---|---|
| 404 | NOT_FOUND |
์ ์ฅํ์ง ์์ ๊ธฐ์ฌ |
๋ถ์ผ ํ์ด์ง์์ ๊ทผ๊ฑฐ ๊ธฐ์ฌ๋ง๋ค ์ ์ฅ ๋ฒํผ์ ์ฑ์ ๊ทธ๋ฆด์ง ํ๋จํ ๋ ์ด๋ค. ๋ถ์ผ ์๋ต์ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๊ฐ์ด ์ฐ๋ ์บ์๋ผ ์ฌ์ฉ์๋ณ ์ ์ฅ ์ฌ๋ถ๋ฅผ ๋ฃ์ง ์๋๋ค.
์๋ต (200 OK)
{ "urls": ["https://www.etnews.com/20261014000001"] }์ต๊ทผ์ ์ ์ฅํ ์.
์๋ต (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
}| ์ํ | 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.
-
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์์ ๋ค์ ๋ง๋ค์๋ค.
- ํ AWS ๊ณ์ ์ Nova Lite ํธ์ถ ๊ถํ ํ์ธ โ ํ๊ตญ์ด ์์ฝ ํ์ง ๊ฒ์ฆ ํ ๋ชจ๋ธ ํ์ (4์ฃผ์ฐจ ์ ๊ฒ ์ )
- FE์ ํฉ์: ์ ๋ถ์ผ ์ฝ๋, ์ฟ ํคยท๊ฐ์ ์ถ์ฒ ๊ตฌ์ฑ(Nginx
/apiํ๋ก์, CloudFront/api/*behavior), ํด๋ง 2์ดยทํ์์์ 60์ด - IT๊ฐ ์๋ ๋ด์ค ์ง๋ฌธ(์: ์ ์น)์ ๊ฑฐ์ ํ ์ง, ๋ค์ด๋ฒ ๊ฒ์์ผ๋ก ๋ตํ ์ง