
μ΄μ λ Task CRUDκΉμ§ λ§λ€μλ€λ©΄,
μ€λμ flowbitμ ν΅μ¬ ꡬ쑰λ₯Ό λ§λλ λ μ΄μλ€.
β μνλ₯Ό μ μ₯νλ κ² μλλΌ, μν λ³νλ₯Ό κΈ°λ‘νλ ꡬ쑰
κΈ°μ‘΄ ꡬ쑰λ λ¨μνλ€.
Task.status = TODO / IN_PROGRESS / DONE
μμ μ΄ νΉμ μν(BLOCKED λ±)κ° λμμ λ
μ λ§νλμ§
μΈμ λΆν° λ§νλμ§
κ·Έ μ μ μ΄λ€ μνμλμ§
λ₯Ό μ μ μμλ€
κ·Έλμ ꡬ쑰λ₯Ό μ΄λ κ² λλ΄λ€.
Task β νμ¬ μν
TaskEvent β μν λ³ν μ΄λ ₯
μ¦,
μν = κ²°κ³Ό
μ΄λ²€νΈ = κ³Όμ
κ²°κ³Όλ§ λ³΄λ©΄ μ μ μλ μ 보λ₯Ό
κ³Όμ μΌλ‘ λ€μ μΆμ ν μ μκ² λλ€
TaskEventλ μν λ³ν μ체λ₯Ό κΈ°λ‘νλ κ°μ²΄λ€.
public class TaskEvent {
private Long taskId;
private TaskEventType eventType;
private TaskStatus fromStatus;
private TaskStatus toStatus;
private String description;
private LocalDateTime createdAt;
}
ν΅μ¬ νλλ§ λ³΄λ©΄:
eventType β μ΄λ€ μ΄λ²€νΈμΈμ§
fromStatus β μ΄μ μν
toStatus β λ³κ²½λ μν
createdAt β λ°μ μμ
μ΄ κ΅¬μ‘°λ‘ μν νλ¦μ κ·Έλλ‘ λ³΅μν μ μλ€.
TODO β IN_PROGRESS β DONE
λ¨μ CRUDλ₯Ό λμ΄μ μν λ³κ²½ APIλ₯Ό λ§λ€μλ€.
PATCH /tasks/{id}/start
β TODO β IN_PROGRESS
PATCH /tasks/{id}/complete
β IN_PROGRESS β DONE
PATCH /tasks/{id}/block
β TODO / IN_PROGRESS β BLOCKED
PATCH /tasks/{id}/delete
β μ΄λ€ μνλ β DELETED
μλλ μ€μ λ‘ Taskλ₯Ό μμ±ν λ€ μμ νμ λμ μ΄λ²€νΈ λ‘κ·Έμ΄λ€.
μνλ§ λ°λλ κ² μλλΌ CREATED β DELETED νλ¦μ΄ κ·Έλλ‘ κΈ°λ‘λλ κ²μ νμΈν μ μλ€.

μν λ³κ²½ μ μ²λ¦¬ νλ¦μ λ€μκ³Ό κ°λ€.
νμ¬ μν μ‘°ν
μν λ³κ²½
TaskEvent μμ±
DB μ μ₯
μμ:
STARTED:
TODO β IN_PROGRESS
COMPLETED:
IN_PROGRESS β DONE

μ TaskEvent ν μ΄λΈ λ°μ΄ν°λ₯Ό 보면 λ¨μν μν κ°λ§ λ°λλ κ² μλλΌ
CREATED β STARTED β COMPLETED
μ²λΌ μν λ³ν κ³Όμ μμ²΄κ° κ·Έλλ‘ λ¨λλ€
μμ μ λ°λΌ
β BLOCKED
β DELETED
κ°μ νλ¦λ ν¨κ» λ¨λλ€.
GET /tasks/{id}/events
μλ΅ μμ:
[
{ "eventType": "CREATED" },
{ "eventType": "STARTED" },
{ "eventType": "COMPLETED" }
]
μ΄κ±Έλ‘ μμ μ μ 체 νλ¦μ νμΈν μ μλ€.
λ¨μν νμ¬ μνκ° μλλΌ
μ΄λ»κ² μ΄ μνμ λλ¬νλμ§κΉμ§ λ³Ό μ μλ€
μ΄λ²€νΈ κΈ°λ° κ΅¬μ‘°λ λͺ¨λ μν λ³νλ₯Ό κΈ°λ‘νκΈ° λλ¬Έμ
λ°μ΄ν°κ° κ³μ λμ λκ³ , μ‘°ν μ 볡μ‘λκ° μ¦κ°νλ€.
νΉν νΉμ μμ μ μνλ₯Ό μ¬κ΅¬μ±νκ±°λ μ 체 νλ¦μ μ‘°νν λ μ±λ₯μ λν κ³ λ €κ° νμνλ€.
μ΄ λ¬Έμ λ μΊμ±μ΄λ μ‘°ν ꡬ쑰 μ΅μ νλ₯Ό ν΅ν΄ ν΄κ²°ν μ μλ€κ³ νλ¨νλ€.
μ²μμλ λ¨μν status κ°λ§ λ°κΎΈλ ꡬ쑰μλ€.
task.setStatus(DONE);
μ§κΈμ μ΄λ κ² λ°λμλ€.
task.complete();
taskEventRepository.save(...);
λ¨μν status κ°μ λ³κ²½νλ ꡬ쑰μμ
μν λ³νλ₯Ό νμλ‘ νννλ κ΅¬μ‘°λ‘ λ°λμλ€
μ΄λ‘ μΈν΄
μν λ³κ²½μ΄ λ¨μ κ° λ³κ²½μ΄ μλλΌ
μλ―Έ μλ μ΄λ²€νΈλ‘ κΈ°λ‘λλ€
κ²°κ³Όμ μΌλ‘
λ°μ΄ν° κ΄λ¦¬ λ°©μμ΄ μν μ€μ¬μμ
νλ¦ μ€μ¬μΌλ‘ μ νλμλ€
μνλ κ²°κ³ΌμΌ λΏμ΄λ€
μ€μν 건 λ³ν κ³Όμ μ΄λ€
λλ©μΈ κ°μ²΄κ° μν λ³κ²½μ μ±
μμ ΈμΌ νλ€
Serviceλ νλ¦μ μ‘°ν©νλ μν μ΄λ€
κ²°κ΅,
μνλ₯Ό μ μ₯νλ μμ€ν
μ΄ μλλΌ
νλ¦μ κΈ°λ‘νλ μμ€ν
μΌλ‘ μ νλλ€
CREATE βοΈ
READ βοΈ
START βοΈ
COMPLETE βοΈ
BLOCK βοΈ
DELETE βοΈ
EVENT LOGGING βοΈ
λ¨μ CRUDμμ λ²μ΄λ
μν λ³νκΉμ§ κΈ°λ‘νλ ꡬ쑰κΉμ§ νμ₯νλ€.
μν κΈ°λ° μ‘°ν (GET /tasks?status=TODO)
Project λλ©μΈ μΆκ°
μ΄λ²€νΈ μ‘°ν κ³ λν