User Flows - Team-likelion-3rd-Project/likelion-devops-7th-3rd-team01 GitHub Wiki

์ƒํƒœ: 1์ฃผ์ฐจ ์ดˆ์•ˆ / API ๊ฒฝ๋กœ๋Š” API Specification ํŽ˜์ด์ง€ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.

1. ๋น„๋กœ๊ทธ์ธ์œผ๋กœ ๋‘˜๋Ÿฌ๋ณด๊ธฐ

ํ™ˆ -> ๋ถ„์•ผ ์นด๋“œ์˜ "๋” ๋ณด๊ธฐ" ๋˜๋Š” ์ด์Šˆ ์ œ๋ชฉ ํด๋ฆญ -> ๋ถ„์•ผ ํŽ˜์ด์ง€ (์ œ๋ชฉ์„ ๋ˆ„๋ฅด๋ฉด ์š”์•ฝยท์ถœ์ฒ˜ยท์›๋ฌธ ๋งํฌ๊ฐ€ ํŽผ์ณ์ง)
  • ์ „์ œ ์กฐ๊ฑด: ๋กœ๊ทธ์ธ ๋ถˆํ•„์š”. ์ ‘์†ํ•˜๋ฉด ๋น„๋กœ๊ทธ์ธ ์ƒํƒœ๋กœ ํ™ˆ์ด ์—ด๋ฆฐ๋‹ค.
  • ํ™ˆ์—์„œ ์ด์Šˆ ์ œ๋ชฉ์„ ๋ˆ„๋ฅด๋ฉด ๋ถ„์•ผ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ฉฐ ๊ทธ ์ด์Šˆ๊ฐ€ ํŽผ์ณ์ง„ ์ƒํƒœ๋กœ ์—ด๋ฆฐ๋‹ค. ํ™ˆ์—๋Š” ํŽผ์น˜๊ธฐ๊ฐ€ ์—†๋‹ค.
  • ์˜ˆ์™ธ ํ๋ฆ„: ์š”์•ฝ ๊ฐฑ์‹ ์— ์‹คํŒจํ•˜๋ฉด ์ง์ „ ์š”์•ฝ์„ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ ์ฃผ๊ณ , generatedAt์ด 1์‹œ๊ฐ„ ๋„˜๊ฒŒ ์ง€๋‚ฌ์œผ๋ฉด ์•ˆ๋‚ด ๋ฌธ๊ตฌ๋ฅผ ๋„์šด๋‹ค. ์•„์ง ์š”์•ฝ์ด ์—†๋Š” ๋ถ„์•ผ๋Š” ๋นˆ ๊ฒฐ๊ณผ ํ™”๋ฉด, ์„œ๋ฒ„ ์˜ค๋ฅ˜๋Š” ์‹คํŒจ ํ™”๋ฉด์„ ๋ณด์—ฌ ์ค€๋‹ค.

2. ์งˆ๋ฌธํ•˜๊ธฐ

ํ•˜๋‹จ ์ž…๋ ฅ์ฐฝ -> ์งˆ๋ฌธ ์ž…๋ ฅ ํ›„ Enter -> ์งˆ๋ฌธ ๊ฒฐ๊ณผ ํ™”๋ฉด (์ฒ˜๋ฆฌ ์ค‘ ํ‘œ์‹œ -> ๋‹ต๊ณผ ์ถœ์ฒ˜ ๋งํฌ)
  • ์ „์ œ ์กฐ๊ฑด: ๋กœ๊ทธ์ธ ์ƒํƒœ. ์งˆ๋ฌธ์€ ์ „์†ก ์ฆ‰์‹œ ์ ‘์ˆ˜ยท๊ธฐ๋ก๋œ๋‹ค.
  • ํ™”๋ฉด์ด 2์ดˆ๋งˆ๋‹ค ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ณ , 60์ดˆ๊ฐ€ ๋„˜์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ์˜ˆ์™ธ ํ๋ฆ„: ๋น„๋กœ๊ทธ์ธ์ด๋ฉด ํ๋ฆ„ 3์œผ๋กœ ์ด๋™. ๋นˆ ์งˆ๋ฌธยท500์ž ์ดˆ๊ณผ๋Š” ์ž…๋ ฅ ์˜ค๋ฅ˜ ์•ˆ๋‚ด. ํ•˜๋ฃจ 10ํšŒ(์‹คํŒจํ•œ ์งˆ๋ฌธ์€ ์ œ์™ธ)๋ฅผ ๋„˜๊ธฐ๋ฉด ํšŸ์ˆ˜ ์ดˆ๊ณผ ์•ˆ๋‚ด. ๋‰ด์Šค์™€ ๋ฌด๊ด€ํ•œ ์งˆ๋ฌธ์€ ๊ฑฐ์ ˆ ์•ˆ๋‚ด, AI ์˜ค๋ฅ˜ยท์‹œ๊ฐ„ ์ดˆ๊ณผ๋Š” ์‹คํŒจ ์•ˆ๋‚ด.

