λμ κ²μ λ° λμκ΄ μ¬κ³ νμΈ μλΉμ€
μλΌλ APIμ μ°λνμ¬ λμλ₯Ό κ²μνκ³ , μ¬λ¬ λμκ΄μ μ¬κ³ νν©μ μ€μκ°μΌλ‘ νμΈν μ μλ μΉ μ ν리μΌμ΄μ μ λλ€. κ°μΈ μμ¬ κ΄λ¦¬ κΈ°λ₯μ ν΅ν΄ κ΄μ¬ λμλ₯Ό 체κ³μ μΌλ‘ κ΄λ¦¬ν μ μμ΅λλ€.
- μμ€ν± λμ μλΉμ€: κ²μλΆν° μ¬κ³ νμΈ, κ°μΈ κ΄λ¦¬κΉμ§ ν κ³³μμ
- μ€μκ° μ¬κ³ νμΈ: μ¬λ¬ λμκ΄μ μ¬κ³ μνλ₯Ό λμμ νμΈ
- κ°μΈνλ μμ¬ κ΄λ¦¬: λ μ μν, λ³μ , νκ·Έ, μ¦κ²¨μ°ΎκΈ° λ± μ²΄κ³μ μΈ λμ κ΄λ¦¬
- νΈλ¦¬ν μ κ·Όμ±: μ§κ΄μ μΈ UI/UXλ‘ λꡬλ μ½κ² μ¬μ©
- μλΌλ API μ°λ: μ λͺ©, μ μ, μΆνμ¬, μ μμ± λ³ κ²μ λ° νμ΄μ§λ€μ΄μ μ§μ
- κ²μ κ²°κ³Ό νν°λ§: '[μΈνΈ]'λ‘ μμνλ λμλ₯Ό μλμΌλ‘ μ μΈνμ¬ κ²μ κ²°κ³Όμ μ νμ± ν₯μ
- μμΈ μ 보 μ 곡: λμ μ 보, κ°κ²©, ISBN, μ μμ± μ 무, μλΌλ ꡬ맀 λ§ν¬ λ± μμΈ μ 보 νμ
- ν€μλ ν΅ν© κ²μ: λ¨μΌ ν€μλλ‘ μ¬λ¬ λμκ΄μ μμ₯ μλ£λ₯Ό ν λ²μ κ²μνλ κΈ°λ₯
- μ€μκ° ν΅ν© μ‘°ν: μ’ μ΄μ± (κ΄μ£Ό μ립λμκ΄), μ μμ± (κ²½κΈ°λ κ΅μ‘μ² ν΅ν© λμκ΄), μ μμ± (κ΄μ£Ό μ립λμκ΄ κ΅¬λ ν), μ μμ± (κ²½κΈ°λ μ μλμκ΄ API) μ¬κ³ λ₯Ό ν λ²μ μμ²μΌλ‘ λμμ νμΈ
- 컀μ€ν κ²μμ΄: κΈ°λ³Έ κ²μμ΄λ‘ μ‘°νκ° μ΄λ €μ΄ λμμ κ²½μ°, μ¬μ©μκ° μ§μ κ²μμ΄λ₯Ό μ§μ νμ¬ μ‘°ν μ νλ ν₯μ
- μ νλ λμ μ¬κ³ : "μ 보μμ" λ°μ΄ν° μ μΈ(κ΄μ£Ό μ립) λ± μ νν μ 보 μ 곡
- λμκ΄ λ°λ‘κ°κΈ°: μ¬κ³ νμΈ μ ν΄λ¦ μ, ν΄λΉ λμκ΄μ λμ κ²μ κ²°κ³Ό νμ΄μ§λ‘ λ°λ‘ μ΄λ
- μ¬κ³ μλ‘κ³ μΉ¨: ν΄λ¦ ν λ²μΌλ‘ μ΅μ μ¬κ³ μν μ λ°μ΄νΈ
- μ’ μ΄μ± : κ΄μ£Ό μ€μ, μ‘μ , μ€ν¬, ν΄μ΄ λμκ΄ λ° κΈ°ν μ립λμκ΄
- μ μμ± : κ²½κΈ°λ κ΅μ‘μ² ν΅ν©μ μλμκ΄, μ±λ¨κ΅μ‘λμκ΄
- μ μμ± : κ΄μ£Ό μ립λμκ΄ κ΅¬λ ν(κ΅λ³΄λ¬Έκ³ ) λ° μμ₯ν
- μ μμ± : κ²½κΈ°λ μ μλμκ΄ (μμ₯ν+ꡬλ ν ν΅ν©)
- λ΄ μμ¬: κ΄μ¬ λμλ₯Ό κ°μΈ μμ¬μ μ μ₯ λ° κ΄λ¦¬
- λ μ κΈ°λ‘: μ½μ μν(μ½μ§ μμ/μ½λ μ€/μλ ) λ° λ³μ (1-5μ ) κΈ°λ‘
- π·οΈ 컀μ€ν νκ·Έ: μ¬μ©μ μ μ νκ·Έ μμ±/νΈμ§/μμ λ° νκ·Έ κΈ°λ° νν°λ§
- β€οΈ μ’μνλ μ± : ννΈ μμ΄μ½μΌλ‘ μ¦κ²¨μ°ΎκΈ° νμ λ° νν°λ§
- π ν μ€ λ©λͺ¨: μ± λ³λ‘ μ΅λ 50μμ κ°λ¨ν λ©λͺ¨ κΈ°λ‘ λ° μμ
- π μλ² κΈ°λ° κ²μ: νμ΄μ§λ€μ΄μ κ³Ό 무κ΄νκ² DB μ 체λ₯Ό λμμΌλ‘ μ λͺ©, μ μλ³ μ€μκ° κ²μ
- λ€μν μ λ ¬: μΆκ°μ, μ λͺ©μ, μ μμ, μΆκ°μΌμ, λ³μ μ, μ½μμ μ λ ¬
- β‘ νμ΄μ§λ€μ΄μ : μ¬μ©μ μ€μ (25/50/100/200κΆ)μ λ°λΌ μ΄κΈ° λ°μ΄ν°λ₯Ό λΆλΆ λ‘λ©νμ¬ λ λλ§ μ±λ₯ 95% κ°μ
- λλ μμ : μ¬λ¬ μ± μ μ ννμ¬ νκ·Έ μΌκ΄ λ³κ²½, μμ λ± λλ μμ μ§μ
- μΌκ΄ μ¬κ³ κ°±μ : λ΄ μμ¬μ λͺ¨λ μ± μ¬κ³ μ 보λ₯Ό ν λ²μ μ λ°μ΄νΈ (μ΅μ μ/μ€λλμ/λ²μμ§μ , μΌμμ μ§/μ¬κ°/μ·¨μ κ°λ₯)
- λ°μ΄ν° λ΄λ³΄λ΄κΈ°: μμ¬ λ°μ΄ν°λ₯Ό CSV νμΌλ‘ λ΄λ³΄λ΄κΈ° (νμΌλͺ μ λ μ§ μλ ν¬ν¨)
- νμ μ΅μ : λ μ μν, λ³μ , νκ·Έ, λ©λͺ¨, λμκ΄ μ¬κ³ , μ’μμ μμ΄μ½ νμ μ¬λΆ μ€μ
- π ν λ§ μμ€ν : λ€ν¬/λΌμ΄νΈ/μμ€ν ν λ§ μ ν
- π± λͺ¨λ°μΌ μ΅μ ν: λ°μν λμμΈμΌλ‘ λͺ¨λ κΈ°κΈ°μμ μ΅μ νλ κ²½ν μ 곡
- κΈ°λ³Έκ° μ€μ : κ΄λ¦¬μλ₯Ό ν΅ν μ κ· μ¬μ©μ κΈ°λ³Έ μ€μ κ° κ΄λ¦¬
- Google μμ λ‘κ·ΈμΈ: κ°νΈν Google κ³μ μ°λ
- μ΄λ©μΌ νμκ°μ /λ‘κ·ΈμΈ: μ΄λ©μΌκ³Ό λΉλ°λ²νΈλ₯Ό ν΅ν μΈμ¦
- κ³μ κ΄λ¦¬: λΉλ°λ²νΈ λ³κ²½, νλ‘ν κ΄λ¦¬
- μμ ν νμνν΄: 2λ¨κ³ νμΈ μ μ°¨λ₯Ό ν΅ν κ³μ μμ (Supabase Admin API μ°λ)
- μ견 보λ΄κΈ°: νλ‘ν λ©λ΄μμ κ°νΈν νΌλλ°± μ μ‘
- 보μ κ°ν: Supabase Edge Functionμ ν΅ν΄ μμ νκ² νΌλλ°± μ²λ¦¬
- κ΄λ¦¬μ μ μ© νμ΄μ§: μ΄λ©μΌ κΈ°λ° κΆν κ΄λ¦¬ μμ€ν
- μ£Όμ κΈ°λ₯: λλ λμ μ‘°ν, API ν μ€νΈ λꡬ, κ°λ° λ ΈνΈ, μ κ· μ¬μ©μ κΈ°λ³Έκ° μ€μ λ±
- React 19 & TypeScript
- Vite: λΉ λ₯Έ κ°λ° μλ² λ° λΉλ
- Tailwind CSS: μ νΈλ¦¬ν° μ°μ CSS νλ μμν¬
- Lucide React: μΌκ΄μ± μλ μμ΄μ½ μμ€ν
- Zustand: κ²½λ μν κ΄λ¦¬ (μΈμ¦, λμ, UI, μ€μ λ³ λΆλ¦¬)
- Supabase: PostgreSQL λ°μ΄ν°λ² μ΄μ€, μΈμ¦, μ€μκ° λκΈ°ν
- Supabase Edge Functions: μλ²λ¦¬μ€ λ‘μ§ (νΌλλ°± μ²λ¦¬)
- Cloudflare Workers: λμκ΄ μ¬κ³ ν¬λ‘€λ§ λ° ν€μλ κ²μ API
- Vercel Serverless Functions: Aladin API νλ‘μ μ²λ¦¬
- Zod: λ°νμ νμ κ²μ¦μΌλ‘ μΈλΆ API μλ΅ μμ μ± ν보
- Node.js 18 μ΄μ
- Git
- μ μ₯μ ν΄λ‘
git clone <repository-url> cd my_bookstation
- μμ‘΄μ± μ€μΉ
npm install
- νκ²½ λ³μ μ€μ (
.env.localνμΌ μμ±)VITE_SUPABASE_URL=your_supabase_url VITE_SUPABASE_ANON_KEY=your_supabase_anon_key VITE_ALADIN_TTB_KEY=your_aladin_ttb_key
- κ°λ° μλ² μ€ν
npm run dev
- λΈλΌμ°μ μμ νμΈ:
http://localhost:5173
- π λ°μ΄ν° μ μ€ λ°©μ§: APIκ° λΉμ μ μλ΅μ λ°νν λ κΈ°μ‘΄ μ¬κ³ μ 보κ°
undefinedλ‘ μ΄κΈ°νλλ μ¬κ°ν λ²κ·Έλ₯Ό μμ νμ΅λλ€. μ΄μ API μ€ν¨ μ κΈ°μ‘΄ λ°μ΄ν°λ₯Ό μμ νκ² μ μ§ν©λλ€. - π μν λκΈ°ν: κ²μμ΄λ νν°λ‘ νμλ μ± μ λν΄ 'μ’μμ', νκ·Έ μΆκ°/μμ λ± μν λ³κ²½μ΄ μ¦μ λ°μλμ§ μλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€. λͺ¨λ λ°μ΄ν° μμ€λ₯Ό ν¬κ΄νλ μ‘°ν λ‘μ§μ μ μ©νμ¬ UI μΌκ΄μ±μ ν보νμ΅λλ€.
- π¨ νκ·Έ μμ€ν UX κ°μ : λͺ¨λ λ·°(μ± λͺ©λ‘, μμΈ λͺ¨λ¬, μΌκ΄ κ΄λ¦¬)μμ νκ·Έκ° 'μμ > μΈκΈ°λ > μ΄λ¦μ'μΌλ‘ μΌκ΄λκ² μ λ ¬λλλ‘ μμ νμΌλ©°, νκ·Έ μΆκ°/μμ μ νν°μ μΉ΄μ΄νΈκ° μ€μκ°μΌλ‘ μ λ°μ΄νΈλλλ‘ κ°μ νμ΅λλ€.
- β‘οΈ API μλ΅ μΊμ±: Cloudflare Cache APIλ₯Ό λμ νμ¬ λ°λ³΅μ μΈ μ¬κ³ μ‘°ν μμ²μ λν μλ΅ μλλ₯Ό μ μ΄μμ μμ λ°λ¦¬μ΄ λ¨μλ‘ λΉμ½μ μΌλ‘ λ¨μΆνμ΅λλ€.
- π‘ μ§κ΄μ μλ¬ νΌλλ°±: μ¬κ³ μ‘°ν μ€ν¨ μ μμΈ λͺ¨λ¬μμ "μ‘°νμ€..."μ΄ λ¬΄ν λ°λ³΅λλ λ²κ·Έλ₯Ό ν΄κ²°νκ³ , μλ¬ μνλ₯Ό λͺ νν νμνλλ‘ UXλ₯Ό κ°μ νμ΅λλ€.
- π― μ‘°ν μ νλ ν₯μ: μ¬μ©μκ° μ§μ λμκ΄ κ²μμ΄λ₯Ό μ§μ νλ '컀μ€ν κ²μμ΄' κΈ°λ₯ μΆκ°.
- π οΈ μ μ§λ³΄μμ± κ°μ : μ¬λ¬ μ»΄ν¬λνΈμ ν©μ΄μ Έ μλ λμκ΄ λ°λ‘κ°κΈ° URL μμ± λ‘μ§μ λ¨μΌ ν¨μλ‘ μ€μννμ¬ μΌκ΄μ±μ ν보νκ³ λ²κ·Έλ₯Ό μμ νμ΅λλ€.
- κ΄λ¦¬μ κΆν μμ€ν : μ΄λ©μΌ κΈ°λ°μ μμ ν κ΄λ¦¬μ κΆν λΆμ¬.
- νμνν΄ κΈ°λ₯: Supabase Admin APIλ₯Ό μ°λν 2λ¨κ³ νμΈ μ μ°¨λ‘ μμ μ± κ°ν.
- Race Condition λ²κ·Έ μμ : μ¬μ©μ μ€μ μμ± μ λ°μνλ λμμ± λ¬Έμ λ₯Ό ν΄κ²°νμ¬ μμ μ± ν보.
- β‘οΈ λ°μ΄ν° μμ μ± κ·Ήλν: APIμ μΌμμ μΈ μ€ν¨μλ κΈ°μ‘΄μ μ ν¨ν μ¬κ³ μ λ³΄κ° μ μ€λμ§ μλλ‘ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§λ₯Ό 리ν©ν λ§νκ³ "μ νμ ν΄λ°±(Fallback)" λ°μ΄ν° μ λ°μ΄νΈ μ λ΅μ λμ νμ΅λλ€. μ΄μ νλ²μ΄λΌλ μ‘°νμ μ±κ³΅ν μ¬κ³ μ 보λ API μ€λ₯μλ μμ νκ² λ³΄μ‘΄λ©λλ€.
- π¨ UX μΌκ΄μ± ν보: λ΄ μμ¬ λͺ©λ‘μμλ νμ μμ μ μΈ λ§μ§λ§ μ¬κ³ μ 보λ₯Ό νμνκ³ (μ€ν¨ μ λΉ¨κ°μ X), μμΈ λͺ¨λ¬μμλ§ νμ¬μ κ°±μ μ€ν¨ μνλ₯Ό μλ €μ£Όλλ‘ μν μ λΆλ΄νμ¬ μ¬μ©μ κ²½νμ ν¬κ² κ°μ νμ΅λλ€.
- βοΈ TypeScript μ ν: Cloudflare Worker(λ°±μλ) μ½λλ₯Ό TypeScriptλ‘ μ λ©΄ μ ννμ¬ νμ μμ μ±μ ν보νκ³ λ°νμ μλ¬ λ°μ κ°λ₯μ±μ ν¬κ² μ€μμ΅λλ€.
- π API μλ΅ μΊμ±: Cloudflare Cache APIλ₯Ό λμ νμ¬ λ°λ³΅μ μΈ μ¬κ³ μ‘°ν μμ²μ λν μλ΅ μλλ₯Ό μ μ΄μμ μμ λ°λ¦¬μ΄ λ¨μλ‘ 99% μ΄μ λ¨μΆνμ΅λλ€.
- π‘οΈ ν¬λ‘€λ§ μμ μ± κ°ν: λμκ΄ μλ²μ λ΄ νμ§ μ μ± μ λμνκΈ° μν΄, μ€μ λΈλΌμ°μ ν€λλ₯Ό μ κ΅νκ² λͺ¨λ°©νλ 2λ¨κ³ μμ² λ°©μμ λμ νκ³ μΈμ λ§λ£ μ μλ 볡ꡬ λ‘μ§μ ꡬννμ¬ ν¬λ‘€λ§ μ±κ³΅λ₯ μ λν ν₯μμμΌ°μ΅λλ€.
- π λ°μ΄ν° λ¬΄κ²°μ± λ³΄μ₯: μ±
μ 보 μ
λ°μ΄νΈ(κ°λ³/μΌκ΄) μ
id,noteλ± μ€μ λ°μ΄ν°κ° λλ½λκ±°λ μμλλ κ·Όλ³Έμ μΈ λ²κ·Έλ₯Ό ν΄κ²°νμ¬ λ°μ΄ν° μΌκ΄μ±μ ν보νμ΅λλ€. - π μν λκΈ°ν: κ²μμ΄λ νν°λ‘ νμλ μ± μ λν΄ 'μ’μμ', νκ·Έ μΆκ°/μμ λ± μν λ³κ²½μ΄ μ¦μ λ°μλμ§ μλ λ¬Έμ λ₯Ό ν΄κ²°νμ¬ UI μΌκ΄μ±μ ν보νμ΅λλ€.
- κ°λ° κ°μ΄λ - κ°λ°νκ²½ μ€μ , μν€ν μ², κΈ°μ μμΈ μ 보
- λ³κ²½ λ΄μ - λ²μ λ³ μ λ°μ΄νΈ κΈ°λ‘
νλ‘μ νΈμ κΈ°μ¬νκ³ μΆμΌμλ€λ©΄ μ΄μλ₯Ό ν΅ν΄ λ²κ·Έ 리ν¬νΈλ κΈ°λ₯ μ μμ ν΄μ£Όμκ±°λ, Pull Requestλ₯Ό ν΅ν΄ μ½λ κΈ°μ¬λ₯Ό ν΄μ£ΌμΈμ.
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€.
made by planninghighway 2025