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..95789ae --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/Service/TaskService.java @@ -0,0 +1,61 @@ +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; + +import java.util.List; + +@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); // 객체 저장 + } + + 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(); + } + + 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.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/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/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 new file mode 100644 index 0000000..2553799 --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java @@ -0,0 +1,94 @@ +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.*; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +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); + } + + // 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); + } + + @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); + } + + @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 new file mode 100644 index 0000000..ce29358 --- /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 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 new file mode 100644 index 0000000..e37c504 --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/entity/Task.java @@ -0,0 +1,35 @@ +package com.example.techeer_partners_api_session.entity; + +import com.example.techeer_partners_api_session.dto.TaskRequestDto; +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() {} // JPA의 엔티티 클래스 접근을 위한 기본 생성자 + + public Task(String title){ // 할 일 제목 생성 + this.title = title; + } + + // Task 객체를 TaskRequestDto로 변환 + public TaskRequestDto toRequestDto() { + return new TaskRequestDto(this.title, this.isDone); + } + + public void setTitle(String title) { + this.title = title; + } + + public void setIsDone(boolean done) { + this.isDone = done; + } +} 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..225f634 --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/repository/TaskRepository.java @@ -0,0 +1,12 @@ +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; + +import java.util.List; + +@Repository +public interface TaskRepository extends JpaRepository { + List findByIsDone(boolean isDone); +}