From 16d2c6712b1f49c04c5bd85f66c57f115c858994 Mon Sep 17 00:00:00 2001 From: juhabae Date: Mon, 6 May 2024 19:10:59 +0900 Subject: [PATCH 01/19] =?UTF-8?q?CURD=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PostController.java | 53 +++++++++++++++++++ .../com/cnu/devlog_springboot/model/Post.java | 20 +++++++ .../cnu/devlog_springboot/model/Project.java | 25 +++++++++ .../model/request/PostRequest.java | 10 ++++ .../model/request/ProjectRequest.java | 12 +++++ .../repository/PostRepository.java | 13 +++++ .../service/PostService.java | 48 +++++++++++++++++ 7 files changed, 181 insertions(+) create mode 100644 src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java create mode 100644 src/main/java/com/com/cnu/devlog_springboot/model/Post.java create mode 100644 src/main/java/com/com/cnu/devlog_springboot/model/Project.java create mode 100644 src/main/java/com/com/cnu/devlog_springboot/model/request/PostRequest.java create mode 100644 src/main/java/com/com/cnu/devlog_springboot/model/request/ProjectRequest.java create mode 100644 src/main/java/com/com/cnu/devlog_springboot/repository/PostRepository.java create mode 100644 src/main/java/com/com/cnu/devlog_springboot/service/PostService.java 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 new file mode 100644 index 0000000..4b244ad --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.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 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; + +@RestController +@RequestMapping("/projects") +@RequiredArgsConstructor +public class ProjectController { + + private final ProjectService projectService; + + @GetMapping + public ResponseEntity> getProjects() { + return ResponseEntity.ok(projectService.getProjects()); + } + + @GetMapping("/{projectId}") + public ResponseEntity getProject(@PathVariable Integer projectId) { + return ResponseEntity.ok(projectService.getProject(projectId)); + } + + @PostMapping + public ResponseEntity createProject(@RequestBody ProjectRequest projectRequest) { + return ResponseEntity.ok(projectService.createProject(projectRequest)); + } + + @PutMapping("{projectId}") + public ResponseEntity updateProject( + @PathVariable("projectId")Integer projectId, + @RequestBody ProjectRequest projectRequest + ) { + return ResponseEntity.ok(projectService.updateProject(projectId, projectRequest)); + } + + @DeleteMapping("/{projectId}") + public ResponseEntity deleteProject(@PathVariable("projectId") Integer projectId) { + projectService.deleteProject(projectId); + return ResponseEntity.noContent().build(); + } +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/model/Post.java b/src/main/java/com/com/cnu/devlog_springboot/model/Post.java new file mode 100644 index 0000000..51f5b6e --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/model/Post.java @@ -0,0 +1,20 @@ +package com.com.cnu.devlog_springboot.model; + +import com.com.cnu.devlog_springboot.type.Tag; +import jakarta.persistence.*; +import lombok.*; + +@Getter +@Setter +@Entity(name = "posts") +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true) +public class Post { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + Integer id; + String title; + String contents; + @Enumerated(value = EnumType.STRING) + Tag tag; +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/model/Project.java b/src/main/java/com/com/cnu/devlog_springboot/model/Project.java new file mode 100644 index 0000000..29d0b72 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/model/Project.java @@ -0,0 +1,25 @@ +package com.com.cnu.devlog_springboot.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.*; + +import java.time.LocalDate; + +@Getter +@Setter +@Entity(name = "projects") +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true) +public class Project { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + Integer id; + String title; + String summary; + String contents; + LocalDate startDate; + LocalDate endDate; +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/model/request/PostRequest.java b/src/main/java/com/com/cnu/devlog_springboot/model/request/PostRequest.java new file mode 100644 index 0000000..14efa3b --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/model/request/PostRequest.java @@ -0,0 +1,10 @@ +package com.com.cnu.devlog_springboot.model.request; + +import com.com.cnu.devlog_springboot.type.Tag; + +public record PostRequest( + String title, + String contents, + Tag tag +) { +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/model/request/ProjectRequest.java b/src/main/java/com/com/cnu/devlog_springboot/model/request/ProjectRequest.java new file mode 100644 index 0000000..2ae3a17 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/model/request/ProjectRequest.java @@ -0,0 +1,12 @@ +package com.com.cnu.devlog_springboot.model.request; + +import java.time.LocalDate; + +public record ProjectRequest( + String title, + String summary, + String contents, + LocalDate startDate, + LocalDate endDate +) { +} 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 new file mode 100644 index 0000000..bb39395 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/repository/PostRepository.java @@ -0,0 +1,13 @@ +package com.com.cnu.devlog_springboot.repository; + +import com.com.cnu.devlog_springboot.model.Post; +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); +} 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 new file mode 100644 index 0000000..3823d7a --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/service/PostService.java @@ -0,0 +1,48 @@ +package com.com.cnu.devlog_springboot.service; + +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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class PostService { + private final PostRepository postRepository; + + public List getPosts() { + return postRepository.findAll(); + } + + public Post creatPost(PostRequest postRequest) { + return postRepository.save(new Post( + null, + postRequest.title(), + postRequest.contents(), + postRequest.tag() + )); + } + + public Post updatePost(Integer postId, PostRequest postRequest) { + return postRepository.findById(postId) + .map(post -> { + post.setTitle(postRequest.title()); + post.setContents(postRequest.contents()); + return postRepository.save(post); + }) + .orElse(null); + } + + public Post getPost(Integer postId) { + return postRepository.findById(postId) + .orElse(null); + } + + public void deletePost(Integer postId) { + postRepository.findById(postId) + .ifPresent(postRepository::delete); + } +} From 8968d0a132836e80037fe3e358d2b56789e6c7cd Mon Sep 17 00:00:00 2001 From: juhabae Date: Mon, 6 May 2024 20:08:48 +0900 Subject: [PATCH 02/19] =?UTF-8?q?CURD=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devlog_springboot/controller/PostController.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 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 4b244ad..8f57f74 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 @@ -6,14 +6,7 @@ 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; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/projects") @@ -39,7 +32,7 @@ public ResponseEntity createProject(@RequestBody ProjectRequest project @PutMapping("{projectId}") public ResponseEntity updateProject( - @PathVariable("projectId")Integer projectId, + @PathVariable("projectId") Integer projectId, @RequestBody ProjectRequest projectRequest ) { return ResponseEntity.ok(projectService.updateProject(projectId, projectRequest)); From a69b0ebaf58bc207403348862a3cb0521dbb288a Mon Sep 17 00:00:00 2001 From: juhabae Date: Mon, 6 May 2024 20:21:05 +0900 Subject: [PATCH 03/19] =?UTF-8?q?CURD=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devlog_springboot/controller/PostController.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 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 8f57f74..4b244ad 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 @@ -6,7 +6,14 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +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; @RestController @RequestMapping("/projects") @@ -32,7 +39,7 @@ public ResponseEntity createProject(@RequestBody ProjectRequest project @PutMapping("{projectId}") public ResponseEntity updateProject( - @PathVariable("projectId") Integer projectId, + @PathVariable("projectId")Integer projectId, @RequestBody ProjectRequest projectRequest ) { return ResponseEntity.ok(projectService.updateProject(projectId, projectRequest)); From 6d51465e7b9b222be067fbd7a03efb1bc4000eea Mon Sep 17 00:00:00 2001 From: juhabae Date: Mon, 6 May 2024 20:32:55 +0900 Subject: [PATCH 04/19] =?UTF-8?q?CURD=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application (2).yml | 21 +++++++++++++++++++ .../DevlogSpringbootApplicationTests (2).java | 13 ++++++++++++ .../DevlogSpringbootApplicationTests.java | 13 ------------ 3 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 src/main/resources/application (2).yml create mode 100644 src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests (2).java diff --git a/src/main/resources/application (2).yml b/src/main/resources/application (2).yml new file mode 100644 index 0000000..49fe227 --- /dev/null +++ b/src/main/resources/application (2).yml @@ -0,0 +1,21 @@ +spring: + h2: + console: + enabled: true + path: /h2-console + # Database Setting Info + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:real_coding + username: cnu + password: + + jpa: + hibernate: + ddl-auto: create + properties: + hibernate: + format_sql: true + +logging.level: + org.hibernate.SQL: debug \ No newline at end of file diff --git a/src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests (2).java b/src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests (2).java new file mode 100644 index 0000000..df7367b --- /dev/null +++ b/src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests (2).java @@ -0,0 +1,13 @@ +package com.com.cnu.devlog_springboot; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DevlogSpringbootApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests.java b/src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests.java index df7367b..e69de29 100644 --- a/src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests.java +++ b/src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests.java @@ -1,13 +0,0 @@ -package com.com.cnu.devlog_springboot; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class DevlogSpringbootApplicationTests { - - @Test - void contextLoads() { - } - -} From 796ebececffb4414fe42574d7627d5b90a7c6990 Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:04:12 +0900 Subject: [PATCH 05/19] Create ProjectController.java --- .../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..4b244ad --- /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 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; + +@RestController +@RequestMapping("/projects") +@RequiredArgsConstructor +public class ProjectController { + + private final ProjectService projectService; + + @GetMapping + public ResponseEntity> getProjects() { + return ResponseEntity.ok(projectService.getProjects()); + } + + @GetMapping("/{projectId}") + public ResponseEntity getProject(@PathVariable Integer projectId) { + return ResponseEntity.ok(projectService.getProject(projectId)); + } + + @PostMapping + public ResponseEntity createProject(@RequestBody ProjectRequest projectRequest) { + return ResponseEntity.ok(projectService.createProject(projectRequest)); + } + + @PutMapping("{projectId}") + public ResponseEntity updateProject( + @PathVariable("projectId")Integer projectId, + @RequestBody ProjectRequest projectRequest + ) { + return ResponseEntity.ok(projectService.updateProject(projectId, projectRequest)); + } + + @DeleteMapping("/{projectId}") + public ResponseEntity deleteProject(@PathVariable("projectId") Integer projectId) { + projectService.deleteProject(projectId); + return ResponseEntity.noContent().build(); + } +} From 29c0149ad7220f99cba83471a4912e839fb85659 Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:06:41 +0900 Subject: [PATCH 06/19] Create DevlogException --- .../cnu/devlog_springboot/exception/DevlogException | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException diff --git a/src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException b/src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException new file mode 100644 index 0000000..9da0b4e --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException @@ -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; +} From 369314c67b9d4a9576893deb172a7df9295de6da Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:07:12 +0900 Subject: [PATCH 07/19] Create GlobalExceptionHandler --- .../exception/GlobalExceptionHandler | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler diff --git a/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler b/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler new file mode 100644 index 0000000..b141cb9 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler @@ -0,0 +1,27 @@ +package com.com.cnu.devlog_springboot.exception; + +import com.com.cnu.devlog_springboot.model.reponse.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 GlobalExceptionHandler { + + @ExceptionHandler(DevlogException.class) + public ResponseEntity handlerDevlogException( + 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() + ) + ); + + } +} From 6d2e8a4ae4f50f21ffd825795d65bf931f447acc Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:16:15 +0900 Subject: [PATCH 08/19] Update PostController.java --- .../controller/PostController.java | 63 ++++++++++--------- 1 file changed, 32 insertions(+), 31 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 4b244ad..9ce59c9 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 @@ -1,53 +1,54 @@ 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 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 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; +import org.springframework.lang.Nullable; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController -@RequestMapping("/projects") +@RequestMapping("/posts") @RequiredArgsConstructor -public class ProjectController { - - private final ProjectService projectService; +public class PostController { + private final PostService postService; + // GET /posts @GetMapping - public ResponseEntity> getProjects() { - return ResponseEntity.ok(projectService.getProjects()); + public ResponseEntity> getPosts(@RequestParam @Nullable Tag tag) { + return ResponseEntity.ok(postService.getPosts(tag)); } - @GetMapping("/{projectId}") - public ResponseEntity getProject(@PathVariable Integer projectId) { - return ResponseEntity.ok(projectService.getProject(projectId)); + // GET /posts/{postId} + @GetMapping("{postId}") + public ResponseEntity getPost(@PathVariable("postId")Integer postId) { + return ResponseEntity.ok(postService.getPost(postId)); } + // POST /posts @PostMapping - public ResponseEntity createProject(@RequestBody ProjectRequest projectRequest) { - return ResponseEntity.ok(projectService.createProject(projectRequest)); + public ResponseEntity createPost(@RequestBody PostRequest postRequest) { + return ResponseEntity.ok(postService.creatPost(postRequest)); } - @PutMapping("{projectId}") - public ResponseEntity updateProject( - @PathVariable("projectId")Integer projectId, - @RequestBody ProjectRequest projectRequest + // PUT /posts/{postId} + // ex. localhost:8080/posts/3 + @PutMapping("{postId}") + public ResponseEntity updatePost( + @PathVariable("postId")Integer postId, + @RequestBody PostRequest postRequest ) { - return ResponseEntity.ok(projectService.updateProject(projectId, projectRequest)); + return ResponseEntity.ok(postService.updatePost(postId, postRequest)); } - @DeleteMapping("/{projectId}") - public ResponseEntity deleteProject(@PathVariable("projectId") Integer projectId) { - projectService.deleteProject(projectId); + // DELETE /posts/{postId} + @DeleteMapping("{postId}") + public ResponseEntity deletePost(@PathVariable("postId") Integer postId) { + postService.deletePost(postId); return ResponseEntity.noContent().build(); } } From 705274b8d0652f82af00ebefd208b0f0c5dc66b2 Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:18:10 +0900 Subject: [PATCH 09/19] Create ProgectRepository.java --- .../devlog_springboot/repository/ProgectRepository.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/com/com/cnu/devlog_springboot/repository/ProgectRepository.java diff --git a/src/main/java/com/com/cnu/devlog_springboot/repository/ProgectRepository.java b/src/main/java/com/com/cnu/devlog_springboot/repository/ProgectRepository.java new file mode 100644 index 0000000..f9c509d --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/repository/ProgectRepository.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 { +} From a5816e1af592a3dfeaa48ec536849d287e0ae031 Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:19:10 +0900 Subject: [PATCH 10/19] Create ProgectService.java --- .../service/ProgectService.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/main/java/com/com/cnu/devlog_springboot/service/ProgectService.java diff --git a/src/main/java/com/com/cnu/devlog_springboot/service/ProgectService.java b/src/main/java/com/com/cnu/devlog_springboot/service/ProgectService.java new file mode 100644 index 0000000..7e16243 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/service/ProgectService.java @@ -0,0 +1,53 @@ +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; + +@Service +@RequiredArgsConstructor +public class ProjectService { + private final ProjectRepository projectRepository; + + public List getProjects() { + return projectRepository.findAll(); + } + + public Project createProject(ProjectRequest projectRequest) { + return projectRepository.save(new Project( + null, + projectRequest.title(), + projectRequest.summary(), + projectRequest.contents(), + projectRequest.startDate(), + projectRequest.endDate() + )); + } + public Project updateProject(Integer projectId, ProjectRequest projectRequest) { + return projectRepository.findById(projectId) + .map(Project -> { + Project.setTitle(projectRequest.title()); + Project.setSummary(projectRequest.summary()); + Project.setContents(projectRequest.contents()); + Project.setStartDate(projectRequest.startDate()); + Project.setEndDate(projectRequest.endDate()); + return projectRepository.save(Project); + }) + .orElseThrow(()-> new DevlogException(ErrorCode.PROJECT_NOT_FOUND)); + } + + public Project getProject(Integer projectId) { + return projectRepository.findById(projectId) + .orElseThrow(()-> new DevlogException(ErrorCode.PROJECT_NOT_FOUND)); + } + + public void deleteProject(Integer projectId) { + projectRepository.findById(projectId) + .ifPresent(projectRepository::delete); + } +} From c7103bdc0ecebb74c91278ed4f7611b1ac0fe63a Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:19:41 +0900 Subject: [PATCH 11/19] Rename DevlogException to DevlogException.java --- .../exception/{DevlogException => DevlogException.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/com/com/cnu/devlog_springboot/exception/{DevlogException => DevlogException.java} (100%) diff --git a/src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException b/src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException.java similarity index 100% rename from src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException rename to src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException.java From 89f01edae3cf01e8d53a89d980e20150dd729f0b Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:20:09 +0900 Subject: [PATCH 12/19] Rename GlobalExceptionHandler to GlobalExceptionHandler.java --- .../{GlobalExceptionHandler => GlobalExceptionHandler.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/com/com/cnu/devlog_springboot/exception/{GlobalExceptionHandler => GlobalExceptionHandler.java} (100%) diff --git a/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler b/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler.java similarity index 100% rename from src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler rename to src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler.java From 17f943c113d4aa01361b149ba657a25d340ea7f3 Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:25:36 +0900 Subject: [PATCH 13/19] Create ErrorResponse.java --- .../devlog_springboot/model/reponse/ErrorResponse.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/com/com/cnu/devlog_springboot/model/reponse/ErrorResponse.java diff --git a/src/main/java/com/com/cnu/devlog_springboot/model/reponse/ErrorResponse.java b/src/main/java/com/com/cnu/devlog_springboot/model/reponse/ErrorResponse.java new file mode 100644 index 0000000..01c6743 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/model/reponse/ErrorResponse.java @@ -0,0 +1,9 @@ +package com.com.cnu.devlog_springboot.model.reponse; + +public record ErrorResponse( + String title, + Integer status, + Integer code, + String instance +) { +} From 9a0c2dace92c66751bb45e7d9d7775ef3b487cab Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:27:35 +0900 Subject: [PATCH 14/19] Update PostService.java --- .../cnu/devlog_springboot/service/PostService.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) 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..974fa30 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 @@ -1,9 +1,13 @@ package com.com.cnu.devlog_springboot.service; +import com.com.cnu.devlog_springboot.exception.DevlogException; 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.ErrorCode; +import com.com.cnu.devlog_springboot.type.Tag; import lombok.RequiredArgsConstructor; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; import java.util.List; @@ -13,7 +17,10 @@ public class PostService { private final PostRepository postRepository; - public List getPosts() { + public List getPosts(@Nullable Tag tag) { + if(tag != null) { + return postRepository.findAllByTag(tag); + } return postRepository.findAll(); } @@ -33,12 +40,12 @@ public Post updatePost(Integer postId, PostRequest postRequest) { post.setContents(postRequest.contents()); return postRepository.save(post); }) - .orElse(null); + .orElseThrow(() -> new DevlogException(ErrorCode.POST_NOT_FOUND)); } public Post getPost(Integer postId) { return postRepository.findById(postId) - .orElse(null); + .orElseThrow(() -> new DevlogException(ErrorCode.POST_NOT_FOUND)); } public void deletePost(Integer postId) { From 71b4fe17957dd5672f23db567e4b1934f77a4ba9 Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:28:30 +0900 Subject: [PATCH 15/19] Create ErrorCode.java --- .../cnu/devlog_springboot/type/ErrorCode.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) 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/type/ErrorCode.java b/src/main/java/com/com/cnu/devlog_springboot/type/ErrorCode.java new file mode 100644 index 0000000..f8460f3 --- /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 { + 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 5cd7a0a5d63a68abc092af1d44aad29bae1b01c0 Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:30:46 +0900 Subject: [PATCH 16/19] Delete src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests.java --- .../cnu/devlog_springboot/DevlogSpringbootApplicationTests.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests.java diff --git a/src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests.java b/src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests.java deleted file mode 100644 index e69de29..0000000 From f372c72ee72458bfc3face65ed6f8ecc5dee4528 Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:31:09 +0900 Subject: [PATCH 17/19] Delete src/main/resources/application (2).yml --- src/main/resources/application (2).yml | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 src/main/resources/application (2).yml diff --git a/src/main/resources/application (2).yml b/src/main/resources/application (2).yml deleted file mode 100644 index 49fe227..0000000 --- a/src/main/resources/application (2).yml +++ /dev/null @@ -1,21 +0,0 @@ -spring: - h2: - console: - enabled: true - path: /h2-console - # Database Setting Info - datasource: - driver-class-name: org.h2.Driver - url: jdbc:h2:mem:real_coding - username: cnu - password: - - jpa: - hibernate: - ddl-auto: create - properties: - hibernate: - format_sql: true - -logging.level: - org.hibernate.SQL: debug \ No newline at end of file From e4e1e8a1d9795f4f6cea0ee74455263d7c044b79 Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:39:22 +0900 Subject: [PATCH 18/19] Update PostController.java --- .../devlog_springboot/controller/PostController.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 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 9ce59c9..160d057 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,10 +3,10 @@ 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 com.com.cnu.devlog_springboot.type.Tag; // Tag import import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.lang.Nullable; +import org.springframework.lang.Nullable; // Nullable import import org.springframework.web.bind.annotation.*; import java.util.List; @@ -19,27 +19,27 @@ public class PostController { // GET /posts @GetMapping - public ResponseEntity> getPosts(@RequestParam @Nullable Tag tag) { + public ResponseEntity> getPosts(@RequestParam @Nullable Tag tag) { // Tag 파라미터 추가 return ResponseEntity.ok(postService.getPosts(tag)); } // GET /posts/{postId} @GetMapping("{postId}") - public ResponseEntity getPost(@PathVariable("postId")Integer postId) { + public ResponseEntity getPost(@PathVariable("postId") Integer postId) { return ResponseEntity.ok(postService.getPost(postId)); } // POST /posts @PostMapping public ResponseEntity createPost(@RequestBody PostRequest postRequest) { - return ResponseEntity.ok(postService.creatPost(postRequest)); + return ResponseEntity.ok(postService.createPost(postRequest)); // 오타 수정: creatPost -> createPost } // PUT /posts/{postId} // ex. localhost:8080/posts/3 @PutMapping("{postId}") public ResponseEntity updatePost( - @PathVariable("postId")Integer postId, + @PathVariable("postId") Integer postId, @RequestBody PostRequest postRequest ) { return ResponseEntity.ok(postService.updatePost(postId, postRequest)); From d9a0b77ae6fd3d4aca21ccecb43b4c7802c95a10 Mon Sep 17 00:00:00 2001 From: juhabae <141327091+juhabae@users.noreply.github.com> Date: Mon, 6 May 2024 21:51:07 +0900 Subject: [PATCH 19/19] Update PostController.java --- .../devlog_springboot/controller/PostController.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 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 160d057..9ce59c9 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,10 +3,10 @@ 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; // Tag import +import com.com.cnu.devlog_springboot.type.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.lang.Nullable; // Nullable import +import org.springframework.lang.Nullable; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -19,27 +19,27 @@ public class PostController { // GET /posts @GetMapping - public ResponseEntity> getPosts(@RequestParam @Nullable Tag tag) { // Tag 파라미터 추가 + public ResponseEntity> getPosts(@RequestParam @Nullable Tag tag) { return ResponseEntity.ok(postService.getPosts(tag)); } // GET /posts/{postId} @GetMapping("{postId}") - public ResponseEntity getPost(@PathVariable("postId") Integer postId) { + public ResponseEntity getPost(@PathVariable("postId")Integer postId) { return ResponseEntity.ok(postService.getPost(postId)); } // POST /posts @PostMapping public ResponseEntity createPost(@RequestBody PostRequest postRequest) { - return ResponseEntity.ok(postService.createPost(postRequest)); // 오타 수정: creatPost -> createPost + return ResponseEntity.ok(postService.creatPost(postRequest)); } // PUT /posts/{postId} // ex. localhost:8080/posts/3 @PutMapping("{postId}") public ResponseEntity updatePost( - @PathVariable("postId") Integer postId, + @PathVariable("postId")Integer postId, @RequestBody PostRequest postRequest ) { return ResponseEntity.ok(postService.updatePost(postId, postRequest));