#๏ธโฃ ์์ฒญ ์ ํ
ํด๋น๋๋ ํญ๋ชฉ์ ์ ํํด์ฃผ์ธ์.
#๏ธโฃ ๊ธฐ๋ฅ ๊ฐ์ (Summary)
๊ธฐ๋ฅ์ ๋ํ ์ค๋ช
: ๋ฌด์์, ์ ๋ง๋๋์?
- ๊ธฐ๋ฅ(What): ์ถ์ ์ถ์ฒ/๊ฒ์ ๋ฐ ์์ธ ์ ๋ณด(ํ์ํ
์ด๋ธ ํฌํจ) ์กฐํ API ๊ตฌํ
- ์ด์ (Why): ์ฌ์ฉ์๊ฐ ๋ ์ง์ ์กฐ๊ฑด์ ๋ง๋ ์ถ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ํ๊ณ , ํน์ ์ถ์ ์ ์ธ๋ถ ์ผ์ ์ ํ์ธํ์ฌ ๋ฐฉ๋ฌธ ๊ณํ์ ์๋ฆฝํ ์ ์๋๋ก ํ๊ธฐ ์ํจ์
๋๋ค. ํนํ ๋๊ท๋ชจ ์ถ์ ๋ฐ์ดํฐ ์กฐํ ์ ๋ฐ์ํ ์ ์๋ ์์คํ
๋ถํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ณ ์ฑ๋ฅ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ๋์
ํฉ๋๋ค.
#๏ธโฃ ๊ธฐ์ ์ ์ค๊ณ
ํต์ฌ ๋ก์ง์ด๋ DB ๋ณ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ์๋ง ์์ฑํด์ฃผ์ธ์ (ํ์ํ๋ค๋ฉด ์๋ต ๊ฐ๋ฅ)
- ๋์ API:
GET /festivals/recommendations
GET /festivals
GET /festivals/{festivalId}
GET /festivals/{festivalId}/timetables
- ํต์ฌ ๋ก์ง (Key Logic):
- Cursor-based Paging:
OFFSET ๊ธฐ๋ฐ ํ์ด์ง์ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ง์ง๋ง ์กฐํ๋ festivalId๋ฅผ ์ปค์๋ก ์ฌ์ฉํ์ฌ ์กฐํ ์ฑ๋ฅ ์ต์ ํ.
- Join ์ ํํฐ๋ง (Inline View): ์ถ์ ๋ชฉ๋ก ์กฐํ ์, ๋๋์ ๋ฐ์ดํฐ Join ์ ์ธ๋ผ์ธ ๋ทฐ(์๋ธ์ฟผ๋ฆฌ)๋ฅผ ํตํด ์กฐ๊ฑด์ ๋ง๋ ID๋ฅผ ์ฐ์ ์ถ์ถํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ถํ ์ต์ํ.
- ๋์ ํํฐ๋ง: ๋ ์ง๋ณ ์ถ์ฒ ๋ฐ ํค์๋ ๊ฒ์ ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ ๋์ WHERE ์ ๊ตฌ์ฑ.
#๏ธโฃ ์์
์์ธ ๋ด์ฉ (To-Do)
๐ ์ฐธ๊ณ ํ ๋งํ ์๋ฃ (Optional)
์คํฌ๋ฆฐ์ท, ๊ด๋ จ ๋ฌธ์, ์ฝ๋ ์์ ๋ฑ
#๏ธโฃ ์์ฒญ ์ ํ
#๏ธโฃ ๊ธฐ๋ฅ ๊ฐ์ (Summary)
#๏ธโฃ ๊ธฐ์ ์ ์ค๊ณ
GET /festivals/recommendationsGET /festivalsGET /festivals/{festivalId}GET /festivals/{festivalId}/timetablesOFFSET๊ธฐ๋ฐ ํ์ด์ง์ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ง์ง๋ง ์กฐํ๋festivalId๋ฅผ ์ปค์๋ก ์ฌ์ฉํ์ฌ ์กฐํ ์ฑ๋ฅ ์ต์ ํ.#๏ธโฃ ์์ ์์ธ ๋ด์ฉ (To-Do)
GET /festivals/recommendations: ์กฐ๊ฑด/๋ ์ง๋ณ ์ถ์ฒ ์ถ์ 5๊ฐ ์กฐํ ๋ก์ง ๊ตฌํGET /festivals: ์ปค์ ํ์ด์ง์ด ์ ์ฉ๋ ์ถ์ ํตํฉ ๊ฒ์ API ๊ตฌํGET /festivals/{festivalId}: ์ถ์ ์์ธ ์ ๋ณด ์กฐํ API ๊ตฌํGET /festivals/{festivalId}/timetables: ์ถ์ ๋ณ ํ์ํ ์ด๋ธ(์ผ์ ) ์กฐํ ๊ธฐ๋ฅ ๊ตฌํ๐ ์ฐธ๊ณ ํ ๋งํ ์๋ฃ (Optional)