์คํ๋ฒ ์ค ์ฑ๊ณผ ๋ฐฑ์๋๊ฐ ๋์์ ๊ฐ๋ฐ๋ ๋, ํตํฉ ๊ท๊ฒฉ์ด ๋ฆ๊ฒ ํ์ ๋๊ฑฐ๋ ๋ฌธ์ํ๋์ด๋ ๊ณง๋ฐ๋ก ์ค์ ์๋ฒ๋ฅผ ๋์ ํ ์คํธํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ์ด ๊ณผ์ ์์ ์ฑ ๊ฐ๋ฐ์๋ โ์๋ฒ๊ฐ ์์ง ์ค๋น๋์ง ์์์โ ๋ฐ๋ณต ๊ฒ์ฆ์ด ์ง์ฐ๋๊ฑฐ๋, ๋ค๋ฆ๊ฒ ์๋ฒ ์ชฝ์์ ๊ตฌํ ๋ถ๊ฐ ์ฌ์ ๊ฐ ๋์ ์ ์ฒด ์ผ์ ์ด ํฌ๊ฒ ์ด๊ธ๋๋ ๊ฒฝ์ฐ๊ฐ ์ฆ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์ค์ ์๋ฒ ๋์ ์ธ์ ๋ ์ฌ์ฉํ ์ ์๋ Mock API ์๋ฒ์ ์ด๋ฅผ ๊ด๋ฆฌยท๋ฑ๋กํ ์ ์๋ Admin UI๋ฅผ ๊ตฌ์ถํ์ต๋๋ค.
-
๋ชฉํ
Android ์ฑ ํ ์คํธ์ฉ Mock API ์๋ฒ์, ์ด๋ฅผ ๊ด๋ฆฌยท๋ฑ๋กํ ์ ์๋ ์น UI ๊ตฌ์ถ -
ํต์ฌ ๊ธฐ๋ฅ
- ๋์ ๋ผ์ฐํธ ๋ฑ๋ก
Method + Path โ Status + JSON ์๋ต์ UI์์ ์ฆ์ ๋ฑ๋กยท์์ ยท์ญ์ - ์ฑ ์ฐ๋
๋ฑ๋ก๋ ๋๋กํธ์ถhttps://๋น๋ฐ์ ๋๋น~/{path} - ๊ด๋ฆฌ UI
์์ ๋ชจ๋ ๋ผ์ฐํธ ๊ด๋ฆฌ
https://๋น๋ฐ์ ๋๋น~
- ๋์ ๋ผ์ฐํธ ๋ฑ๋ก
| ์ปดํฌ๋ํธ | ์คํ | ์ ํ ์ด์ |
|---|---|---|
| Backend | Node.js + Express + Lowdb | - ๋น ๋ฅธ ํ๋กํ ํ์ดํ - ๋ณ๋ DB ์๋ฒ ๋ถํ์ - JSON ํ์ผ๋ก ์ฆ์ ์ ์ฅ/๋ฒ์ ๊ด๋ฆฌ ๊ฐ๋ฅ |
| Frontend | Vue 3 + Vite + TailwindCSS + DaisyUI | - Vue 3 ์ปดํฌ์ง์
API๋ก ๊ฐ๊ฒฐํ ์ํ ๊ด๋ฆฌ - Vite ๋๋ถ์ ์ด๊ณ ์ HMR - Tailwind/DaisyUI๋ก ์ต์ํ์ CSS๋ก ๊ท์ฌ์ด UI |
| Hosting | Railway (API) / Netlify (UI) | - ๋ฌด๋ฃ ํฐ์ด์์ ์ฆ์ ๋ฐฐํฌ ๊ฐ๋ฅ - GitHub ์ฐ๋, HTTPS ์๋ ์ง์ |
-
Backend (index.js)
GET / โ Health Check (200 OK) GET/POST/PUT/DELETE /admin/routes โ Lowdb ๊ธฐ๋ฐ CRUD app.all('*') โ ๋ฑ๋ก๋ Method+Path ๋งค์นญ โ Mock JSON ์๋ต CORS: ๊ฐ๋ฐ(localhost:5173) & ํ๋ก๋์ (UI ๋๋ฉ์ธ) ํ์ฉ ์ ์ฅ์: db.json (Lowdb JSONFile)
-
Frontend (App.vue)
ํ ํ์ด์ง SPA: API ๋ฑ๋ก ์น์ : Method, Path, Status, Response(JSON), Headers(JSON) ์ ๋ ฅ Registered APIs ํ ์ด๋ธ: ๋ชฉ๋ก ์กฐํ + ์ญ์ ๋ฒํผ loadRoutes(), addRoute(), deleteRoute() โ fetch ์ฐ๋ Vite Dev Proxy: /admin/* โ localhost:3000 (๋ก์ปฌ CORS ํํผ)
-
๋ฐฐํฌ
Railway: ๋น๋ฐ์ ๋๋น~ FRONTEND_URL= ๋น๋ฐ์ ๋๋น~ Netlify: ๋น๋ฐ์ ๋๋น~ VITE_API_BASE_URL=๋น๋ฐ์ ๋๋น~
- ๋ฐฑ์๋ ์์ฑ ์ ์๋ ๊ฐ๋ฐยท๊ฒ์ฆ ๊ฐ๋ฅ
- ์ ์๋ ์คํ์ผ๋ก Retrofit ์ฐ๋ ์์ โ UI/UX, ๋ฐ์ดํฐ ๋ชจ๋ธ, ์์ธ ์ฒ๋ฆฌ ๋ฏธ๋ฆฌ ๊ฒ์ฆ
- ๋ค์ํ ์๋๋ฆฌ์ค ํ ์คํธ
- 200/400/500 ๋ฑ ์ํ ์ฝ๋ + ์์ ํ์ด๋ก๋ ๋ฑ๋ก โ ์ฑ์ ์๋ฌ ํธ๋ค๋ง ๋ก์ง ๊ฐํ
- (์ถ๊ฐ ๊ธฐ๋ฅ) ๋คํธ์ํฌ ์ง์ฐ ์๋ฎฌ๋ ์ด์ ๊ฐ๋ฅ
- ํ๊ฒฝ ์ผ๊ด์ฑ ํ๋ณด
- ๋ก์ปฌ(localhost:3000) โ ํ๋ก๋์ (.railway.app) ๊ฐ ์ค์ ํ ์ค ๋ณ๊ฒฝ
- ํ์ ๊ฐ ๋์ผํ Mock ๋ฐ์ดํฐ๋ก ๋๋ฒ๊น ยทํ์
- ๋น ๋ฅธ ๋ฐ๋ณต(Iteration) & ํ๋กํ ํ์ดํ
- ๊ด๋ฆฌ UI์์ ์ฆ์ CRUD โ ์ฑ ์ฌ๋น๋ ์์ด loadRoutes()๋ก ์ฆ์ ๋ฐ์
- CI/CD ๋ฐ ์๋ํ ํ ์คํธ ์ฐ๋
- E2E ํ ์คํธ ์คํฌ๋ฆฝํธ์์ Mock API ์ฌ์ฉ โ ์ค์ ์๋ฒ ๋ถ๋ด ์์ด ํ๊ท ๊ฒ์ฆ
- Mock ๋ฐ์ดํฐ seed ๊ด๋ฆฌ๋ก ๋์ผ ์๋๋ฆฌ์ค ์ฌํ
- ๋ฐ์ดํฐ ์ ์ฅ์ ์ ๊ทธ๋ ์ด๋: Lowdb โ PostgreSQL/MySQL (Prisma, TypeORM)
- ์ธ์ฆยท์ธ๊ฐ ์ถ๊ฐ: JWT, OAuth, Role-based Access Control
- ๊ณ ๊ธ Mock ๊ธฐ๋ฅ: ๋ ์ดํด์ ์ค์ , ์๋ฌ ์ฃผ์ , ์์ฐจ ์๋ต, ์คํฌ๋ฆฝํ
- ๋ฒ์ ๊ด๋ฆฌ & ๋ฌธ์ํ: Swagger/OpenAPI, GitHub ์ฐ๋ ์๋ ์ปค๋ฐ
- ๋ชจ๋ํฐ๋ง & ๋ก๊น : Prometheus, Grafana, Sentry
- UI ๊ฐ์ : ๋ผ์ฐํธ ํธ์ง ๋ชจ๋ฌ, ๊ฒ์ยทํํฐ, Bulk import/export
์ด ๊ตฌ์ฑ์ ํตํด ์ฑ ๊ฐ๋ฐํ์ ์ค์ ์๋ฒ ์ค๋น ์ฌ๋ถ์ ๋ฌด๊ดํ๊ฒ ์์ ์ ์ด๊ณ ์ผ๊ด๋ ๊ฐ๋ฐยทํ ์คํธ ํ๊ฒฝ์ ํ๋ณดํ ์ ์์ต๋๋ค. ๋ค์ํ ์๋๋ฆฌ์ค๋ฅผ ์ฆ์ ๊ฒ์ฆํ๋ฉฐ, ์ผ์ ์ง์ฐ ๋ฆฌ์คํฌ๋ฅผ ์ต์ํํ์ธ์!