From 43d1df47d8d7d1c513598cad3ebbeaed1ee3c0e4 Mon Sep 17 00:00:00 2001 From: kingseungwooya Date: Mon, 15 Apr 2024 17:29:09 +0900 Subject: [PATCH 1/5] =?UTF-8?q?getposts=20tag=20=EB=B3=84=EB=A1=9C=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B2=8C=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cnu/devlog_springboot/controller/PostController.java | 8 +++++--- .../cnu/devlog_springboot/repository/PostRepository.java | 7 +++---- .../com/cnu/devlog_springboot/service/PostService.java | 6 +++++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java b/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java index 7d6847f..74a2930 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java +++ b/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java @@ -3,6 +3,8 @@ import com.com.cnu.devlog_springboot.model.Post; import com.com.cnu.devlog_springboot.model.request.PostRequest; import com.com.cnu.devlog_springboot.service.PostService; +import com.com.cnu.devlog_springboot.type.Tag; +import io.micrometer.common.lang.Nullable; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -15,12 +17,12 @@ public class PostController { private final PostService postService; - // GET /posts @GetMapping - public ResponseEntity> getPosts() { - return ResponseEntity.ok(postService.getPosts()); + public ResponseEntity> getPosts(@RequestParam("tag") @Nullable Tag tag) { + return ResponseEntity.ok(postService.getPosts(tag)); } + // GET /posts/{postId} @GetMapping("{postId}") public ResponseEntity getPost(@PathVariable("postId")Integer postId) { diff --git a/src/main/java/com/com/cnu/devlog_springboot/repository/PostRepository.java b/src/main/java/com/com/cnu/devlog_springboot/repository/PostRepository.java index bb39395..e697826 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/repository/PostRepository.java +++ b/src/main/java/com/com/cnu/devlog_springboot/repository/PostRepository.java @@ -1,13 +1,12 @@ package com.com.cnu.devlog_springboot.repository; import com.com.cnu.devlog_springboot.model.Post; +import com.com.cnu.devlog_springboot.type.Tag; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface PostRepository extends JpaRepository { -// Post save(Post post); -// List findAll(); -// Optional findById(Integer postId); -// void delete(Post post); + List findAllByTag(Tag tag); } diff --git a/src/main/java/com/com/cnu/devlog_springboot/service/PostService.java b/src/main/java/com/com/cnu/devlog_springboot/service/PostService.java index 3823d7a..8da9dca 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/service/PostService.java +++ b/src/main/java/com/com/cnu/devlog_springboot/service/PostService.java @@ -3,6 +3,7 @@ import com.com.cnu.devlog_springboot.model.Post; import com.com.cnu.devlog_springboot.model.request.PostRequest; import com.com.cnu.devlog_springboot.repository.PostRepository; +import com.com.cnu.devlog_springboot.type.Tag; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -13,7 +14,10 @@ public class PostService { private final PostRepository postRepository; - public List getPosts() { + public List getPosts(Tag tag) { + if (tag != null) { + return postRepository.findAllByTag(tag); + } return postRepository.findAll(); } From a9410ba88f841bdb17d0488f3178a234ac00b9ec Mon Sep 17 00:00:00 2001 From: kingseungwooya Date: Mon, 15 Apr 2024 17:34:49 +0900 Subject: [PATCH 2/5] =?UTF-8?q?action=20=EC=84=A4=EC=A0=95=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deployment_scp.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/deployment_scp.yml b/.github/workflows/deployment_scp.yml index 8d91ebb..aeb1980 100644 --- a/.github/workflows/deployment_scp.yml +++ b/.github/workflows/deployment_scp.yml @@ -46,10 +46,10 @@ jobs: - name: Send jar to remote server uses: appleboy/scp-action@master with: - host: {나의 public ip} - username: {나의 userName} + host: ${{ secrets.SERVER_IP }} + username: ${{ secrets.USERNAME }} source: "devlog_springboot-0.0.1-SNAPSHOT.jar" - target: "/home/{나의 userName}" + target: "/home/${{ secrets.USERNAME }}" key: ${{ secrets.PRIVATE_KEY }} run-app: @@ -61,16 +61,16 @@ jobs: - name: Move deploy.sh uses: appleboy/scp-action@master with: - host: {나의 public ip} - username: {나의 userName} + host: ${{ secrets.SERVER_IP }} + username: ${{ secrets.USERNAME }} source: "deploy.sh" - target: "/home/{나의 userName}" + target: "/home/${{ secrets.USERNAME }}" key: ${{ secrets.PRIVATE_KEY }} - name: Execute script uses: appleboy/ssh-action@master with: - username: {나의 userName} - host: {나의 public ip} + username: ${{ secrets.USERNAME }} + host: ${{ secrets.SERVER_IP }} key: ${{ secrets.PRIVATE_KEY }} script_stop: true - script: cd /home/{나의 userName} && chmod +x deploy.sh && ./deploy.sh + script: cd /home/${{ secrets.USERNAME }} && chmod +x deploy.sh && ./deploy.sh From 104516ed45096d866a3c8a4d1772340676908937 Mon Sep 17 00:00:00 2001 From: kingseungwooya Date: Mon, 15 Apr 2024 17:48:18 +0900 Subject: [PATCH 3/5] =?UTF-8?q?nullable=20=EB=9D=BC=EC=9D=B4=EB=B8=8C?= =?UTF-8?q?=EB=9F=AC=EB=A6=AC=20=EB=B3=80=EA=B2=BD...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cnu/devlog_springboot/controller/PostController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java b/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java index 74a2930..af57fbb 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java +++ b/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java @@ -4,7 +4,7 @@ import com.com.cnu.devlog_springboot.model.request.PostRequest; import com.com.cnu.devlog_springboot.service.PostService; import com.com.cnu.devlog_springboot.type.Tag; -import io.micrometer.common.lang.Nullable; +import jakarta.annotation.Nullable; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; From 0c8c688fb858b4331b1f6453f37ea75bb23a7bb1 Mon Sep 17 00:00:00 2001 From: kingseungwooya Date: Mon, 29 Apr 2024 15:28:19 +0900 Subject: [PATCH 4/5] java version update --- .github/workflows/deployment_scp.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deployment_scp.yml b/.github/workflows/deployment_scp.yml index aeb1980..ea11803 100644 --- a/.github/workflows/deployment_scp.yml +++ b/.github/workflows/deployment_scp.yml @@ -21,10 +21,10 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: '17' + java-version: '21' distribution: 'temurin' - name: Build with Gradle uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 From d1987ac47b3ad6a7956cc683feea047ec03a1b3e Mon Sep 17 00:00:00 2001 From: kingseungwooya Date: Sun, 5 May 2024 07:10:21 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=EA=B3=BC=EC=A0=9C=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProjectController.java | 65 +++++++++++++++++++ .../exception/DevlogException.java | 12 ++++ .../exception/GlobalExceptionHandler.java | 29 +++++++++ .../model/response/ErrorResponse.java | 9 +++ .../repository/ProjectRepository.java | 7 ++ .../service/ProjectService.java | 63 ++++++++++++++++++ .../cnu/devlog_springboot/type/ErrorCode.java | 20 ++++++ 7 files changed, 205 insertions(+) create mode 100644 src/main/java/com/com/cnu/devlog_springboot/controller/ProjectController.java 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/GlobalExceptionHandler.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/repository/ProjectRepository.java create mode 100644 src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.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/controller/ProjectController.java b/src/main/java/com/com/cnu/devlog_springboot/controller/ProjectController.java new file mode 100644 index 0000000..41296c5 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/controller/ProjectController.java @@ -0,0 +1,65 @@ +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 java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 요구사항 + * projectrequest 로 요청을 받아 글 저장 + * 저장한 모든 프로젝트글을 한 번에 조회 (param 없이) + * 프로젝트 단건 조회 id로 else -> 404 + * 수정 else -> 404 + * 삭제 -> 404 + */ + +@RestController +@RequestMapping("/projects") +@RequiredArgsConstructor +public class ProjectController { + private final ProjectService projectService; + + @GetMapping + public ResponseEntity> getProjects() { + final List projects = projectService.getProjects(); + return ResponseEntity.ok(projects); + } + + @GetMapping("/{projectId}") + public ResponseEntity getProject(@PathVariable("projectId") final Integer projectId) { + final Project project = projectService.getProject(projectId); + return ResponseEntity.ok(project); + } + + @PostMapping + public ResponseEntity createProject(@RequestBody final ProjectRequest request) { + final Project project = projectService.createProject(request); + return ResponseEntity.ok(project); + } + + @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); + } + + @DeleteMapping("/{projectId}") + public ResponseEntity deleteProject(@PathVariable("projectId") final Integer projectId) { + projectService.deleteProject(projectId); + return ResponseEntity.noContent().build(); + } +} 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..fe351f9 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException.java @@ -0,0 +1,12 @@ +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; +} \ No newline at end of file diff --git a/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler.java b/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..3dac019 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler.java @@ -0,0 +1,29 @@ +package com.com.cnu.devlog_springboot.exception; + +import com.com.cnu.devlog_springboot.model.response.ErrorResponse; +import com.com.cnu.devlog_springboot.type.ErrorCode; +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 GlobalExceptionHandler { + + @ExceptionHandler(DevlogException.class) + public ResponseEntity handleDevlogException( + final HttpServletRequest request, + final DevlogException e + ) { + final ErrorCode errorCode = e.getErrorCode(); + return ResponseEntity.status(e.getErrorCode().getHttpStatus()) + .body( + new ErrorResponse( + errorCode.getDescription(), + errorCode.getHttpStatus().value(), + errorCode.getErrorCode(), + request.getRequestURI() + ) + ); + } +} \ No newline at end of file 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..81e82db --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/model/response/ErrorResponse.java @@ -0,0 +1,9 @@ +package com.com.cnu.devlog_springboot.model.response; + +public record ErrorResponse( + String title, + Integer status, + Integer code, + String instance +) { +} \ No newline at end of file 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..f9c509d --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/repository/ProjectRepository.java @@ -0,0 +1,7 @@ +package com.com.cnu.devlog_springboot.repository; + +import com.com.cnu.devlog_springboot.model.Project; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProjectRepository extends JpaRepository { +} 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..c25a649 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/service/ProjectService.java @@ -0,0 +1,63 @@ +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 java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class ProjectService { + + private final ProjectRepository projectRepository; + + public List getProjects() { + return projectRepository.findAll(); + } + + public Project getProject(final Integer projectId) { + return projectRepository.findById(projectId) + .orElseThrow(() -> new DevlogException(ErrorCode.PROJECT_NOT_FOUND)); + } + + @Transactional + public Project createProject(final ProjectRequest request) { + final Project project = new Project( + null, + request.title(), + request.summary(), + request.contents(), + request.startDate(), + request.endDate() + ); + final Project savedProject = projectRepository.save(project); + return savedProject; + } + + @Transactional + public Project updateProject(final Integer projectId, final ProjectRequest request) { + final Project updatedProject = projectRepository.findById(projectId) + .map(project -> { + project.setTitle(request.title()); + project.setSummary(request.summary()); + project.setContents(request.contents()); + project.setStartDate(request.startDate()); + project.setEndDate(request.endDate()); + return project; + }) + .orElseThrow(() -> new DevlogException(ErrorCode.PROJECT_NOT_FOUND)); + return updatedProject; + } + + @Transactional + public void deleteProject(final Integer projectId) { + projectRepository.findById(projectId) + .ifPresent(projectRepository::delete); + } +} \ No newline at end of file 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..04babb0 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/type/ErrorCode.java @@ -0,0 +1,20 @@ +package com.com.cnu.devlog_springboot.type; + +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public enum ErrorCode { + POST_NOT_FOUND(HttpStatus.NOT_FOUND, 4000, "해당 게시글을 찾을 수 없습니다."), + PROJECT_NOT_FOUND(HttpStatus.NOT_FOUND, 5000, "해당 프로젝트 글을 찾을 수 없습니다."); + + private final HttpStatus httpStatus; + private final Integer errorCode; + private final String description; + + ErrorCode(final HttpStatus httpStatus, final Integer errorCode, final String description) { + this.httpStatus = httpStatus; + this.errorCode = errorCode; + this.description = description; + } +} \ No newline at end of file