SOMAλ λνκ΅ κ΅ννμ μ§μ κ³Όμ μ 체κ³μ μΌλ‘ κ΄λ¦¬νλ μΉ νλ«νΌμ
λλ€.
μ±μ μΈμ¦, λνκ΅ μ§μ, κ²½μλ₯ λΆμ λ± κ΅ννμ μ€λΉμ νμν λͺ¨λ κΈ°λ₯μ μ 곡ν©λλ€.
- π κ°νΈ μΈμ¦: UUID κΈ°λ° μν΄λ¦ λ‘κ·ΈμΈ
- π« λνκ΅ μ§μ: κ²μ κΈ°λ° λνκ΅ μΆκ° λ° μ§λ§μμ κ΄λ¦¬
- π κ²½μλ₯ λΆμ: μ€μκ° μ§μ νν© λ° ν©κ²© μμ μ 보
- π± λ°μν λ€λΉκ²μ΄μ : λ°μ€ν¬ν± ν€λ + λͺ¨λ°μΌ νλ¨ λ€λΉκ²μ΄μ
- π±οΈ μ§κ΄μ UI: λͺ¨λ μνΈμμ© μμμ μ μ ν 컀μ λ° νΌλλ°±
- π¨ λλκ·Έ μ€ λλ‘: μ§λ§μμ μ‘°μ μ μν μ§κ΄μ μΈν°νμ΄μ€
- π μ€μκ° κ²μ: λνκ΅ κ²μ λ° μλμμ± κΈ°λ₯
- π μ μν λ μ΄μμ: λλ°μ΄μ€λ³ μ΅μ νλ UI/UX
- Node.js 18.0.0 μ΄μ
- npm 8.0.0 μ΄μ λλ yarn 1.22.0 μ΄μ
# μ μ₯μ ν΄λ‘
git clone https://github.com/your-username/soma.git
cd soma
# μμ‘΄μ± μ€μΉ
npm install
# κ°λ° μλ² μ€ν
npm run dev
http://localhost:3000
UUID κΈ°λ° μλ λ‘κ·ΈμΈμΌλ‘ λ°λ‘ ν μ€νΈ κ°λ₯ν©λλ€:
- κΉνμ:
http://localhost:3000/user-uuid-1
- μ΄νμ:
http://localhost:3000/user-uuid-2
- UUID μμ΄ μ μ μ μΈμ¦ λ§ν¬ μ λ ₯ μλ΄
- νλ‘μ νΈ κ°μ λ° μ£Όμ κΈ°λ₯ μλ΄
- κ°μΈ μ±μ μΈμ¦ μν νμΈ
- μ§μν λνκ΅ λͺ©λ‘ (μ§λ§μμ ν¬ν¨)
- μ±μ μμ μμ² μν νμΈ
- λΉ λ₯Έ μ‘μ λ²νΌ (μΈμ¦, μ§μ, μμ )
- κ²μ κΈ°λ° μΆκ°: λνκ΅ μ΄λ¦μΌλ‘ κ²μ ν μΆκ°
- μ€μκ° λ―Έλ¦¬λ³΄κΈ°: μ νν λνκ΅ μ 보 νμΈ
- μ§μ νν©: νΈμ§ νμ λ° λ§κ°μΌ μ ν κ΄λ¦¬
- λνκ΅ μμΈ μ 보 λ° μ§μ 쑰건
- νμ¬ μ§μμ λͺ©λ‘ (μ§λ§μμλ³)
- κ²½μλ₯ λ° ν©κ²© μμ λΆμ
- κ°μΈ μ 보 λ° μ±μ νν©
- μ§μν λνκ΅ λͺ©λ‘ (μμλ³ μ λ ¬)
soma/
βββ src/
β βββ app/ # Next.js App Router
β β βββ api/ # API Routes
β β β βββ auth/[uuid]/ # UUID κΈ°λ° μΈμ¦
β β β βββ verify-token/ # JWT ν ν° κ²μ¦
β β βββ [uuid]/ # UUID μΈμ¦ νμ΄μ§
β β βββ applications/ # λνκ΅ μ§μ κ΄λ¦¬
β β β βββ edit/ # μ§μ λνκ΅ νΈμ§
β β βββ dashboard/ # μ¬μ©μ λμ보λ
β β βββ profile/[id]/ # μ¬μ©μ νλ‘ν
β β βββ university/[id]/ # λνκ΅ μμΈ
β β βββ verification/ # μ±μ μΈμ¦
β β βββ edit/ # μ±μ μμ μμ²
β β βββ status/ # μΈμ¦ μν νμΈ
β βββ contexts/ # React Context
β β βββ AuthContext.tsx # μ¬μ©μ μΈμ¦ μν
β βββ lib/ # μ νΈλ¦¬ν°
β β βββ auth.ts # JWT μΈμ¦ λ‘μ§
β βββ types/ # TypeScript Types
β βββ index.ts # νμ
μ μ
βββ public/ # μ μ νμΌ
βββ package.json # νλ‘μ νΈ μ€μ
βββ tsconfig.json # TypeScript μ€μ
βββ tailwind.config.js # Tailwind μ€μ
βββ README.md # νλ‘μ νΈ λ¬Έμ
SOMAλ λͺ¨λ°μΌκ³Ό λ°μ€ν¬ν± νκ²½μ μ΅μ νλ λ°μν λμμΈμ μ 곡ν©λλ€.
- Header Navigation: ν
μ€νΈ κΈ°λ° λ€λΉκ²μ΄μ
λ²νΌ
λ€λ‘ κ°κΈ° | λ©μΈμΌλ‘
ννμ ꡬλΆμ μ€νμΌ- μ°μΈ‘ μλ¨μ "λ΄ νλ‘ν" λ²νΌ λ°°μΉ
- Content Layout: λμ νλ©΄μ νμ©ν 그리λ λ μ΄μμ
- Table View: λνκ΅ λͺ©λ‘μ ν μ΄λΈ ννλ‘ νμ
- Clean Header: μ λͺ©λ§ νμνλ κΉλν ν€λ
- Bottom Navigation: νλ¨ κ³ μ λ€λΉκ²μ΄μ
λ°
- π λ€λ‘: μ΄μ νμ΄μ§λ‘ μ΄λ
- π ν: λμ보λλ‘ μ΄λ
- π€ νλ‘ν: λ΄ νλ‘νλ‘ μ΄λ
- νμ¬ νμ΄μ§λ νλμμΌλ‘ νμ΄λΌμ΄νΈ
- Card Layout: λͺ¨λ°μΌμ μ΅μ νλ μΉ΄λν λ μ΄μμ
Header: [λ€λ‘ κ°κΈ° | λ©μΈμΌλ‘] ββββββββββ [λ΄ νλ‘ν]
Header: [ μ λͺ©λ§ ]
Bottom: [λ€λ‘] [ν] [νλ‘ν]
- Cursor Styles: λͺ¨λ μνΈμμ© μμμ μ μ ν 컀μ
- Visual Feedback: νΈλ², ν¬μ»€μ€, μ‘ν°λΈ μν νμ
- Loading States: λΉλκΈ° μμ μ€ λ‘λ© νμ
- Error Handling: λͺ νν μλ¬ λ©μμ§ λ° κ°μ΄λ
- Safe Zone: λͺ¨λ°μΌ νλ¨ λ€λΉκ²μ΄μ μ μν 컨ν μΈ μ¬λ°± μ²λ¦¬
- Drag & Drop: μ§λ§μμ μ‘°μ
- Search & Select: λνκ΅ κ²μ λ° μ ν
- Modal Interactions: μ±μ κ²ν λ° μ΄λ―Έμ§ νμΈ
- Responsive Touch: λͺ¨λ°μΌ ν°μΉ μΈν°νμ΄μ€ μ΅μ ν
- Mobile:
< 640px
- μΉ΄λ λ μ΄μμ, νλ¨ λ€λΉκ²μ΄μ - Tablet:
640px - 1024px
- νμ΄λΈλ¦¬λ λ μ΄μμ - Desktop:
β₯ 1024px
- ν μ΄λΈ λ μ΄μμ, ν€λ λ€λΉκ²μ΄μ
# κ°λ° μλ² μ€ν
npm run dev
# νλ‘λμ
λΉλ
npm run build
# νλ‘λμ
μλ² μ€ν
npm start
# μ½λ λ¦°ν
npm run lint