3. ๋กœ๊ทธ์ธยท๊ฐ€์ž…

๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ๋™์ž‘ (์งˆ๋ฌธ ์ „์†ก, ๋งˆ์ดํŽ˜์ด์ง€, ์งˆ๋ฌธ ์ €์žฅ) -> ๋กœ๊ทธ์ธ ํŒ์—…์—์„œ ๋กœ๊ทธ์ธ ๋˜๋Š” ๊ฐ€์ž… -> ํ•˜๋ ค๋˜ ๋™์ž‘ ์ด์–ด์„œ ์ง„ํ–‰
  • ์ „์ œ ์กฐ๊ฑด: ๋น„๋กœ๊ทธ์ธ ์ƒํƒœ. ์ž…๋ ฅ์ฐฝ์— ๊ธ€์ž๋ฅผ ์“ฐ๋Š” ๊ฒƒ๊นŒ์ง€๋Š” ๋กœ๊ทธ์ธ ์—†์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํŒ์—…์ด ๋– ๋„ ์“ฐ๋˜ ์งˆ๋ฌธ์€ ์œ ์ง€๋œ๋‹ค.
  • ๋กœ๊ทธ์ธ ํ›„ ํ—ค๋” ๋ฒ„ํŠผ์ด ๋กœ๊ทธ์•„์›ƒ์œผ๋กœ ๋ฐ”๋€๋‹ค. ์•ฑ ์‹œ์ž‘ ์‹œ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด ํ—ค๋”๋ฅผ ๊ทธ๋ฆฐ๋‹ค.
  • ์˜ˆ์™ธ ํ๋ฆ„: ์ด๋ฉ”์ผยท๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถˆ์ผ์น˜, ์ด๋ฏธ ๊ฐ€์ž…๋œ ์ด๋ฉ”์ผ, ์ž…๋ ฅ ํ˜•์‹ ์˜ค๋ฅ˜๋Š” ํŒ์—… ์•ˆ์—์„œ ์•ˆ๋‚ด. ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด(24์‹œ๊ฐ„) ๊ฐ™์€ ํŒ์—…์ด ๋œฌ๋‹ค.

4. ์งˆ๋ฌธ ์ €์žฅ

์งˆ๋ฌธ ๊ฒฐ๊ณผ ํ™”๋ฉด -> ๋ณ„ ๋ฒ„ํŠผ ๋ˆ„๋ฆ„ -> ์ €์žฅํ•œ ์งˆ๋ฌธ ๋ชฉ๋ก์— ์ถ”๊ฐ€ (๋‹ค์‹œ ๋ˆ„๋ฅด๋ฉด ํ•ด์ œ)
  • ์ „์ œ ์กฐ๊ฑด: ๋กœ๊ทธ์ธ ์ƒํƒœ.
  • ์˜ˆ์™ธ ํ๋ฆ„: ๋น„๋กœ๊ทธ์ธ์ด๋ฉด ํ๋ฆ„ 3์œผ๋กœ ์ด๋™. ์ €์žฅ ์‹คํŒจ ์‹œ ๋ณ„ ์ƒํƒœ๋ฅผ ๋˜๋Œ๋ฆฌ๊ณ  ์•ˆ๋‚ดํ•œ๋‹ค.

5. ์ฒ˜๋ฆฌ ์ค‘์— ๋‹ค๋ฅธ ํ™”๋ฉด์œผ๋กœ ์ด๋™

์งˆ๋ฌธ ๊ฒฐ๊ณผ (์ฒ˜๋ฆฌ ์ค‘) -> ํ™ˆยท๋ถ„์•ผ ํŽ˜์ด์ง€ ๋“ฑ ๋‹ค๋ฅธ ํ™”๋ฉด์œผ๋กœ ์ด๋™ -> ๋งˆ์ดํŽ˜์ด์ง€ ์งˆ๋ฌธ ๊ธฐ๋ก์—์„œ ์ด์–ด์„œ ํ™•์ธ
  • ์ „์ œ ์กฐ๊ฑด: ๋กœ๊ทธ์ธ ์ƒํƒœ. ์งˆ๋ฌธ์€ ์ „์†ก ์ฆ‰์‹œ ๊ธฐ๋ก๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ™”๋ฉด์„ ๋– ๋‚˜๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.
  • ์˜ˆ์™ธ ํ๋ฆ„: ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์งˆ๋ฌธ ๊ธฐ๋ก์—์„œ ์‹คํŒจ ์ƒํƒœ๋กœ ๋ณด์ธ๋‹ค.

