
์ด์ ๋
TaskEvent๋ฅผ ๊ธฐ๋ฐ์ผ๋ก
์์
์ ์ํ ๋ณํ๋ฅผ ๊ธฐ๋กํ๊ณ ,
๊ทธ๊ฑธ ์กฐํํด์
ํ๋ฆ์ ๋ณด์ฌ์ฃผ๋ ๋จ๊ณ๊น์ง ์๋ค.
๊ทผ๋ฐ ์ฌ๊ธฐ์ ๋ฑ ๊ฑธ๋ฆฐ ๊ฒ ์์๋ค.
โญโ ์์ ์ ํผ์ ์กด์ฌํ๋๊ฐ?
ํ์ค์์๋ ๊ทธ๋ ์ง ์๋ค.
์์
์ ํญ์
์ด๋ค ๋จ์ ์์์ ์์ง์ธ๋ค.
๊ทธ๋์ ์ค๋ ๋ชฉํ๋ ์ด๊ฑฐ์๋ค.
โญโ ์์ ์ ํ๋์ ํ๋ฆ ๋จ์ ์์ ๋ฃ์
์๋ฅผ ๋ค์ด,
์ฌ๋ฌ ์์
์ ๋์์ ์งํํ๋ค ๋ณด๋ฉด
๊ฐ ์์
์ ํ๋ฆ์ ๋ณด์ด๋๋ฐ
โ ์ด ์์
๋ค์ด ์ ๊ฐ์ด ์กด์ฌํ๋์ง
โ ๊ฐ์ด ์ด๋ค ๋ฐฉํฅ์ผ๋ก ํ๋ฌ๊ฐ๋์ง
๋ ํ ๋ฒ์ ํ์ ํ๊ธฐ ์ด๋ ต๋ค.
์ง๊ธ๊น์ง ๊ตฌ์กฐ๋ ์ด๋ฌ๋ค.
Task โ ํ์ฌ ์ํ
TaskEvent โ ์ํ ๋ณํ
์ด๊ฑธ๋ก๋ ํ๋ฆ์ ๋ณผ ์ ์๋ค.
ํ์ง๋ง ์ด ์์ ์ด ์ ์กด์ฌํ๋์ง๋ ๋ณด์ด์ง ์๋๋ค
์์
ํ๋๋ง ๋ณด๋ฉด
ํ๋ฆ์ด ์๋๋ผ ๊ทธ๋ฅ ์ ์ด๋ค.
์ฆ,
๊ฐ๋ณ ์์
์ ๋ณํ๋ ๋ณด์ด์ง๋ง
์ ์ฒด ๋งฅ๋ฝ์ ๋ณด์ด์ง ์๋๋ค
๊ทธ๋์ ํ์ํ ๊ฒ
โญโ Project
Task ์์ Project๋ฅผ ํ๋ ์น์๋ค.
โ ์ฌ๋ฌ ์์ ์ ํ๋์ ํ๋ฆ์ผ๋ก ๋ฌถ๊ธฐ ์ํ ๋จ์๋ค
๊ตฌ์กฐ๋ ์ด๋ ๊ฒ ๋ฐ๋๋ค.
Project โ ํ๋ฆ ๋จ์
Task โ ๊ทธ ์์ ์์
TaskEvent โ ์์
๋ณํ
์ด์ ๋
โญโ ์์
ํ๋๊ฐ ์๋๋ผ
โญโ ํ๋ก์ ํธ ์์์ ์์ง์ด๋ ์์
๋ค์ด ๋๋ค
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String description;
@Enumerated(EnumType.STRING)
private ProjectStatus status;
private LocalDateTime createdAt;
private LocalDateTime startedAt;
private LocalDateTime completedAt;
private LocalDateTime deletedAt;
์ฒ์์ด๋ผ ํ๋๋ ๋จ์ํ๊ฒ ์ก์๋ค.
id
name
description
status
createdAt
startedAt
completedAt
deletedAt
Project๋ ์์ฑ, ์์, ์๋ฃ, ์ญ์ ์์ ์ ๊ฐ์ง ์ ์๋๋ก ํ๋ค.
๋์ค์ ํ๋ก์ ํธ ๋จ์ ํ์๋ผ์ธ์ ๋ง๋ค๊ธฐ ์ํด ์๊ฐ ํ๋๋ฅผ ๋ฏธ๋ฆฌ ์ด์ด๋ ์
์ด๋ค.
์ฌ๊ธฐ์ ๊ณ ๋ฏผ์ด ํ๋ ์์๋ค.
โญโ projectId๊ฐ null์ธ Task๊ฐ ์กด์ฌํ ์ ์๋๊ฐ?
๊ฒฐ๋ก ์ NO
Flowbit์ ์ ์ด์
ํ๋ฆ์ ๋ณด๋ ์์คํ
์ด๋ผ์
โญโ Task๋ ๋ฐ๋์ ์ด๋ค ํ๋ฆ ์์ ์์ด์ผ ํ๋ค
๊ทธ๋์ ๊ตฌ์กฐ๋ฅผ ์ด๋ ๊ฒ ๊ณ ์ ํ๋ค.
โญโ Task๋ ๋ฐ๋์ Project์ ์ํ๋ค
๊ทผ๋ฐ ๋งค๋ฒ projectId ๋ฃ๋ ๊ฑด ๊ท์ฐฎ๋ค.
๊ทธ๋์ ํํํ ๊ฒ ์ด๊ฑฐ๋ค.
Default Project
๋์์ ๊ฐ๋จํ๋ค.
projectId ์์ผ๋ฉด โ ๊ทธ ํ๋ก์ ํธ ์ฌ์ฉ
์์ผ๋ฉด โ Default Project ์๋ ์ฐ๊ฒฐ
Optional<Project> project = projectRepository.findByName("DEFAULT");
if (project.isPresent()) {
return project.get();
}
Project defaultProject = new Project(
"DEFAULT",
"๊ธฐ๋ณธ ํ๋ก์ ํธ",
ProjectStatus.READY,
LocalDateTime.now()
);
return projectRepository.save(defaultProject);
์ค์ ๊ตฌํ์์๋ Optional์ orElseGet์ ์ฌ์ฉํด์,
DEFAULT ํ๋ก์ ํธ๊ฐ ์์ ๋๋ง ์๋ก ์์ฑ๋๋๋ก ํ๋ค.
์ด ๊ตฌ์กฐ์ ์ฅ์ ์ ๋ช ํํ๋ค.
โ ๊ตฌ์กฐ๋ ๊นจ์ง์ง ์๋๋ค
โ Task๋ ํญ์ ํ๋ฆ ์์ ์กด์ฌํ๋ค
๊ธฐ์กด์๋ ๊ทธ๋ฅ
request.getProjectId()
์ด๊ฑธ ๊ทธ๋๋ก ์ผ๋๋ฐ
์ด์ ๋ ์์ฑ ์์ ์ ํ๋จํ๋ค.
null์ด๋ฉด โ default ํ๋ก์ ํธ ๊ฐ์ ธ์ค๊ธฐ
์์ผ๋ฉด โ ์กด์ฌํ๋์ง ๊ฒ์ฆ
Long projectId;
if (request.getProjectId() == null) {
Project defaultProject = projectService.getOrCreateDefaultProject();
projectId = defaultProject.getId();
} else {
projectId = projectRepository.findById(request.getProjectId())
.orElseThrow(() -> new IllegalArgumentException("ํ๋ก์ ํธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค."))
.getId();
}
์ด๊ฑธ ๋ฃ๊ณ ๋๋๊น
โ Task๊ฐ ์ ๋ ๊ณ ๋ฆฝ๋์ง ์๋๋ค
๊ทธ๋ฆฌ๊ณ ๋์์
โ ์ฌ์ฉ์ฑ์ ์ ์งํ๋ฉด์
โ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ ์ ์๋ ํํ๊ฐ ๋๋ค
Project๋ ์ธ๋ถ์์ ์ธ ์ ์์ด์ผ ํด์
API๋ ๊ฐ์ด ๋ง๋ค์๋ค.
POST /projects
GET /projects
GET /projects/{id}

ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ ๋จ๊ฑด ์กฐํ๊น์ง ํ์ธํ๋ค.
์ด์ ํ๋ก์ ํธ ์์ฑ โ Task ์ฐ๊ฒฐ ํ๋ฆ์ด ์์ฑ๋๋ค.
์ด์ :
์ง๊ธ:
์ฐจ์ด๋ ๋ช ํํ๋ค.
ํ ์ผ ๊ด๋ฆฌ์์
ํ๋ฆ์ ๋ค๋ฃจ๋ ๊ตฌ์กฐ๋ก ๋ฐ๋์๋ค
์ค๋ ํ ๊ฑธ ํ ์ค๋ก ์ ๋ฆฌํ๋ฉด ์ด๊ฑฐ๋ค.
ํฉ์ด์ ธ ์๋ ์์
๋ค์
ํ๋ก์ ํธ๋ผ๋ ํ๋์ ํ๋ฆ ๋จ์๋ก ๋ฌถ์๋ค
Project ๋๋ฉ์ธ โ๏ธ
Task โ Project ์ฐ๊ฒฐ โ๏ธ
Default Project โ๏ธ
์ด๋ฒคํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ โ๏ธ
ํ์๋ผ์ธ โ๏ธ
์ด์ ๋ ์ง์ง ํ๋ฆ์ ๋ค๋ฃจ๋ ๊ตฌ์กฐ๊ฐ ๋๋ค
๋ค์์ ์ด๊ฑฐ๋ค.
ํ๋ก์ ํธ ๋จ์ ํ์๋ผ์ธ
ํ๋ก์ ํธ ํ๋ฆ ๋ถ์
์ด์ ํ ๋จ๊ณ ๋ ๊ฐ๋ฉด
์์
๋จ์ ํ๋ฆ์์
ํ๋ก์ ํธ ๋จ์ ํ๋ฆ์ผ๋ก ํ์ฅ๋๋ค