From 04e79623aeab4ee93fda640e3d648fcdf27b3259 Mon Sep 17 00:00:00 2001 From: cussle Date: Mon, 6 May 2024 22:23:46 +0900 Subject: [PATCH 1/7] add ProjectRepository --- .../devlog_springboot/repository/ProjectRepository.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/com/com/cnu/devlog_springboot/repository/ProjectRepository.java diff --git a/src/main/java/com/com/cnu/devlog_springboot/repository/ProjectRepository.java b/src/main/java/com/com/cnu/devlog_springboot/repository/ProjectRepository.java new file mode 100644 index 0000000..e823291 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/repository/ProjectRepository.java @@ -0,0 +1,9 @@ +package com.com.cnu.devlog_springboot.repository; + +import com.com.cnu.devlog_springboot.model.Project; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProjectRepository extends JpaRepository { +} From b5e9cfcd41912b1cd3d3414fb869d2054a25ab7c Mon Sep 17 00:00:00 2001 From: cussle Date: Mon, 6 May 2024 22:38:28 +0900 Subject: [PATCH 2/7] add ProjectService --- .../com/com/cnu/devlog_springboot/service/ProjectService.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java diff --git a/src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java b/src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java new file mode 100644 index 0000000..8ac50f9 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java @@ -0,0 +1,2 @@ +package com.com.cnu.devlog_springboot.service;public class ProjectService { +} From a95e6c76f975895056a0d5d6582e1fb8d45e22b3 Mon Sep 17 00:00:00 2001 From: cussle Date: Mon, 6 May 2024 22:49:58 +0900 Subject: [PATCH 3/7] minor fix --- .../DevlogSpringbootApplication.java | 8 ++- .../service/ProjectService.java | 53 ++++++++++++++++++- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplication.java b/src/main/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplication.java index 6739bf0..ce04413 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplication.java +++ b/src/main/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplication.java @@ -1,9 +1,13 @@ package com.com.cnu.devlog_springboot; +import lombok.RequiredArgsConstructor; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; -@SpringBootApplication +@RestController +@RequestMapping("/posts") +@RequiredArgsConstructor public class DevlogSpringbootApplication { public static void main(String[] args) { diff --git a/src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java b/src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java index 8ac50f9..bec3177 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java +++ b/src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java @@ -1,2 +1,53 @@ -package com.com.cnu.devlog_springboot.service;public class ProjectService { +package com.com.cnu.devlog_springboot.service; + +import com.com.cnu.devlog_springboot.model.Project; +import com.com.cnu.devlog_springboot.model.request.ProjectRequest; +import com.com.cnu.devlog_springboot.repository.ProjectRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ProjectService { + private final ProjectRepository projectRepository; + + public Project createProject(ProjectRequest projectRequest) { + return projectRepository.save(new Project( + null, + projectRequest.title(), + projectRequest.summary(), + projectRequest.contents(), + projectRequest.startDate(), + projectRequest.endDate() + )); + } + + public List getProjects() { + return projectRepository.findAll(); + } + + public Project getProject(Integer projectId) { + return projectRepository.findById(projectId) + .orElse(null); + } + + public Project updateProject(Integer projectId, ProjectRequest projectRequest) { + return projectRepository.findById(projectId) + .map(project -> { + project.setTitle(projectRequest.title()); + project.setContents(projectRequest.contents()); + project.setSummary(projectRequest.summary()); + project.setStartDate(projectRequest.startDate()); + project.setEndDate((projectRequest.endDate())); + return projectRepository.save(project); + }) + .orElse(null); + } + + public void deleteProject(Integer projectId) { + projectRepository.findById(projectId) + .ifPresent(projectRepository::delete); + } } From c77945ae8410e90e149ec32675c6f0370079230f Mon Sep 17 00:00:00 2001 From: cussle Date: Mon, 6 May 2024 22:51:01 +0900 Subject: [PATCH 4/7] add ProjectController --- .../controller/ProjectController.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/main/java/com/com/cnu/devlog_springboot/controller/ProjectController.java diff --git a/src/main/java/com/com/cnu/devlog_springboot/controller/ProjectController.java b/src/main/java/com/com/cnu/devlog_springboot/controller/ProjectController.java new file mode 100644 index 0000000..735f1a3 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/controller/ProjectController.java @@ -0,0 +1,53 @@ +package com.com.cnu.devlog_springboot.controller; + +import com.com.cnu.devlog_springboot.model.Project; +import com.com.cnu.devlog_springboot.model.request.ProjectRequest; +import com.com.cnu.devlog_springboot.service.ProjectService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/projects") +@RequiredArgsConstructor +public class ProjectController { + private final ProjectService projectService; + + // GET /projects + @GetMapping + public ResponseEntity> getProjects() { + return ResponseEntity.ok(projectService.getProjects()); + } + + // GET /projects/{projectId} + @GetMapping("{projectId}") + public ResponseEntity getProject(@PathVariable("projectId")Integer projectId) { + return ResponseEntity.ok(projectService.getProject(projectId)); + } + + // POST /projects + @PostMapping + public ResponseEntity createProject(@RequestBody final ProjectRequest request) { + return ResponseEntity.ok(projectService.createProject(request)); + } + + // PUT /projects/{projects} + // ex. localhost:8080/projects/3 + @PutMapping("{projectId}") + public ResponseEntity updateProject( + @PathVariable("projectId") final Integer projectId, + @RequestBody final ProjectRequest request + ) { + final Project project = projectService.updateProject(projectId, request); + return ResponseEntity.ok(project); + } + + // DELETE /projects/{projects} + @DeleteMapping("{projectId}") + public ResponseEntity deleteProject(@PathVariable("projectId") final Integer projectId) { + projectService.deleteProject(projectId); + return ResponseEntity.noContent().build(); + } +} From 89178fca95ec33fcbfb0e39c97e743163375f733 Mon Sep 17 00:00:00 2001 From: cussle Date: Mon, 6 May 2024 23:01:20 +0900 Subject: [PATCH 5/7] add Exception + minor fix --- .../exception/DevlogException.java | 11 +++++++ .../exception/GlobalExecptionHandler.java | 25 ++++++++++++++++ .../model/response/ErrorResponse.java | 8 +++++ .../cnu/devlog_springboot/type/ErrorCode.java | 29 +++++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100644 src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException.java create mode 100644 src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExecptionHandler.java create mode 100644 src/main/java/com/com/cnu/devlog_springboot/model/response/ErrorResponse.java create mode 100644 src/main/java/com/com/cnu/devlog_springboot/type/ErrorCode.java diff --git a/src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException.java b/src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException.java new file mode 100644 index 0000000..9da0b4e --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException.java @@ -0,0 +1,11 @@ +package com.com.cnu.devlog_springboot.exception; + +import com.com.cnu.devlog_springboot.type.ErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class DevlogException extends RuntimeException { + private final ErrorCode errorCode; +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExecptionHandler.java b/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExecptionHandler.java new file mode 100644 index 0000000..d4e6538 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExecptionHandler.java @@ -0,0 +1,25 @@ +package com.com.cnu.devlog_springboot.exception; + +import com.com.cnu.devlog_springboot.model.response.ErrorResponse; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalExecptionHandler { + @ExceptionHandler(DevlogException.class) + public ResponseEntity handleDevlogException( + HttpServletRequest request, DevlogException e + ) { + return ResponseEntity.status(e.getErrorCode().getHttpStatus()) + .body( + new ErrorResponse( + e.getErrorCode().getDescription(), + e.getErrorCode().getHttpStatus().value(), + e.getErrorCode().getErrorCode(), + request.getRequestURI() + ) + ); + } +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/model/response/ErrorResponse.java b/src/main/java/com/com/cnu/devlog_springboot/model/response/ErrorResponse.java new file mode 100644 index 0000000..0802ac0 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/model/response/ErrorResponse.java @@ -0,0 +1,8 @@ +package com.com.cnu.devlog_springboot.model.response; + +public record ErrorResponse ( + String title, + Integer status, + Integer code, + String instance +) {} diff --git a/src/main/java/com/com/cnu/devlog_springboot/type/ErrorCode.java b/src/main/java/com/com/cnu/devlog_springboot/type/ErrorCode.java new file mode 100644 index 0000000..c15d015 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/type/ErrorCode.java @@ -0,0 +1,29 @@ +package com.com.cnu.devlog_springboot.type; + +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public enum ErrorCode { + // 4XX + POST_NOT_FOUND( + HttpStatus.NOT_FOUND, + 4000, + "해당 게시글을 찾을 수 없습니다." + ), + PROJECT_NOT_FOUND( + HttpStatus.NOT_FOUND, + 4001, + "해당 프로젝트를 찾을 수 없습니다." + ); + + private final HttpStatus httpStatus; + private final Integer errorCode; + private final String description; + + ErrorCode(HttpStatus httpStatus, Integer errorCode, String description) { + this.httpStatus = httpStatus; + this.errorCode = errorCode; + this.description = description; + } +} From 9c38488dcc7c48bae7ea3a769520fca3a8e8e88f Mon Sep 17 00:00:00 2001 From: cussle Date: Mon, 6 May 2024 23:04:49 +0900 Subject: [PATCH 6/7] refactor ProjectService --- .../com/cnu/devlog_springboot/service/ProjectService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java b/src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java index bec3177..2fef9d2 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java +++ b/src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java @@ -1,8 +1,10 @@ package com.com.cnu.devlog_springboot.service; +import com.com.cnu.devlog_springboot.exception.DevlogException; import com.com.cnu.devlog_springboot.model.Project; import com.com.cnu.devlog_springboot.model.request.ProjectRequest; import com.com.cnu.devlog_springboot.repository.ProjectRepository; +import com.com.cnu.devlog_springboot.type.ErrorCode; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -30,7 +32,7 @@ public List getProjects() { public Project getProject(Integer projectId) { return projectRepository.findById(projectId) - .orElse(null); + .orElseThrow(() -> new DevlogException(ErrorCode.PROJECT_NOT_FOUND)); } public Project updateProject(Integer projectId, ProjectRequest projectRequest) { @@ -43,7 +45,7 @@ public Project updateProject(Integer projectId, ProjectRequest projectRequest) { project.setEndDate((projectRequest.endDate())); return projectRepository.save(project); }) - .orElse(null); + .orElseThrow(() -> new DevlogException(ErrorCode.PROJECT_NOT_FOUND)); } public void deleteProject(Integer projectId) { From 5d08e026f632af78b5a2fb32f37c2e5fd73cd94b Mon Sep 17 00:00:00 2001 From: cussle Date: Mon, 6 May 2024 23:14:42 +0900 Subject: [PATCH 7/7] minor fix --- .../devlog_springboot/DevlogSpringbootApplication.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplication.java b/src/main/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplication.java index ce04413..6739bf0 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplication.java +++ b/src/main/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplication.java @@ -1,13 +1,9 @@ package com.com.cnu.devlog_springboot; -import lombok.RequiredArgsConstructor; import org.springframework.boot.SpringApplication; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.boot.autoconfigure.SpringBootApplication; -@RestController -@RequestMapping("/posts") -@RequiredArgsConstructor +@SpringBootApplication public class DevlogSpringbootApplication { public static void main(String[] args) {