From 17ab07864947de95353f7d5fc4045f0725e09ae4 Mon Sep 17 00:00:00 2001 From: yim0327 Date: Tue, 19 Nov 2024 18:41:45 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=ED=95=A0=20=EC=9D=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/TaskService.java | 21 +++++++++++++ .../TecheerPartnersApiSessionApplication.java | 2 +- .../controller/TaskController.java | 30 +++++++++++++++++++ .../dto/TaskRequestDto.java | 22 ++++++++++++++ .../entity/Task.java | 21 +++++++++++++ .../repository/TaskRepository.java | 9 ++++++ 6 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java create mode 100644 src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java create mode 100644 src/main/java/com/example/techeer_partners_api_session/dto/TaskRequestDto.java create mode 100644 src/main/java/com/example/techeer_partners_api_session/entity/Task.java create mode 100644 src/main/java/com/example/techeer_partners_api_session/repository/TaskRepository.java diff --git a/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java b/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java new file mode 100644 index 0000000..ebe2b76 --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java @@ -0,0 +1,21 @@ +package com.example.techeer_partners_api_session.Service; + +import com.example.techeer_partners_api_session.dto.TaskRequestDto; +import com.example.techeer_partners_api_session.entity.Task; +import com.example.techeer_partners_api_session.repository.TaskRepository; +import org.springframework.stereotype.Service; + +@Service +public class TaskService { + + private final TaskRepository taskRepository; + + public TaskService(TaskRepository taskRepository){ + this.taskRepository = taskRepository; + } + + public void createTask(TaskRequestDto dto){ + Task task = new Task(dto.getTitle()); + taskRepository.save(task); + } +} diff --git a/src/main/java/com/example/techeer_partners_api_session/TecheerPartnersApiSessionApplication.java b/src/main/java/com/example/techeer_partners_api_session/TecheerPartnersApiSessionApplication.java index dd01199..98d5d29 100644 --- a/src/main/java/com/example/techeer_partners_api_session/TecheerPartnersApiSessionApplication.java +++ b/src/main/java/com/example/techeer_partners_api_session/TecheerPartnersApiSessionApplication.java @@ -10,4 +10,4 @@ public static void main(String[] args) { SpringApplication.run(TecheerPartnersApiSessionApplication.class, args); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java b/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java new file mode 100644 index 0000000..614f7b5 --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java @@ -0,0 +1,30 @@ +package com.example.techeer_partners_api_session.controller; + +import com.example.techeer_partners_api_session.Service.TaskService; +import com.example.techeer_partners_api_session.dto.TaskRequestDto; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/tasks") +public class TaskController { + private final TaskService taskService; + + public TaskController(TaskService taskService){ + this.taskService = taskService; + } + + @PostMapping + public ResponseEntity> createTask (@RequestBody TaskRequestDto dto) { + taskService.createTask(dto); + Map response = new HashMap<>(); + response.put("message", "할 일이 성공적으로 생성되었습니다."); + return ResponseEntity.status(201).body(response); + } +} diff --git a/src/main/java/com/example/techeer_partners_api_session/dto/TaskRequestDto.java b/src/main/java/com/example/techeer_partners_api_session/dto/TaskRequestDto.java new file mode 100644 index 0000000..1943733 --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/dto/TaskRequestDto.java @@ -0,0 +1,22 @@ +package com.example.techeer_partners_api_session.dto; + + +public class TaskRequestDto { + + private final String title; + + private final boolean isDone; + + public TaskRequestDto(String title, boolean isDone){ + this.title = title; + this.isDone = isDone; + } + + public String getTitle() { + return title; + } + + public boolean isDone() { + return isDone; + } +} diff --git a/src/main/java/com/example/techeer_partners_api_session/entity/Task.java b/src/main/java/com/example/techeer_partners_api_session/entity/Task.java new file mode 100644 index 0000000..4da2965 --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/entity/Task.java @@ -0,0 +1,21 @@ +package com.example.techeer_partners_api_session.entity; + +import jakarta.persistence.*; + +@Entity +public class Task { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + private boolean isDone = false; + + public Task() {} + + public Task(String title){ + this.title = title; + } +} diff --git a/src/main/java/com/example/techeer_partners_api_session/repository/TaskRepository.java b/src/main/java/com/example/techeer_partners_api_session/repository/TaskRepository.java new file mode 100644 index 0000000..1e5d914 --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/repository/TaskRepository.java @@ -0,0 +1,9 @@ +package com.example.techeer_partners_api_session.repository; + +import com.example.techeer_partners_api_session.entity.Task; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface TaskRepository extends JpaRepository { +} From fc49b5395bf0f95c8bca9bf3305194d55de2d256 Mon Sep 17 00:00:00 2001 From: yim0327 Date: Wed, 20 Nov 2024 13:18:57 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=ED=95=A0=20=EC=9D=BC=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/TaskService.java | 22 +++++++- .../controller/TaskController.java | 54 +++++++++++++++++-- .../entity/Task.java | 10 +++- .../repository/TaskRepository.java | 3 ++ 4 files changed, 80 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java b/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java index ebe2b76..d12a54e 100644 --- a/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java +++ b/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java @@ -5,6 +5,8 @@ import com.example.techeer_partners_api_session.repository.TaskRepository; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class TaskService { @@ -15,7 +17,23 @@ public TaskService(TaskRepository taskRepository){ } public void createTask(TaskRequestDto dto){ - Task task = new Task(dto.getTitle()); - taskRepository.save(task); + Task task = new Task(dto.getTitle()); // 할 일 객체 생성 + taskRepository.save(task); // 객체 저장 + } + + public List getAllTasks() { // 전체 할 일 조회 + List tasks = taskRepository.findAll(); + // Task 객체를 TaskRequestDto로 변환하여 반환 + return tasks.stream() + .map(Task::toRequestDto) + .toList(); + } + + public List getTasksByIsDoneStatus(boolean isDone) { // 할 일 상태 조회 + List tasks = taskRepository.findByIsDone(isDone); + // Task 객체를 TaskRequestDto로 변환하여 반환 + return tasks.stream() + .map(Task::toRequestDto) + .toList(); } } diff --git a/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java b/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java index 614f7b5..e905da8 100644 --- a/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java +++ b/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java @@ -3,16 +3,15 @@ import com.example.techeer_partners_api_session.Service.TaskService; import com.example.techeer_partners_api_session.dto.TaskRequestDto; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; @RestController -@RequestMapping("/tasks") +@RequestMapping("/tasks") // 상위 경로 public class TaskController { private final TaskService taskService; @@ -27,4 +26,49 @@ public ResponseEntity> createTask (@RequestBody TaskRequestD response.put("message", "할 일이 성공적으로 생성되었습니다."); return ResponseEntity.status(201).body(response); } + + // 1. 전체 할 일 조회 + @GetMapping + public ResponseEntity> getAllTasks() { + List tasks = taskService.getAllTasks(); + + // 응답 데이터 구성 + Map response = new LinkedHashMap<>(); + response.put("status", "success"); + response.put("message", "모든 일이 조회되었습니다."); + response.put("data", tasks); + + // 201 상태 코드와 함께 DTO 반환 + return ResponseEntity.status(201).body(response); + } + + // 2. 완료된 할 일 조회 + @GetMapping("/completed") // 하위 경로 + public ResponseEntity> getIsDoneTasks() { + List isDoneTasks = taskService.getTasksByIsDoneStatus(true); + + // 응답 데이터 구성 + Map response = new LinkedHashMap<>(); + response.put("status", "success"); + response.put("message", "완료 된 일이 조회되었습니다."); + response.put("data", isDoneTasks); + + // 201 상태 코드와 함께 DTO 반환 + return ResponseEntity.ok(response); + } + + // 3. 미완료된 할 일 조회 + @GetMapping("/uncompleted") // 하위 경로 + public ResponseEntity> getNotIsDoneTasks() { + List notIsDoneTasks = taskService.getTasksByIsDoneStatus(false); + + // 응답 데이터 구성 + Map response = new LinkedHashMap<>(); + response.put("status", "success"); + response.put("message", "미완료 된 일이 조회되었습니다."); + response.put("data", notIsDoneTasks); + + // 201 상태 코드와 함께 DTO 반환 + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/com/example/techeer_partners_api_session/entity/Task.java b/src/main/java/com/example/techeer_partners_api_session/entity/Task.java index 4da2965..f7117e8 100644 --- a/src/main/java/com/example/techeer_partners_api_session/entity/Task.java +++ b/src/main/java/com/example/techeer_partners_api_session/entity/Task.java @@ -1,5 +1,6 @@ package com.example.techeer_partners_api_session.entity; +import com.example.techeer_partners_api_session.dto.TaskRequestDto; import jakarta.persistence.*; @Entity @@ -13,9 +14,14 @@ public class Task { private boolean isDone = false; - public Task() {} + public Task() {} // JPA의 엔티티 클래스 접근을 위한 기본 생성자 - public Task(String title){ + public Task(String title){ // 할 일 제목 생성 this.title = title; } + + // Task 객체를 TaskRequestDto로 변환 + public TaskRequestDto toRequestDto() { + return new TaskRequestDto(this.title, this.isDone); + } } diff --git a/src/main/java/com/example/techeer_partners_api_session/repository/TaskRepository.java b/src/main/java/com/example/techeer_partners_api_session/repository/TaskRepository.java index 1e5d914..225f634 100644 --- a/src/main/java/com/example/techeer_partners_api_session/repository/TaskRepository.java +++ b/src/main/java/com/example/techeer_partners_api_session/repository/TaskRepository.java @@ -4,6 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface TaskRepository extends JpaRepository { + List findByIsDone(boolean isDone); } From 440c3a744c81ed5dde12ef266207e2150ffa52c0 Mon Sep 17 00:00:00 2001 From: yim0327 Date: Wed, 20 Nov 2024 19:30:09 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=ED=95=A0=20=EC=9D=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/TaskService.java | 16 ++++++++++++++ .../controller/GlobalExceptionHandler.java | 21 +++++++++++++++++++ .../controller/TaskController.java | 12 +++++++++++ .../entity/Task.java | 8 +++++++ 4 files changed, 57 insertions(+) create mode 100644 src/main/java/com/example/techeer_partners_api_session/controller/GlobalExceptionHandler.java diff --git a/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java b/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java index d12a54e..1ee2c4a 100644 --- a/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java +++ b/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java @@ -36,4 +36,20 @@ public List getTasksByIsDoneStatus(boolean isDone) { // 할 일 .map(Task::toRequestDto) .toList(); } + + public TaskRequestDto updateTask(Long id, TaskRequestDto dto) { + // 1. Task 찾기 + Task task = taskRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("해당 ID의 할 일이 존재하지 않습니다.")); + + // 2. Task 수정 + if (dto.getTitle() != null) { + task.setTitle(dto.getTitle()); + } + task.setIsDone(dto.isDone()); // true/false 업데이트 + + // 3. 저장 후 반환 + taskRepository.save(task); + return task.toRequestDto(); + } } diff --git a/src/main/java/com/example/techeer_partners_api_session/controller/GlobalExceptionHandler.java b/src/main/java/com/example/techeer_partners_api_session/controller/GlobalExceptionHandler.java new file mode 100644 index 0000000..f6a6c9f --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/controller/GlobalExceptionHandler.java @@ -0,0 +1,21 @@ +package com.example.techeer_partners_api_session.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import java.util.HashMap; +import java.util.Map; + +@ControllerAdvice +public class GlobalExceptionHandler { + + // IllegalArgumentException 처리 + @ExceptionHandler + public ResponseEntity> handleIllegalArgumentException(IllegalArgumentException ex){ + Map response = new HashMap<>(); + response.put("error", ex.getMessage()); // 에러 메시지 + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response); // 404 상태 코드 + } +} diff --git a/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java b/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java index e905da8..1fbc8f5 100644 --- a/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java +++ b/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java @@ -71,4 +71,16 @@ public ResponseEntity> getNotIsDoneTasks() { // 201 상태 코드와 함께 DTO 반환 return ResponseEntity.ok(response); } + + @PatchMapping("/{id}") + public ResponseEntity> updateTask(@PathVariable Long id, @RequestBody TaskRequestDto dto) { + TaskRequestDto updatedTask = taskService.updateTask(id, dto); + + Map response = new LinkedHashMap<>(); + response.put("status", "success"); + response.put("message", "할 일이 성공적으로 수정되었습니다."); + response.put("data", updatedTask); + + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/com/example/techeer_partners_api_session/entity/Task.java b/src/main/java/com/example/techeer_partners_api_session/entity/Task.java index f7117e8..bb79a95 100644 --- a/src/main/java/com/example/techeer_partners_api_session/entity/Task.java +++ b/src/main/java/com/example/techeer_partners_api_session/entity/Task.java @@ -24,4 +24,12 @@ public Task(String title){ // 할 일 제목 생성 public TaskRequestDto toRequestDto() { return new TaskRequestDto(this.title, this.isDone); } + + public void setTitle(String title) { + this.title = title; + } + + public void setIsDone(boolean done) { + isDone = done; + } } From ccfbd1ce038c4b5444e03d3b8fbd295b63123fea Mon Sep 17 00:00:00 2001 From: yim0327 Date: Thu, 21 Nov 2024 16:03:54 +0900 Subject: [PATCH 4/4] =?UTF-8?q?faet:=20=ED=95=A0=20=EC=9D=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../techeer_partners_api_session/Service/TaskService.java | 8 +++++++- .../controller/TaskController.java | 8 ++++++++ .../techeer_partners_api_session/dto/TaskRequestDto.java | 4 ++-- .../example/techeer_partners_api_session/entity/Task.java | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java b/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java index 1ee2c4a..95789ae 100644 --- a/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java +++ b/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java @@ -46,10 +46,16 @@ public TaskRequestDto updateTask(Long id, TaskRequestDto dto) { if (dto.getTitle() != null) { task.setTitle(dto.getTitle()); } - task.setIsDone(dto.isDone()); // true/false 업데이트 + task.setIsDone(dto.getIsDone()); // true/false 업데이트 // 3. 저장 후 반환 taskRepository.save(task); return task.toRequestDto(); } + + public void deleteTask(Long id) { + Task task = taskRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("해당 ID의 할 일이 존재하지 않습니다.")); + taskRepository.delete(task); + } } diff --git a/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java b/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java index 1fbc8f5..2553799 100644 --- a/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java +++ b/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java @@ -83,4 +83,12 @@ public ResponseEntity> updateTask(@PathVariable Long id, @Re return ResponseEntity.ok(response); } + + @DeleteMapping("/{id}") + public ResponseEntity> deleteTask(@PathVariable Long id) { + taskService.deleteTask(id); + Map response = new HashMap<>(); + response.put("message", "할 일이 성공적으로 삭제되었습니다."); + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/com/example/techeer_partners_api_session/dto/TaskRequestDto.java b/src/main/java/com/example/techeer_partners_api_session/dto/TaskRequestDto.java index 1943733..ce29358 100644 --- a/src/main/java/com/example/techeer_partners_api_session/dto/TaskRequestDto.java +++ b/src/main/java/com/example/techeer_partners_api_session/dto/TaskRequestDto.java @@ -16,7 +16,7 @@ public String getTitle() { return title; } - public boolean isDone() { + public boolean getIsDone() { return isDone; } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/techeer_partners_api_session/entity/Task.java b/src/main/java/com/example/techeer_partners_api_session/entity/Task.java index bb79a95..e37c504 100644 --- a/src/main/java/com/example/techeer_partners_api_session/entity/Task.java +++ b/src/main/java/com/example/techeer_partners_api_session/entity/Task.java @@ -30,6 +30,6 @@ public void setTitle(String title) { } public void setIsDone(boolean done) { - isDone = done; + this.isDone = done; } }