λ§μ΄ν¬λ‘νμ΄λΈμ€(μμ‘κΈμ΅) κ΄λ¦¬ νλ«νΌμ νλ‘ νΈμλ μΉ μ ν리μΌμ΄μ μ λλ€. κ³ κ° κ΄λ¦¬, λμΆ κ΄λ¦¬, κ³ μ μμ° κ΄λ¦¬, HR, μν λ± μ’ ν©μ μΈ κΈμ΅ μ΄μμ μ§μν©λλ€.
λ°°ν¬ URL: dymf-front.vercel.app
DYMF(DY-Microfinance Customer Management) λ λ§μ΄ν¬λ‘νμ΄λΈμ€ μ‘°μ§μ μ΄μμ λμ§νΈννλ ν΅ν© κ΄λ¦¬ μμ€ν μ λλ€. μ΄ μ μ₯μλ λ°±μλ(dymf-back)μ ν΅μ νλ ν΄λΌμ΄μΈνΈ μ¬μ΄λλ₯Ό λ΄λΉν©λλ€.
- β Next.js κΈ°λ° νμ€ν React μ ν리μΌμ΄μ
- β API λΌμ°νΈ κΈ°λ°μ λ°±μλ ν΅μ (RESTful)
- β μ¬μ©μ μΈμ¦ & κΆν κ΄λ¦¬ (User Role κΈ°λ°)
- β ν λ§ μ§μ (λΌμ΄νΈ/λ€ν¬ λͺ¨λ)
- β λ°μν UI (Radix UI + Tailwind CSS)
- β νμ μμ μ± (TypeScript)
- λμ보λ κ°μ νμ΄μ§
- μ£Όμ ν΅κ³ λ° μμ½ μ 보
- κ³ κ° μ 보 μ‘°ν λ° κ²μ
- κ³ κ° λ±λ‘
- κ³ κ° μμΈ μ 보 μ‘°ν
- κ²μ: CP λ²νΈ κΈ°λ° λμΆ μ 보 κ²μ
- μ‘°ν: λμΆ μμΈ μ 보 λ° ν κΈ°λ° μμΈ λ³΄κΈ°
- λμΆ λ΄λΉμ μ§μ (Assign Loan Officer)
- λμΆ κ³μ°κΈ°: λμΆμ‘, μ΄μ¨, κΈ°κ° κΈ°λ° μνμ‘ κ³μ°
- 보μ¦μΈ μ 보 μ‘°ν λ° κ΄λ¦¬
- κ³ μ μμ° λ±λ‘ λ° μμ
- μμ° νν© μ‘°ν
- μν μΌμ μ‘°ν
- μν νν© λ° μ°μ²΄ μΆμ
- CP λ²νΈ κ²μ
- κ³ κ° λ±λ‘ μλ£λ μΆμ
- μ§μ μ 보 μ‘°ν
- μν λ³ μ¬μ©μ κ΄λ¦¬
- λ€μν 리ν¬νΈ μμ± λ° μ‘°ν
- μ¬μ©μ λ±λ‘
- μ¬μ©μ μμ
| λΆλ₯ | κΈ°μ |
|---|---|
| Runtime | Node.js |
| μΈμ΄ | TypeScript |
| νλ μμν¬ | Next.js 15.3.4 |
| λΌμ΄λΈλ¬λ¦¬ | React 19.0.0 |
| UI μ»΄ν¬λνΈ | Radix UI (Dialog, Tabs, Dropdown, Alert, etc.) |
| μ€νμΌλ§ | Tailwind CSS 3.4.1 + CVA (Class Variance Authority) |
| μμ΄μ½ | Lucide React |
| HTTP ν΄λΌμ΄μΈνΈ | Axios 1.7.9 |
| ν ν° κ΄λ¦¬ | JWT Decode 4.0.0 |
| λ μ§/μκ° | date-fns 4.1.0 |
| μλ¦Ό/ν μ€νΈ | Sonner 1.7.4 |
| ν λ§ | next-themes 0.4.4 |
| μ΄λ―Έμ§ μ²λ¦¬ | Sharp 0.33.5 |
| μ λλ©μ΄μ | tailwindcss-animate |
| κ°λ° λꡬ | ESLint, TypeScript, PostCSS |
src/
βββ app/ # Next.js μ± λΌμ°ν°
β βββ (with-app-sidebar)/ # μΈμ¦λ μ¬μ©μ λ μ΄μμ
β β βββ home/ # ν νμ΄μ§
β β βββ cp/ # 보좩 μλ£ μμ² (Checkpoint)
β β βββ search/ # κ²μ νμ΄μ§
β β βββ calculator/ # λμΆ κ³μ°κΈ°
β β βββ fixed-assets/ # κ³ μ μμ° κ΄λ¦¬
β β βββ hr/ # μΈμ¬ κ΄λ¦¬
β β βββ overdue/ # μ°μ²΄ κ΄λ¦¬
β β βββ registration/ # κ³ κ° λ±λ‘
β β βββ repayment/ # μν κ΄λ¦¬
β β βββ report/ # λ³΄κ³ μ
β β βββ user/ # μ¬μ©μ κ΄λ¦¬
β β βββ layout.tsx # μ¬μ΄λλ° λ μ΄μμ
β βββ login/ # λ‘κ·ΈμΈ νμ΄μ§
β βββ api/ # API λΌμ°νΈ (λ°±μλ νλ‘μ)
β β βββ auth/ # μΈμ¦ κ΄λ ¨
β β βββ getCustomers/ # κ³ κ° μ‘°ν
β β βββ getLoans/ # λμΆ μ‘°ν
β β βββ getCpNumbers/ # CP λ²νΈ κ²μ
β β βββ getFixedAssets/ # κ³ μ μμ° μ‘°ν
β β βββ getGuarantors/ # 보μ¦μΈ μ‘°ν
β β βββ getLoanOfficers/ # λμΆ λ΄λΉμ μ‘°ν
β β βββ assignLoanOfficer/ # λμΆ λ΄λΉμ μ§μ
β β βββ deleteUser/ # μ¬μ©μ μμ
β β βββ deleteFixedAsset/ # κ³ μ μμ° μμ
β β βββ ... (κΈ°ν API μλν¬μΈνΈ)
β βββ layout.tsx # λ£¨νΈ λ μ΄μμ
β βββ page.tsx # λ£¨νΈ νμ΄μ§
βββ components/ # μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈ
β βββ ui/ # Radix UI κΈ°λ° μ»΄ν¬λνΈ
β β βββ tabs.tsx # ν μ»΄ν¬λνΈ
β β βββ dialog.tsx # λ€μ΄μΌλ‘κ·Έ
β β βββ button.tsx # λ²νΌ
β β βββ ... (κΈ°ν UI μ»΄ν¬λνΈ)
β βββ pop-ups/ # λͺ¨λ¬/νμ
μ»΄ν¬λνΈ
β βββ tabs/ # νμ΄μ§λ³ ν μ»΄ν¬λνΈ
β βββ app-sidebar.tsx # μ ν리μΌμ΄μ
μ¬μ΄λλ°
β βββ nav-*.tsx # λ€λΉκ²μ΄μ
μ»΄ν¬λνΈ
β βββ theme-provider.tsx # ν
λ§ μ 곡μ
βββ context/ # React Context (μν κ΄λ¦¬)
β βββ UserProvider.tsx # μ¬μ©μ μ 보 λ° κΆν κ΄λ¦¬
βββ hooks/ # 컀μ€ν
React Hook
βββ util/ # μ νΈλ¦¬ν° ν¨μ
βββ middleware.ts # Next.js λ―Έλ€μ¨μ΄ (μμ² μ²λ¦¬)
βββ types.ts # TypeScript νμ
μ μ
βββ eslint.config.mjs # ESLint μ€μ
# μ μ₯μ ν΄λ‘
git clone https://github.com/DY-Microfinance-Customer-Management/dymf-front.git
cd dymf-front
# μμ‘΄μ± μ€μΉ
npm installnpm run dev- λΈλΌμ°μ μμ http://localhost:3001 μ μ
npm run build
npm startλ°±μλ API μλν¬μΈνΈλ src/app/api/* ν΄λμ λΌμ°νΈ νΈλ€λ¬μμ κ΄λ¦¬λ©λλ€.
νκ²½ λ³μ μ€μ μ΄ νμν κ²½μ° .env.local νμΌμ μμ±νμ¬ κ΅¬μ±ν©λλ€.
- JWT κΈ°λ° ν ν° μΈμ¦
- Role κΈ°λ° μ κ·Ό μ μ΄ (UserProvider.tsx μμ κ΄λ¦¬)
- λ‘κ·ΈμΈ νμ΄μ§:
/login - 보νΈλ λΌμ°νΈ:
(with-app-sidebar)ν΄λ λ΄ λͺ¨λ νμ΄μ§
- Radix UI: μ κ·Όμ±μ΄ λμ ν€λλ¦¬μ€ μ»΄ν¬λνΈ
- Tailwind CSS: μ νΈλ¦¬ν° κΈ°λ° CSS νλ μμν¬
- Dark Mode: next-themesλ‘ λΌμ΄νΈ/λ€ν¬ λͺ¨λ μ§μ
- λ°μν λμμΈ: λͺ¨λ°μΌ, νλΈλ¦Ώ, λ°μ€ν¬ν± νΈν
| μν | μ΄λ¦ |
|---|---|
| Backend | λͺ¨μ§μ |
| Backend | λ°νμΌ |
| Frontend | λ°κ±΄μ° |
[νμ
]: μ λͺ©
λ³Έλ¬Έ (μ νμ¬ν)
νμ μ’ λ₯:
Feat: μλ‘μ΄ κΈ°λ₯Fix: λ²κ·Έ μμ Refactor: μ½λ 리ν©ν λ§Debug: λλ²κΉTest: ν μ€νΈ μ½λStyle: μ€νμΌ λ³κ²½Chore: λΉλ, μμ‘΄μ± λ±
μμ:
Feat: λμΆ κ²μ κΈ°λ₯ μΆκ°
Fix: λμΆ μμΈ ν νμ μ€λ₯ μμ
Refactor: μ¬μ΄λλ° UI κ°μ
- μ»΄ν¬λνΈ: PascalCase (μ:
UserProfile.tsx) - μ νΈλ¦¬ν°/ν
: camelCase (μ:
useUserContext.ts) - νμ΄μ§: kebab-case (μ:
loan-details.tsx)
- camelCase μ¬μ©
- λͺ
νν μ΄λ¦ (μ:
getLoanDetails())
types.tsμ λͺ¨λ νμ μ μ- μΈν°νμ΄μ€λ
Iμ λμ¬ μλ΅
// μν¬νΈ
import { useState } from 'react';
// νμ
μ μ
interface Props {
title: string;
}
// μ»΄ν¬λνΈ
export default function Component({ title }: Props) {
// μν
const [state, setState] = useState('');
// μ΄ννΈ λ° λ‘μ§
// λ λ
return <div>{title}</div>;
}MIT License - μμ λ‘μ΄ μ¬μ©, μμ , λ°°ν¬ κ°λ₯
μ΄ νλ‘μ νΈμ λν λ¬Έμμ¬νμ μ΄μλ₯Ό ν΅ν΄ μ£ΌμκΈ° λ°λλλ€.