λΉμ μ μν μλ‘μ΄ μΌμ κ΄λ¦¬, Taskify μΉκ³Ό λͺ¨λ°μΌμμ νκ³Ό ν¨κ» νΈλ¦¬νκ² μ¬μ©ν΄λ³΄μΈμ!
π λ°°ν¬ μ£Όμ: https://taskify-liard-three.vercel.app/
Taskifyλ ν νμ μ μν μΉΈλ° λ³΄λ κΈ°λ° νλ‘μ νΈ/μΌμ κ΄λ¦¬ λꡬμ λλ€. λμ보λ λ¨μ νμ , 컬λΌ/μΉ΄λ(νμ€ν¬) κ΄λ¦¬, νμ μ΄λ, λκΈ μν΅μ μ§μνλ©° λ°μν UIλ₯Ό μ 곡ν©λλ€.
- λμ보λ μμ±/μμ /μμ + μμ ν λ§ μ ν
- μΉΌλΌ/μΉ΄λ(νμ€ν¬) CRUD, νκ·Έ/λ΄λΉμ/λ§κ°μΌ/μ΄λ―Έμ§ 첨λΆ
- μ΄λ μλ½/κ±°μ , ꡬμ±μ/μ΄λ λ΄μ κ΄λ¦¬
- λκΈ μμ±/μμ /μμ , (μꡬμ¬ν κΈ°μ€) 무ν μ€ν¬λ‘€ μ§μ μμ
| μ΄λ¦ | μν | μ£Όμ λ΄λΉ |
|---|---|---|
| μ΄μ¬μ€ | μ μ ννΈ | λ‘κ·ΈμΈΒ·νμκ°μ , κ³μ κ΄λ¦¬, λ©μΈ νμ΄μ§/ν€λ, Auth API, λ‘κ·ΈμΈ μ μ§ λ‘μ§ |
| μ¬μμ§ | λμ보λ κ΄λ¦¬ | λμ λμ보λ, λμ보λ μμ νμ΄μ§ |
| λ°μν | λμ보λ | λμ보λ μμΈ, ν μΌ λͺ¨λ¬, DnD, ν μΌ μΉ΄λ CRUD |
| κΆμν | κ³΅ν΅ μ½λ | CSSΒ·fetch μΈν , κ³΅μ© μ»΄ν¬λνΈ(Button/Chip/Input/Header/Sidebar), κ³΅ν΅ hooks, μΉΌλΌ/μ΄λ λͺ¨λ¬ |
- 곡ν΅: μ§μ ν°νΈ/컬λ¬, λ°μν, κ³΅μ© μ»΄ν¬λνΈ, μ΄λ―Έμ§ μλ¬Έ νμΌλͺ
- λ€λΉ/μ¬μ΄λλ°: λλ‘λ€μ΄(λ‘κ·Έμμ/λ΄ μ 보/λ΄ λμ보λ), μ¬μ΄λλ° νμ΄μ§λ€μ΄μ , '+' μ μμ± λͺ¨λ¬
- μΈμ¦: λ‘κ·ΈμΈ/νμκ°μ μ ν¨μ± λ° μλ¬ νΈλ€λ§, λ‘κ·ΈμΈ μ±κ³΅ μ μ‘μΈμ€ ν ν° λ°κΈ
- λλ©: λ‘κ³ /λ‘κ·ΈμΈ/νμκ°μ λΌμ°ν , λ‘κ·ΈμΈ μνλ©΄ 첫 λμ보λλ‘ μ΄λ
- λμ λμ보λ: λ΄κ° λ§λ λμ보λμ π, λ΄ λμ보λ νμ΄μ§λ€μ΄μ , μ΄λλ°μ λμ보λ 무ν μ€ν¬λ‘€/κ²μ/μλ½Β·κ±°μ
- λμ보λ μμΈ: μλ¨ λ©€λ² νμ, κ° μ»¬λΌ μΉ΄λ κ°μ, κ΄λ¦¬ λ²νΌ(edit), μ΄λνκΈ°/μ»¬λΌ μΆκ°/μμ λͺ¨λ¬, μΉ΄λ μμ± λͺ¨λ¬ λ° μμΈ λͺ¨λ¬
- λμ보λ μμ±Β·μμ Β·κ΄λ¦¬: μμ±/μμ /μμ , ꡬμ±μ/μ΄λλ΄μ νμ΄μ§λ€μ΄μ , μ΄λ/μ·¨μ
- μΉ΄λ μμΈ/λκΈ: λκΈ CRUD, 무ν μ€ν¬λ‘€, μΉ΄λ μμ /μμ
- κ³μ κ΄λ¦¬: νλ‘ν μ΄λ―Έμ§ μ λ‘λ, λλ€μ μμ , λΉλ°λ²νΈ λ³κ²½ μ ν¨μ± λ° μλ¬ μ²λ¦¬
- νλ‘μ νΈ μΌμ /κ³ν μ립, μ΄κΈ° μν λ°°λΆ
- νμ κ·μΉ λ° μ»¨λ²€μ νμ
- νλ‘μ νΈ μΈν (Next.js, Tailwind, ESLint, Prettier)
- VSCode/ESLint/Prettier μ€μ 곡μ
- ν΄λ ꡬ쑰 νμ , Tailwind κΈλ‘λ² ν ν° μ μ©
- νμ΄μ§ UI ꡬν: Dashboard, MyDashboard, Dashboard/Edit, MyPage, Login, Signup, Home
- κ³΅μ© μ»΄ν¬λνΈ κΈ°λ³Έμ ꡬν (Button/Chip/Input/Modal λ±)
- 1μ°¨ κΈ°λ₯ μ°κ²°: λ‘κ·ΈμΈ/νμκ°μ , λμ보λ μμ±/μμ λ±
- λ©ννκ·Έ/νλΉμ½, 404, λ‘λ© μν(μ€μΌλ ν€/λ‘λ© UI), framer-motion
- Header/SideMenu λ°μ΄ν° μ°λ, νμ΄μ§λ€μ΄μ
- ν μ€νΈ κ³μ μΌλ‘ μ΄λ/νμ κΈ°λ₯ ν μ€νΈ (μν)
- κΈ°λ₯ νμ₯
- Dashboard: λ°μ΄ν° μ°λ, μΉΌλΌ μΆκ°, 무ν μ€ν¬λ‘€, DnD, λκΈ μμ /μμ , μΉ΄λ CRUD, μΉΌλΌ μΆκ°/μμ λͺ¨λ¬
- MyDashboard: API μ°λ, νμ΄μ§λ€μ΄μ , 무ν μ€ν¬λ‘€, λμ보λ μΆκ° λͺ¨λ¬, μ΄λ μλ½/κ±°μ
- Dashboard/Edit: API μ°λ, ꡬμ±μ/μ΄λλ΄μ νμ΄μ§λ€μ΄μ , μμ /μμ /μ΄λμλ½/κ±°μ
- MyPage: λ°μ΄ν° μ°λ, νλ‘ν/λΉλ°λ²νΈ λ³κ²½
- Login/Signup: μ λ ₯ μ ν¨μ±, λ‘μ§ λ¦¬ν©ν λ§
- Local state & URL κΈ°λ°
- Avoided global state libraries (Context API μ§μ)
- Shared fetch wrapper
- Configured with
credentials: 'include'
- API: RESTful
- μΈμ¦: μ‘μΈμ€ ν ν° λ°κΈ (μꡬμ¬ν κΈ°λ°), μΏ ν€/λ‘컬 μ λ΅μ ν κ·μΉμ λ§μΆ° fetch λνΌλ‘ μΌμν
- μ΄λ―Έμ§ μ λ‘λ: νλ‘ν/μΉ΄λ μ΄λ―Έμ§ μ λ‘λ μλν¬μΈνΈ λΆλ¦¬ μ€μ
- Auth: POST /auth/signin, POST /auth/signup, PUT /auth/password
- Users: GET /users/me, PUT /users/me, POST /users/me/image
- Dashboards: GET/POST /dashboards, PUT/DELETE /dashboards/:id
- Columns: POST /columns, PUT/DELETE /columns/:id
- Cards: POST /cards, PUT/DELETE /cards/:id
- Comments: POST /comments, PUT/DELETE /comments/:id
src/
ββ components/ # μ¬μ¬μ© μ»΄ν¬λνΈ
β ββ auth/ # μΈμ¦
β ββ dashboard/ # λμ보λ
β ββ home/ # ν(λλ©)
β ββ layout/ # λ μ΄μμ
β ββ mydashboard/ # λμ λμ보λ
β ββ ui/ # UI νμ΄λ°μ΄μ
ββ hooks/ # 컀μ€ν
ν
ββ lib/ # μ νΈ & API
ββ pages/ # Next.js Page Router
ββ styles/ # μ μ/λͺ¨λ μ€νμΌ
ββ stories/ # Storybook
ββ utils/ # ν¬νΌ
AuthButton, EmailInput, PasswordInput, UnifiedModal
DashboardColumn, ColumnTaskCard, AddColumnButton, AddTaskButton
TaskDetailModal, CreateTaskForm, EditTaskForm, CreateColumnForm, ManageColumnForm
μλΉμ€ μκ°, λ‘κ·ΈμΈ/νμκ°μ λΌμ°ν
μ ν¨μ±/μλ¬ μ²λ¦¬, μ±κ³΅ μ 리λ€μ΄λ νΈ
λ΄κ° λ§λ λμ보λ(π), μ΄λλ°μ λμ보λ(무ν μ€ν¬λ‘€/κ²μ/μλ½Β·κ±°μ )
컬λΌ/μΉ΄λ, λ©€λ², κ΄λ¦¬/μ΄λ, μΉ΄λ μμΈ/λκΈ
νλ‘ν νΈμ§, λΉλ°λ²νΈ λ³κ²½
# λ ν¬μ§ν 리 ν΄λ‘
git clone https://github.com/codeit-team-project/taskify.git
# ν¨ν€μ§ μ€μΉ
yarn install # λλ npm install
# κ°λ° μλ²
yarn dev # λλ npm run devyarn build
yarn test
yarn storybookNEXT_PUBLIC_API_URL=http://localhost:3000/api- λΈλμΉ: main(λ°°ν¬), develop(ν΅ν©), feature/-, hotfix/*
- λ¨Έμ§ μ λ΅: featureβdevelop = Squash & Merge / developβmain = Merge / hotfixβmain = Merge
- μ»€λ° μ»¨λ²€μ
: type(scope): subject - #μ΄μλ²νΈ
- type: feat fix refactor style docs chore perf build revert
- λ€μ΄λ°: μ»΄ν¬λνΈ(PascalCase) / νμΌΒ·ν΄λ(kebab-case) / λ³μΒ·ν¨μ(camelCase) / μμ(SNAKE_CASE)
- μνκ΄λ¦¬: μ μ λΌμ΄λΈλ¬λ¦¬ λ―Έμ¬μ© (Context μ§μ) β λ‘컬 state/URL νμ©
- μ½λ μμΉ: SRP, λ§€μ§λλ² μμν, μν¬νΈ μμ(μΈλΆβλ΄λΆβμ€νμΌ), μΆμ½ν κΈμ§
- ν¬λ§·ν : μ μ₯ μ Prettier/ESLint μλμμ , Tailwind IntelliSense
- μ΄λ©μΌΒ·λΉλ°λ²νΈ νμ κ²μ¦, ν¬μ»€μ€ μμ μ μλ¬ λ©μμ§
- λΉλ°λ²νΈ ν κΈ(λ μμ΄μ½), μ€λ³΅ μ΄λ©μΌ λͺ¨λ¬
- μ±κ³΅ μ 리λ€μ΄λ νΈ(/mydashboard) λ° ν ν° λ°κΈ(μꡬμ¬ν)
- νλ‘ν μ΄λ―Έμ§ μ λ‘λ, λλ€μ μμ
- λΉλ°λ²νΈ λ³κ²½: μΌμΉ/λΆμΌμΉ κ²μ¦, μλ¬ λ¬Έκ΅¬, μ±κ³΅ μ²λ¦¬
- λͺ¨λ¬ κΈ°λ° CRUD, 무ν μ€ν¬λ‘€(μꡬ μμ), νμ΄μ§λ€μ΄μ (μꡬ μμ)
- next / react / typescript / tailwindcss
- eslint / prettier
- @storybook/react, vitest