6. ๋งˆ์ดํŽ˜์ด์ง€

๋งˆ์ดํŽ˜์ด์ง€ -> ํƒญ ์ „ํ™˜ (์งˆ๋ฌธ ๊ธฐ๋ก / ์ €์žฅํ•œ ์งˆ๋ฌธ / ์ €์žฅํ•œ ๊ธฐ์‚ฌ(ํ›„๋ณด)) -> ํ•ญ๋ชฉ ํด๋ฆญ ์‹œ ์งˆ๋ฌธ ๊ฒฐ๊ณผ, ์‚ญ์ œ ๋ฒ„ํŠผ์œผ๋กœ ๊ธฐ๋ก ์‚ญ์ œ
  • ์ „์ œ ์กฐ๊ฑด: ๋กœ๊ทธ์ธ ์ƒํƒœ. ๋ชฉ๋ก์€ ์ตœ์‹ ์ˆœ์ด๋‹ค.
  • ์งˆ๋ฌธ ๊ธฐ๋ก์„ ์‚ญ์ œํ•˜๋ฉด ์ €์žฅํ•œ ์งˆ๋ฌธ์—์„œ๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค.
  • ์ €์žฅํ•œ ๊ธฐ์‚ฌ๋Š” ํ›„๋ณด ๊ธฐ๋Šฅ์œผ๋กœ, ์ผ์ •์— ์—ฌ์œ ๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ์˜ˆ์™ธ ํ๋ฆ„: ๋ชฉ๋ก์ด ๋น„์–ด ์žˆ์œผ๋ฉด ๋นˆ ๊ฒฐ๊ณผ ํ™”๋ฉด, ๋น„๋กœ๊ทธ์ธ์ด๋ฉด ํ๋ฆ„ 3์œผ๋กœ ์ด๋™.

ํ™”๋ฉด ๋ชฉ๋ก

ํ™”๋ฉด ์ฃผ์†Œ ๋กœ๊ทธ์ธ ์„ค๋ช…
๊ณตํ†ต ํ—ค๋” ๋ชจ๋“  ํ™”๋ฉด - ๊ฐ€์šด๋ฐ ์„œ๋น„์Šค ์ด๋ฆ„(๋ˆ„๋ฅด๋ฉด ํ™ˆ), ์˜ค๋ฅธ์ชฝ ๋งˆ์ดํŽ˜์ด์ง€ยท๋กœ๊ทธ์ธ(๋กœ๊ทธ์ธ ํ›„ ๋กœ๊ทธ์•„์›ƒ)
๊ณตํ†ต ํ•˜๋‹จ ์ž…๋ ฅ์ฐฝ ๋ชจ๋“  ํ™”๋ฉด ๊ธ€์“ฐ๊ธฐ ๋ถˆํ•„์š”, ์ „์†ก ํ•„์š” Enter ์ „์†ก, Shift+Enter ์ค„๋ฐ”๊ฟˆ
ํ™ˆ / ๋ถˆํ•„์š” ๋ถ„์•ผ ์นด๋“œ 6์žฅ, ์นด๋“œ๋งˆ๋‹ค ์ด์Šˆ ์ œ๋ชฉ 3๊ฐœ์™€ "๋” ๋ณด๊ธฐ"
๋ถ„์•ผ ํŽ˜์ด์ง€ /category/{๋ถ„์•ผ์ฝ”๋“œ} (?open={์ด์ŠˆID}) ๋ถˆํ•„์š” ์ด์Šˆ ๋ชฉ๋ก, ์ œ๋ชฉ์„ ๋ˆ„๋ฅด๋ฉด ํŽผ์นจ, ๋ถ„์•ผ ์ด๋™ ๋ฒ„ํŠผ ์ค„
์งˆ๋ฌธ ๊ฒฐ๊ณผ /questions/{id} ํ•„์š” ๋‚ด ์งˆ๋ฌธ, ์ฒ˜๋ฆฌ ์ค‘ ํ‘œ์‹œ, ๋‹ต๊ณผ ์ถœ์ฒ˜, ์ €์žฅ(๋ณ„) ๋ฒ„ํŠผ
๋งˆ์ดํŽ˜์ด์ง€ /mypage ํ•„์š” ์งˆ๋ฌธ ๊ธฐ๋ก / ์ €์žฅํ•œ ์งˆ๋ฌธ / ์ €์žฅํ•œ ๊ธฐ์‚ฌ(ํ›„๋ณด) ํƒญ
๋กœ๊ทธ์ธยท๊ฐ€์ž… ํŒ์—… ํŒ์—… - ๋กœ๊ทธ์ธ๊ณผ ๊ฐ€์ž… ์ „ํ™˜

