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)ํ ์ง๋ฌธ์ ์ ์ธํ๋ค.