๋น์ ์ ์ํ ์๋ก์ด ์ผ์ ๊ด๋ฆฌ, 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