๋ชจ๋“  ํ™”๋ฉด์€ ๋กœ๋”ฉ, ์„ฑ๊ณต, ๋นˆ ๊ฒฐ๊ณผ, ์‹คํŒจ 4์ƒํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค. ๋ถ„์•ผ๋Š” ์ •์น˜, ๊ฒฝ์ œ, ์‚ฌํšŒ, ์ƒํ™œ/๋ฌธํ™”, IT/๊ณผํ•™, ์Šคํฌ์ธ  6๊ฐœ๋กœ ๊ณ ์ •์ด๋‹ค.

ํ™”๋ฉด โ†” API ๋งคํ•‘ํ‘œ

๋กœ๊ทธ์ธ ํ•„์š” API๊ฐ€ 401(UNAUTHORIZED)์„ ์ฃผ๋ฉด ๋กœ๊ทธ์ธ ํŒ์—…์„ ๋„์šด๋‹ค. ๋ชจ๋“  ์š”์ฒญ์€ credentials: 'include'๋กœ ํ˜ธ์ถœํ•œ๋‹ค.

ํ™”๋ฉด ๋™์ž‘ API ํ™”๋ฉด์—์„œ ์“ฐ๋Š” ์‘๋‹ตยท์˜ค๋ฅ˜
์•ฑ ์‹œ์ž‘(ํ—ค๋”) ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ํ™•์ธ GET /api/auth/me 200 ๋‹‰๋„ค์ž„ ํ‘œ์‹œ / 401 ๋น„๋กœ๊ทธ์ธ
๋กœ๊ทธ์ธ ํŒ์—… ๊ฐ€์ž… POST /api/auth/signup 201 ๊ฐ€์ž… ์ฆ‰์‹œ ๋กœ๊ทธ์ธ / 400 VALIDATION_ERROR / 409 DUPLICATE_EMAIL
๋กœ๊ทธ์ธ ํŒ์—… ๋กœ๊ทธ์ธ POST /api/auth/login 200 / 401 INVALID_CREDENTIALS
ํ—ค๋” ๋กœ๊ทธ์•„์›ƒ POST /api/auth/logout 204
ํ™ˆ ๋ถ„์•ผ ์นด๋“œ 6์žฅ GET /api/news/home categories[].issues[], mock(์ƒ˜ํ”Œ ๋ ), generatedAt
๋ถ„์•ผ ํŽ˜์ด์ง€ ์ด์Šˆ ๋ชฉ๋กยทํŽผ์น˜๊ธฐ GET /api/news/categories/{category} issues[](์š”์•ฝ, sources[]), mock / 404 NOT_FOUND
ํ•˜๋‹จ ์ž…๋ ฅ์ฐฝ ์งˆ๋ฌธ ์ „์†ก POST /api/questions 202 questionId / 400 VALIDATION_ERROR / 429 RATE_LIMIT_EXCEEDED
์งˆ๋ฌธ ๊ฒฐ๊ณผ ์ƒํƒœยท๋‹ต ํ™•์ธ (2์ดˆ ํด๋ง) GET /api/questions/{id} status, answer, sources[], saved / 404 NOT_FOUND
์งˆ๋ฌธ ๊ฒฐ๊ณผ ์ €์žฅ / ํ•ด์ œ PUT / DELETE /api/questions/{id}/saved 204
๋งˆ์ดํŽ˜์ด์ง€ ์งˆ๋ฌธ ๊ธฐ๋ก ๋ชฉ๋ก GET /api/mypage/questions?page=0 questions[], hasNext
๋งˆ์ดํŽ˜์ด์ง€ ์งˆ๋ฌธ ์‚ญ์ œ DELETE /api/questions/{id} 204
๋งˆ์ดํŽ˜์ด์ง€ ์ €์žฅํ•œ ์งˆ๋ฌธ ๋ชฉ๋ก GET /api/mypage/saved-questions?page=0 ์งˆ๋ฌธ ๊ธฐ๋ก๊ณผ ๊ฐ™์€ ํ˜•์‹
๋งˆ์ดํŽ˜์ด์ง€ (ํ›„๋ณด) ๊ธฐ์‚ฌ ์ €์žฅยท๋ชฉ๋กยท์‚ญ์ œ /api/mypage/saved-articles ํ›„๋ณด ๊ธฐ๋Šฅ

