diff --git a/src/main/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplication.java b/src/main/java/com/cnu/devlog_springboot/DevlogSpringbootApplication.java similarity index 88% rename from src/main/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplication.java rename to src/main/java/com/cnu/devlog_springboot/DevlogSpringbootApplication.java index 6739bf0..5764389 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplication.java +++ b/src/main/java/com/cnu/devlog_springboot/DevlogSpringbootApplication.java @@ -1,4 +1,4 @@ -package com.com.cnu.devlog_springboot; +package com.cnu.devlog_springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/src/main/java/com/com/cnu/devlog_springboot/config/WebMVCConfig.java b/src/main/java/com/cnu/devlog_springboot/config/WebMVCConfig.java similarity index 91% rename from src/main/java/com/com/cnu/devlog_springboot/config/WebMVCConfig.java rename to src/main/java/com/cnu/devlog_springboot/config/WebMVCConfig.java index a043ae2..54e42cc 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/config/WebMVCConfig.java +++ b/src/main/java/com/cnu/devlog_springboot/config/WebMVCConfig.java @@ -1,4 +1,4 @@ -package com.com.cnu.devlog_springboot.config; +package com.cnu.devlog_springboot.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; diff --git a/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java b/src/main/java/com/cnu/devlog_springboot/controller/PostController.java similarity index 86% rename from src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java rename to src/main/java/com/cnu/devlog_springboot/controller/PostController.java index 7d6847f..22f87cd 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java +++ b/src/main/java/com/cnu/devlog_springboot/controller/PostController.java @@ -1,8 +1,8 @@ -package com.com.cnu.devlog_springboot.controller; +package com.cnu.devlog_springboot.controller; -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.cnu.devlog_springboot.model.Post; +import com.cnu.devlog_springboot.service.PostService; +import com.cnu.devlog_springboot.model.request.PostRequest; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/cnu/devlog_springboot/controller/ProjectController.java b/src/main/java/com/cnu/devlog_springboot/controller/ProjectController.java new file mode 100644 index 0000000..0c712fc --- /dev/null +++ b/src/main/java/com/cnu/devlog_springboot/controller/ProjectController.java @@ -0,0 +1,46 @@ +package com.cnu.devlog_springboot.controller; + +import com.cnu.devlog_springboot.service.ProjectService; +import com.cnu.devlog_springboot.model.Project; +import com.cnu.devlog_springboot.model.request.ProjectRequest; +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 { + // GET /projects + public final ProjectService projectService; + + @GetMapping + public List getAllProjects() { + return projectService.getAllProjects(); + } + + @GetMapping("{projectId}") + public ResponseEntity getProjectById(@PathVariable Integer projectId) { + Project project = projectService.getProject(projectId); + return ResponseEntity.ok(project); + } + + @PostMapping + public ResponseEntity createProject(@RequestBody ProjectRequest projectRequest) { + return ResponseEntity.ok(projectService.createProject(projectRequest)); + } + + @PutMapping("{projectId}") + public ResponseEntity updateProject(@PathVariable Integer projectId, @RequestBody ProjectRequest projectRequest) { + Project project = projectService.updateProject(projectId, projectRequest); + return ResponseEntity.ok(project); + } + + @DeleteMapping("{projectId}") + public ResponseEntity deleteProject(@PathVariable Integer projectId) { + projectService.deleteProject(projectId); + return ResponseEntity.noContent().build(); + } +} diff --git a/src/main/java/com/cnu/devlog_springboot/exception/DevlogException.java b/src/main/java/com/cnu/devlog_springboot/exception/DevlogException.java new file mode 100644 index 0000000..2d66556 --- /dev/null +++ b/src/main/java/com/cnu/devlog_springboot/exception/DevlogException.java @@ -0,0 +1,11 @@ +package com.cnu.devlog_springboot.exception; + +import 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/cnu/devlog_springboot/exception/GlobalExceptionHandler.java b/src/main/java/com/cnu/devlog_springboot/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..4265630 --- /dev/null +++ b/src/main/java/com/cnu/devlog_springboot/exception/GlobalExceptionHandler.java @@ -0,0 +1,29 @@ +package com.cnu.devlog_springboot.exception; + +import com.cnu.devlog_springboot.model.ErrorResponse; +import 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() + ) + ); + } +} diff --git a/src/main/java/com/cnu/devlog_springboot/model/ErrorResponse.java b/src/main/java/com/cnu/devlog_springboot/model/ErrorResponse.java new file mode 100644 index 0000000..e6bfa16 --- /dev/null +++ b/src/main/java/com/cnu/devlog_springboot/model/ErrorResponse.java @@ -0,0 +1,9 @@ +package com.cnu.devlog_springboot.model; + +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/model/Post.java b/src/main/java/com/cnu/devlog_springboot/model/Post.java similarity index 80% rename from src/main/java/com/com/cnu/devlog_springboot/model/Post.java rename to src/main/java/com/cnu/devlog_springboot/model/Post.java index 51f5b6e..9927c9d 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/model/Post.java +++ b/src/main/java/com/cnu/devlog_springboot/model/Post.java @@ -1,6 +1,6 @@ -package com.com.cnu.devlog_springboot.model; +package com.cnu.devlog_springboot.model; -import com.com.cnu.devlog_springboot.type.Tag; +import com.cnu.devlog_springboot.type.Tag; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/com/cnu/devlog_springboot/model/Project.java b/src/main/java/com/cnu/devlog_springboot/model/Project.java similarity index 92% rename from src/main/java/com/com/cnu/devlog_springboot/model/Project.java rename to src/main/java/com/cnu/devlog_springboot/model/Project.java index 29d0b72..bf38d8b 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/model/Project.java +++ b/src/main/java/com/cnu/devlog_springboot/model/Project.java @@ -1,4 +1,4 @@ -package com.com.cnu.devlog_springboot.model; +package com.cnu.devlog_springboot.model; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; diff --git a/src/main/java/com/cnu/devlog_springboot/model/request/PostRequest.java b/src/main/java/com/cnu/devlog_springboot/model/request/PostRequest.java new file mode 100644 index 0000000..0dc91fe --- /dev/null +++ b/src/main/java/com/cnu/devlog_springboot/model/request/PostRequest.java @@ -0,0 +1,10 @@ +package com.cnu.devlog_springboot.model.request; + +import 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/cnu/devlog_springboot/model/request/ProjectRequest.java similarity index 78% rename from src/main/java/com/com/cnu/devlog_springboot/model/request/ProjectRequest.java rename to src/main/java/com/cnu/devlog_springboot/model/request/ProjectRequest.java index 2ae3a17..6ffb05b 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/model/request/ProjectRequest.java +++ b/src/main/java/com/cnu/devlog_springboot/model/request/ProjectRequest.java @@ -1,4 +1,4 @@ -package com.com.cnu.devlog_springboot.model.request; +package com.cnu.devlog_springboot.model.request; import java.time.LocalDate; diff --git a/src/main/java/com/com/cnu/devlog_springboot/repository/PostRepository.java b/src/main/java/com/cnu/devlog_springboot/repository/PostRepository.java similarity index 77% rename from src/main/java/com/com/cnu/devlog_springboot/repository/PostRepository.java rename to src/main/java/com/cnu/devlog_springboot/repository/PostRepository.java index bb39395..70b0693 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/repository/PostRepository.java +++ b/src/main/java/com/cnu/devlog_springboot/repository/PostRepository.java @@ -1,6 +1,6 @@ -package com.com.cnu.devlog_springboot.repository; +package com.cnu.devlog_springboot.repository; -import com.com.cnu.devlog_springboot.model.Post; +import com.cnu.devlog_springboot.model.Post; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/cnu/devlog_springboot/repository/ProjectRepository.java b/src/main/java/com/cnu/devlog_springboot/repository/ProjectRepository.java new file mode 100644 index 0000000..19a884a --- /dev/null +++ b/src/main/java/com/cnu/devlog_springboot/repository/ProjectRepository.java @@ -0,0 +1,13 @@ +package com.cnu.devlog_springboot.repository; + +import com.cnu.devlog_springboot.model.Project; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProjectRepository extends JpaRepository { + // Project save(Project project); + // List findAll(); + // Optional findById(Integer projectId); + // void delete(Project project); +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/service/PostService.java b/src/main/java/com/cnu/devlog_springboot/service/PostService.java similarity index 61% rename from src/main/java/com/com/cnu/devlog_springboot/service/PostService.java rename to src/main/java/com/cnu/devlog_springboot/service/PostService.java index 3823d7a..5df9c12 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/service/PostService.java +++ b/src/main/java/com/cnu/devlog_springboot/service/PostService.java @@ -1,8 +1,10 @@ -package com.com.cnu.devlog_springboot.service; +package 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 com.cnu.devlog_springboot.exception.DevlogException; +import com.cnu.devlog_springboot.model.Post; +import com.cnu.devlog_springboot.type.ErrorCode; +import com.cnu.devlog_springboot.model.request.PostRequest; +import com.cnu.devlog_springboot.repository.PostRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -33,16 +35,17 @@ 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) { - postRepository.findById(postId) - .ifPresent(postRepository::delete); + Post post = postRepository.findById(postId) + .orElseThrow(() -> new DevlogException(ErrorCode.POST_NOT_FOUND)); + postRepository.delete(post); } } diff --git a/src/main/java/com/cnu/devlog_springboot/service/ProjectService.java b/src/main/java/com/cnu/devlog_springboot/service/ProjectService.java new file mode 100644 index 0000000..6258562 --- /dev/null +++ b/src/main/java/com/cnu/devlog_springboot/service/ProjectService.java @@ -0,0 +1,55 @@ +package com.cnu.devlog_springboot.service; + +import com.cnu.devlog_springboot.type.ErrorCode; +import com.cnu.devlog_springboot.exception.DevlogException; +import com.cnu.devlog_springboot.model.Project; +import com.cnu.devlog_springboot.model.request.ProjectRequest; +import 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 Project getProject(Integer projectId) { + return projectRepository.findById(projectId).orElseThrow(() + -> new DevlogException(ErrorCode.PROJECT_NOT_FOUND)); + } + + public List getAllProjects() { + return projectRepository.findAll(); + } + + 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); + }).orElseThrow(() -> new DevlogException(ErrorCode.PROJECT_NOT_FOUND)); + } + + public void deleteProject(Integer projectId) { + Project project = projectRepository.findById(projectId) + .orElseThrow(() -> new DevlogException(ErrorCode.PROJECT_NOT_FOUND)); + projectRepository.delete(project); + } +} diff --git a/src/main/java/com/cnu/devlog_springboot/type/ErrorCode.java b/src/main/java/com/cnu/devlog_springboot/type/ErrorCode.java new file mode 100644 index 0000000..2e14423 --- /dev/null +++ b/src/main/java/com/cnu/devlog_springboot/type/ErrorCode.java @@ -0,0 +1,20 @@ +package com.cnu.devlog_springboot.type; + +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public enum ErrorCode { + POST_NOT_FOUND(HttpStatus.NOT_FOUND, 404, "해당 게시글을 찾을 수 없습니다."), + PROJECT_NOT_FOUND(HttpStatus.NOT_FOUND, 404, "해당 프로젝트 글을 찾을 수 없습니다."); + + 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; + } +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/type/Tag.java b/src/main/java/com/cnu/devlog_springboot/type/Tag.java similarity index 63% rename from src/main/java/com/com/cnu/devlog_springboot/type/Tag.java rename to src/main/java/com/cnu/devlog_springboot/type/Tag.java index ebd77de..949d165 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/type/Tag.java +++ b/src/main/java/com/cnu/devlog_springboot/type/Tag.java @@ -1,4 +1,4 @@ -package com.com.cnu.devlog_springboot.type; +package com.cnu.devlog_springboot.type; public enum Tag { SPRINGBOOT, 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 deleted file mode 100644 index 14efa3b..0000000 --- a/src/main/java/com/com/cnu/devlog_springboot/model/request/PostRequest.java +++ /dev/null @@ -1,10 +0,0 @@ -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 -) { -}