Grobleμ λμ§νΈ μ½ν μΈ μ°½μμλ€μ΄ κΈ°μ‘΄ νλ«νΌμμ κ²ͺλ κ³ κ°κ³Όμ λ¨μ , λ°μ΄ν° λΆμ¬, λ°λ³΅ μμ΅μ νκ³λΌλ ꡬ쑰μ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μμλ νλ‘μ νΈμ λλ€. λ¨μ κ±°λ μ€κ°λ₯Ό λμ΄, μ°½μμκ° μμ μ κ³ κ° λ°μ΄ν°λ₯Ό μ§μ μμ νκ³ κ΄κ³λ₯Ό νμ±νμ¬ μ§μ κ°λ₯ν λΉμ¦λμ€λ₯Ό ꡬμΆν μ μλλ‘ μ§μν©λλ€.
- λ©ν°μ€ν νΌ: 볡μ‘ν μν μ 보λ₯Ό λ¨κ³λ³λ‘ μ½κ² μ λ ₯ν μ μλ UI/UX
- λ¦¬μΉ ν
μ€νΈ μλν°:
TipTap
κΈ°λ°μ μλν°λ‘ μ΄λ―Έμ§, ν λ±μ ν¬ν¨ν μμΈ νμ΄μ§ μ μ - λμ§νΈ νμΌ μ λ‘λ: νλ§€ν μ½ν μΈ νμΌμ μμ νκ² μ λ‘λ λ° κ΄λ¦¬
- νλ§€μ λμ보λ: μν λͺ©λ‘, νλ§€ νν© λ± ν΅μ¬ μ§ν κ΄λ¦¬
- μ½ν μΈ νλ§€ νμ΄μ§: μμ±λ μνμ μμΈ μ 보 λ° κ΅¬λ§€ νμ΄μ§ μ 곡
- κ°νΈ κ²°μ μ°λ:
Payple
κ²°μ λͺ¨λμ μ°λνμ¬ μΉ΄μΉ΄μ€νμ΄, λ€μ΄λ²νμ΄ λ± μ£Όμ κ²°μ μλ¨ μ§μ - μ¦μ λ€μ΄λ‘λ: κ²°μ μλ£ ν ꡬ맀μκ° μ¦μ μ½ν μΈ λ₯Ό λ€μ΄λ‘λν μ μλ μμ€ν
- ꡬ맀μ κ΄λ¦¬: λ΄ μνμ ꡬ맀ν κ³ κ° λͺ©λ‘ λ° μ 보 νμΈ
- κ³ κ° κ·Έλ£Ή κ΄λ¦¬: νΉμ 쑰건(μ κ· κ΅¬λ§€μ, μ¬κ΅¬λ§€μ λ±)μ λ°λΌ κ³ κ°μ κ·Έλ£Ήν
- νκ² λ§μΌν : νΉμ κ³ κ° κ·Έλ£Ήμκ² ν μΈ μΏ ν° λ° μ κ· μ½ν μΈ μλ¦Ό λ°μ‘
- ν΅κ³ λ° λΆμ λμ보λ: URLμ UTM νλΌλ―Έν°λ₯Ό μ¬μ©νμ¬ μ μ μΆμ , νμ΄μ§ μ‘°νμ μ 곡
- Framework: Next.js 15 (App Router), React 19
- Language: TypeScript
- UI Library: TipTap (Editor)
- Server State: TanStack Query (React Query)
- Client State: Zustand
- Form: React Hook Form, Zod (Schema Validation)
- CSS Framework: Tailwind CSS
- Component: CVA (Class Variance Authority)
- Monorepo: Turborepo
- Package Manager: pnpm
- Deployment: Vercel
νλ‘μ νΈλ Turborepo κΈ°λ°μ λͺ¨λ
Έλ ν¬μ FSD(κΈ°λ₯ μ€μ¬ μ€κ³) ν¨ν΄μ κΈ°λ°μΌλ‘ λ€μκ³Ό κ°μ΄ ꡬμ±λμ΄ μμ΅λλ€. apps
λ΄ κ° μ ν리μΌμ΄μ
μ κΈ°λ₯λ³λ‘ λͺ¨λνλ features
λλ ν 리μ κ³΅ν΅ λ‘μ§μ λ€λ£¨λ shared
, components
λλ ν 리λ₯Ό κ°μ§λλ€.
groble-frontend/
βββ apps/
β βββ web/ # λ©μΈ μΉ μ ν리μΌμ΄μ
β β βββ app/ # Next.js App Router
β β βββ features/ # κΈ°λ₯λ³ λͺ¨λ (FSD ν¨ν΄)
β β β βββ auth/
β β β βββ products/
β β β βββ ...
β β βββ shared/ # κ³΅ν΅ μ νΈλ¦¬ν° (API, UI, Types λ±)
β β βββ components/ # κΈλ‘λ² κ³΅ν΅ μ»΄ν¬λνΈ
β βββ admin/ # μ΄λλ―Ό λμ보λ
βββ packages/
β βββ ui/ # 곡μ λμμΈ μμ€ν
β βββ config/ # 곡μ μ€μ (ESLint, TSConfig λ±)
βββ turbo.json # Turborepo μ€μ
μλ² μνμ ν΄λΌμ΄μΈνΈ μνμ μ± μμ λͺ νν λΆλ¦¬νμ¬, λ°μ΄ν° λΆμΌμΉ λ° λκΈ°ν λ‘μ§ λ± μν°ν¨ν΄μ λ°©μ§ν©λλ€.
- μλ² μν (TanStack Query):
- μλ² λ°μ΄ν°μ λ¨μΌ μ§μ€ 곡κΈμ(Single Source of Truth) μν
- μΊμλ₯Ό νμ΄μ§ κ° λ°μ΄ν° 곡μ νλΈλ‘ νμ©νμ¬ λΆνμν API νΈμΆ λ°©μ§ λ° μ¦μ λ‘λ© κ²½ν μ 곡
- ν΄λΌμ΄μΈνΈ μν (Zustand):
- UIμ μ§μ κ΄λ ¨λ νλ°μ± μν κ΄λ¦¬
- μ νμ(Selector) κΈ°λ° λ λλ§ μ΅μ νλ‘ λΆνμν 리λ λλ§ λ°©μ§ λ° μ±λ₯ ν보