์งˆ๋ฌธ ์ƒํƒœ๋ณ„ ํ™”๋ฉด: PENDINGยทPROCESSING ์ฒ˜๋ฆฌ ์ค‘ / COMPLETED ๋‹ต๊ณผ ๊ทผ๊ฑฐ ๊ธฐ์‚ฌ / REJECTED ๊ฑฐ์ ˆ ์•ˆ๋‚ด / FAILED ์‹คํŒจ ์•ˆ๋‚ด.

๊ฒฐ์ • ์‚ฌํ•ญ

  • ํ™”๋ฉด์€ ์ •์  ํ”„๋ก ํŠธ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. React SPA๋ฅผ ๋นŒ๋“œํ•œ ์ •์  ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋ฐฐํฌํ•œ๋‹ค.
  • ์˜จํ”„๋ ˜: Nginx๊ฐ€ ํ™”๋ฉด์„ ์„œ๋น™ํ•˜๊ณ  /api/*๋ฅผ ๋ฐฑ์—”๋“œ๋กœ ํ”„๋ก์‹œํ•œ๋‹ค(๊ฐ™์€ ์ถœ์ฒ˜, CORS ๋ถˆํ•„์š”).
  • AWS: ํ™”๋ฉด์€ app.{๋„๋ฉ”์ธ} โ†’ CloudFront + S3, API๋Š” api.{๋„๋ฉ”์ธ} โ†’ ALB. ๊ฐ™์€ ์‚ฌ์ดํŠธ(๊ฐ™์€ ์ƒ์œ„ ๋„๋ฉ”์ธ)์ด๊ณ  CORS๋กœ ํ™”๋ฉด ์ฃผ์†Œ๋งŒ ํ—ˆ์šฉํ•˜๋ฉฐ credentials๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค(API ๋ช…์„ธ ๊ณตํ†ต ๊ทœ์น™).
  • ํ™˜๊ฒฝ๋ณ„ API ์ฃผ์†Œ: api.js์—์„œ ์˜จํ”„๋ ˜์€ /api, AWS๋Š” https://api.{๋„๋ฉ”์ธ}์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.
  • SPA์šฉ index.html ๋Œ€์ฒด ์„ค์ •์€ ํ™”๋ฉด ๋ฐฐํฌ(Nginx, CloudFront)์—๋งŒ ์ ์šฉํ•œ๋‹ค. CloudFront๊ฐ€ ํ™”๋ฉด ํŒŒ์ผ๋งŒ ๋‹ค๋ฃจ๋ฏ€๋กœ API์˜ 404 ์‘๋‹ต์„ ๋ฎ์–ด์“ธ ๊ฑฑ์ •์ด ์—†๋‹ค.
  • ๋ถ„์•ผ ํŽ˜์ด์ง€์˜ ์ด์Šˆ๋Š” ๋ถ„์•ผ๋‹น ์ตœ๋Œ€ 5๊ฐœ์ด๊ณ , ํ™ˆ์—๋Š” ๊ทธ์ค‘ 1~3๋ฒˆ์งธ ์ œ๋ชฉ๋งŒ ๋ณด์—ฌ ์ค€๋‹ค.
  • ๊ฐฑ์‹  ์ง€์—ฐ ์•ˆ๋‚ด: ์‘๋‹ต์— ๋ณ„๋„ ๊ฐ’์ด ์—†๊ณ , generatedAt์ด 1์‹œ๊ฐ„ ๋„˜๊ฒŒ ์ง€๋‚ฌ์œผ๋ฉด "๋‰ด์Šค ๊ฐฑ์‹ ์ด ์ง€์—ฐ๋˜๊ณ  ์žˆ์–ด์š”" ์•ˆ๋‚ด๋ฅผ ๋„์šด๋‹ค(ํ™ˆ, ๋ถ„์•ผ ํŽ˜์ด์ง€ ๊ณตํ†ต).
  • ํ•˜๋ฃจ ์งˆ๋ฌธ 10ํšŒ ์ œํ•œ์€ ๊ฑฐ์ ˆ(REJECTED)๋œ ์งˆ๋ฌธ์€ ํฌํ•จํ•˜๊ณ  ์‹คํŒจ(FAILED)ํ•œ ์งˆ๋ฌธ์€ ์ œ์™ธํ•œ๋‹ค.