์ด์ ๊น์ง๋
์ด๋ฒคํธ๋ฅผ ๊ธฐ๋กํ๊ณ
๊ทธ ์ด๋ฒคํธ๋ฅผ ํด์ํด์
ํ๋ก์ ํธ ์ํ๋ฅผ ๋์ถํ๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์๋ค
์ฆ,
๋ฐ์ดํฐ๋ ์์ฑ๋ ์ํ
โ ๋ฐฑ์๋ ๊ธฐ์ค์์๋ ์ด๋ฏธ ๋ชจ๋ ์ ๋ณด๊ฐ ๊ณ์ฐ ๊ฐ๋ฅํ ์ํ์๋ค
๊ทผ๋ฐ ๋ฌธ์ ๋ ํ๋์๋ค.
โ ์ด๊ฒ ๋์ ์ ๋ณด์ธ๋ค
๊ทธ๋์ ์ค๋ ๋ชฉํ๋ ๋ช ํํ๋ค.
โ ํ๋ฆ์ ๋ณด์ด๊ฒ ๋ง๋ค์
์ค๋์ ์ฒ์์ผ๋ก ํ๋ก ํธ๋ฅผ ๋ถ์๋ค.
Vite + React + TypeScript ํ๊ฒฝ ์ธํ
axios ๊ธฐ๋ฐ API ํต์ ๋ชจ๋ ๋ถ๋ฆฌ
taskApi, projectApi ๊ตฌ์กฐ ์ค๊ณ
ํ๋ก ํธ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค

์ด์ ๋ถํฐ๋
API๋ฅผ ํ
์คํธํ๋ ๊ฒ ์๋๋ผ
์ค์ ๋ก ์ฌ์ฉํ๋ ๋จ๊ณ
์ด๊ธฐ UI๋ ๋จ์ํ๋ค.
Task 1
Task 2
Task 3
๊ทผ๋ฐ ์ด๊ฑด Flowbit ๋ฐฉํฅ์ด ์๋์๋ค.
Flowbit์
์์ ํ๋ฆ์ ๋ณด๋ ์์คํ
๊ทธ๋์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฟจ๋ค.
Project
โโ Task
โโ Task
โโ Task
Project ์ค์ฌ์ผ๋ก ์์
์ ๋ฌถ์ด
ํ๋ฆ ๋จ์๋ก ๋ณผ ์ ์๋ Workspace ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํ๋ค
ํ๋ก ํธ์์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ง์ ์ ์ดํ ์ ์๊ฒ ๋ง๋ค์๋ค

์ด์ ๋
Postman ์์ด UI์์ ์ง์ ์กฐ์ ๊ฐ๋ฅํ๋ค
๊ฐ ์ก์
์ axios ๊ธฐ๋ฐ API ํธ์ถ๋ก
๋ฐฑ์๋์ ๋ฐ๋ก ์ฐ๊ฒฐ๋๋๋ก ๊ตฌ์ฑํ๋ค
๊ธฐ์กด ์ํ:
TODO / IN_PROGRESS / BLOCKED / DONE
๋ณ๊ฒฝ:
๋๊ธฐ / ์งํ์ค / ๋ณด๋ฅ / ์๋ฃ
๊ทธ๋ฆฌ๊ณ
โ ์๊ฐ์ ํผ๋๋ฐฑ ๊ฐํ
๊ฐ๋ฐ์ฉ UI์์ ์๋น์ค UI๋ก ์ ํํ๋ค
โ ์ฌ์ฉ ํ๋ฆ์ ๋จ์ํ
๋ฌธ์ :
โ ํ๋ก์ ํธ ์ญ์ ์ Task๋ ๋จ์์์
ํด๊ฒฐ:
task.delete();
์ญ์ ๋ ํ๋ก์ ํธ์ Task๋ ํ๋ฉด์์ ์ ์ธ
์กฐํ ์กฐ๊ฑด์์๋ ์ ์ธ๋๋๋ก ํต์ผ
โ ๋ฐ์ดํฐ ์ ํฉ์ฑ ๋ฌธ์ ํด๊ฒฐ
๊ธฐ์กด:
Project.status = DB ๊ฐ
๋ณ๊ฒฝ:
Project.status = Task ์ํ ๊ธฐ๋ฐ ๊ณ์ฐ
if (tasks.isEmpty()) return "READY";
if (hasBlocked) return "BLOCKED";
if (hasInProgress) return "IN_PROGRESS";
if (allDone) return "DONE";
โ ์ํ๋ฅผ ์ ์ฅํ์ง ์๊ณ ๋์ถํ๋ค
์ํ๋ฅผ ์ ์ฅํ๋ฉด ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ํญ์ Task ๊ธฐ์ค์ผ๋ก ๊ณ์ฐํ๋๋ก ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ค
GET /api/projects/{id}/timeline

์ด๋ฒคํธ๊ฐ ์๊ฐ์์ผ๋ก ๋์ด๋ ๋ฟ ์์ ๋จ์ ํ๋ฆ์ด ๋ณด์ด์ง ์์๋ค
timeline.reduce((acc, event) => {
if (!acc[event.taskId]) {
acc[event.taskId] = {
taskTitle: event.taskTitle,
events: [],
};
}
acc[event.taskId].events.push(event);
return acc;
}, {});
๊ฒฐ๊ณผ:

taskId ๊ธฐ์ค์ผ๋ก ์ด๋ฒคํธ ๊ทธ๋ฃนํ
์์
๋จ์ ํ๋ฆ์ผ๋ก ์ฌ๊ตฌ์ฑ
๋จ์ ๋ก๊ทธ โ ํ๋ฆ ๊ตฌ์กฐ๋ก ๋ณํ
GET /api/projects/{id}/analysis

โ ํ๋ก์ ํธ ์ํ๋ฅผ ํ๋์ ํ์ ๊ฐ๋ฅ
Project โ๏ธ
Task โ๏ธ
TaskEvent โ๏ธ
Timeline โ๏ธ
Analysis โ๏ธ
Workspace UI โ๏ธ
โ ๋์ํ๋ ์๋น์ค ์ํ
์ด์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ตฌํ๋๋ค.
ํ์ฌ ์ํ๋
๋ค์ ๋จ๊ณ๋
โ ์ค์ ์๋น์ค๋ก ๋ฐฐํฌํ๊ธฐ
๋๋ฉ์ธ ์ฐ๊ฒฐ
์๋ฒ ๋ฐฐํฌ
ํ๋ก ํธ / ๋ฐฑ์๋ ์ฐ๊ฒฐ
์ด์ ๋ก์ปฌ์ ๋์ด
์ค์ ํ๊ฒฝ์์ ๋์ํ๋ ๋จ๊ณ๋ก ๋ค์ด๊ฐ๋ค
โ ๊ธฐ๋ฅ ๊ตฌํ์ ๋์ด์ ์๋น์ค ๋จ๊ณ๋ก ์ ํ