From 5d9ce75b4e20e690dc441a47d09e90ad81534ce6 Mon Sep 17 00:00:00 2001 From: Juri-Jang Date: Sat, 23 Nov 2024 14:35:07 +0900 Subject: [PATCH] =?UTF-8?q?todo=20list=20api=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 + .../config/SwaggerConfig.java | 27 +++++ .../controller/TaskController.java | 107 ++++++++++++++++++ .../dto/TaskRequestDto.java | 11 ++ .../dto/TaskResponseDto.java | 12 ++ .../entity/Task.java | 26 +++++ .../repository/TaskRepository.java | 12 ++ .../service/TaskService.java | 61 ++++++++++ 8 files changed, 258 insertions(+) create mode 100644 src/main/java/com/example/techeer_partners_api_session/config/SwaggerConfig.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/dto/TaskResponseDto.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 create mode 100644 src/main/java/com/example/techeer_partners_api_session/service/TaskService.java diff --git a/build.gradle b/build.gradle index 0d20431..2c2ca0a 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' + //swagger library + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' diff --git a/src/main/java/com/example/techeer_partners_api_session/config/SwaggerConfig.java b/src/main/java/com/example/techeer_partners_api_session/config/SwaggerConfig.java new file mode 100644 index 0000000..5d14912 --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/config/SwaggerConfig.java @@ -0,0 +1,27 @@ +package com.example.techeer_partners_api_session.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +@Configuration +@EnableWebMvc +public class SwaggerConfig { + + @Bean + public OpenAPI openAPI() { + return new OpenAPI() + .components(new Components()) + .info(apiInfo()); + } + + private Info apiInfo() { + return new Info() + .title("API Test") // API의 제목 + .description("Todo list Sawgger UI") // API에 대한 설명 + .version("3.0"); // API의 버전 + } +} 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..ae7983e --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/controller/TaskController.java @@ -0,0 +1,107 @@ +package com.example.techeer_partners_api_session.controller; + +import com.example.techeer_partners_api_session.dto.TaskRequestDto; +import com.example.techeer_partners_api_session.dto.TaskResponseDto; +import com.example.techeer_partners_api_session.entity.Task; +import com.example.techeer_partners_api_session.repository.TaskRepository; +import com.example.techeer_partners_api_session.service.TaskService; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/tasks") +public class TaskController { + private final TaskService taskService; + private final TaskRepository taskRepository; + + public TaskController(TaskService taskService, TaskRepository taskRepository) { + this.taskService = taskService; + this.taskRepository = taskRepository; + } + + private ResponseEntity> createResponse(String status, String message, T data) { + Map response = new LinkedHashMap<>(); + response.put("status", status); + response.put("message", message); + if(data != null){ + response.put("data", data); + } + return ResponseEntity.ok(response); + } + + //할 일 등록 + @Operation(summary = "할 일 등록") + @PostMapping + public ResponseEntity> createTask(@RequestBody TaskRequestDto dto) { + if (dto.getTitle() == null || dto.getTitle().isBlank()) { + return createResponse("fail", "title은 필수 입력입니다.", null); + } + + taskService.createTask(dto); + return createResponse("success", "할 일이 생성 되었습니다.", null); + } + + // 전체 조회 + @Operation(summary = "할 일 전체 조회") + @GetMapping + public ResponseEntity> getTasks() { + List tasks = taskService.getAllTask(); + List taskResponseDtos = tasks.stream() + .map(task -> new TaskResponseDto(task.getId(), task.getTitle(), task.isDone())) + .collect(Collectors.toList()); + return createResponse("success", "전체 할 일이 조회되었습니다.", taskResponseDtos); + } + + // 완료된 일만 조회 + @Operation(summary = "완료된 일 조회") + @GetMapping("/completed") + public ResponseEntity> getCompletedTasks() { + List tasks = taskService.getCompletedTask(); + List taskResponseDtos = tasks.stream() + .map(task -> new TaskResponseDto(task.getId(), task.getTitle(), task.isDone())) + .collect(Collectors.toList()); + return createResponse("success", "완료된 일이 조회되었습니다.", taskResponseDtos); + } + + // 미완료된 일만 조회 + @Operation(summary = "미완료된 일 조회") + @GetMapping("/inCompleted") + public ResponseEntity> getInCompletedTasks() { + List tasks = taskService.getInCompletedTask(); + List taskResponseDtos = tasks.stream() + .map(task -> new TaskResponseDto(task.getId(), task.getTitle(), task.isDone())) + .collect(Collectors.toList()); + return createResponse("success", "미완료된 일이 조회되었습니다.", taskResponseDtos); + } + + + //할 일 수정 + @Operation(summary = "할 일 수정") + @PutMapping("/{id}") + public ResponseEntity> updateTask(@PathVariable Long id, @RequestBody TaskRequestDto dto){ + Optional task = taskRepository.findById(id); + if (task.isPresent()) { + taskService.updateTask(id, dto); // 작업이 성공적으로 이루어지면 응답 + return createResponse("success", "할 일이 수정 되었습니다.", null); + } else { + return createResponse("fail", "해당 할 일이 존재하지 않습니다.", null); + } + } + + //할 일 삭제 + @Operation(summary = "할 일 삭제") + @DeleteMapping("/{id}") + public ResponseEntity> deleteTask(@PathVariable Long id){ + Optional task = taskRepository.findById(id); + if (task.isPresent()) { + taskService.deleteTask(id); + return createResponse("success", "할 일이 삭제 되었습니다.", null); + } else { + return createResponse("fail", "해당 할 일이 존재하지 않습니다.", null); + } + } +} 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..e1983a5 --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/dto/TaskRequestDto.java @@ -0,0 +1,11 @@ +package com.example.techeer_partners_api_session.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class TaskRequestDto { + private final String title; + private final boolean isDone; +} diff --git a/src/main/java/com/example/techeer_partners_api_session/dto/TaskResponseDto.java b/src/main/java/com/example/techeer_partners_api_session/dto/TaskResponseDto.java new file mode 100644 index 0000000..cff009f --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/dto/TaskResponseDto.java @@ -0,0 +1,12 @@ +package com.example.techeer_partners_api_session.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class TaskResponseDto { + private Long id; + private String title; + private boolean 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..16accb1 --- /dev/null +++ b/src/main/java/com/example/techeer_partners_api_session/entity/Task.java @@ -0,0 +1,26 @@ +package com.example.techeer_partners_api_session.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +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..2708792 --- /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); //완료 여부 필터링 +} 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..cdb6389 --- /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; +import java.util.Optional; + +@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 getAllTask(){ + return taskRepository.findAll(); + } + + //완료된 일 조회 + public List getCompletedTask(){ + return taskRepository.findByIsDone(true); + } + + //미완료된 일 조회 + public List getInCompletedTask(){ + return taskRepository.findByIsDone(false); + } + + //할 일 수정 + public void updateTask(Long id, TaskRequestDto dto){ + Optional task = taskRepository.findById(id); + + if(task.isPresent()){ //task에 값이 존재하는지 확인 + Task existingTask = task.get(); //존재하면 해당 task get + + //할 일 수정 + if(dto.getTitle() != null){ + existingTask.setTitle(dto.getTitle()); + } + existingTask.setDone(dto.isDone()); + taskRepository.save(existingTask); + } + } + + //할 일 삭제 + public void deleteTask(Long id){ + taskRepository.deleteById(id); + } +} +