From cb9844ee3904a122ab816700bb4cb690f94fdf18 Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 5 Sep 2024 21:27:44 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20entity=20not=20found=20exception=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/global/exception/ErrorCode.java | 16 +++++++++++ .../global/exception/ErrorResponse.java | 28 +++++++++++++++++++ .../exception/GlobalExceptionHandler.java | 14 ++++++++++ 3 files changed, 58 insertions(+) create mode 100644 src/main/java/team/flight/backend/global/exception/ErrorCode.java create mode 100644 src/main/java/team/flight/backend/global/exception/ErrorResponse.java diff --git a/src/main/java/team/flight/backend/global/exception/ErrorCode.java b/src/main/java/team/flight/backend/global/exception/ErrorCode.java new file mode 100644 index 0000000..1e9d941 --- /dev/null +++ b/src/main/java/team/flight/backend/global/exception/ErrorCode.java @@ -0,0 +1,16 @@ +package team.flight.backend.global.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum ErrorCode { + + ENTITY_NOT_FOUND(HttpStatus.NOT_FOUND, 4004, "해당 객체가 존재하지 않습니다.") + ; + private final HttpStatus httpStatus; + private final int code; + private final String message; +} diff --git a/src/main/java/team/flight/backend/global/exception/ErrorResponse.java b/src/main/java/team/flight/backend/global/exception/ErrorResponse.java new file mode 100644 index 0000000..bf70932 --- /dev/null +++ b/src/main/java/team/flight/backend/global/exception/ErrorResponse.java @@ -0,0 +1,28 @@ +package team.flight.backend.global.exception; + +import jakarta.servlet.http.HttpServletRequest; + +public record ErrorResponse( + int code, + String message, + String method, + String requestURI +) { + public static ErrorResponse of(ErrorCode errorCode, HttpServletRequest request) { + return new ErrorResponse( + errorCode.getCode(), + errorCode.getMessage(), + request.getMethod(), + request.getRequestURI() + ); + } + + public static ErrorResponse of(HttpServletRequest request, ErrorCode errorCode, final String errorMessage) { + return new ErrorResponse( + errorCode.getCode(), + errorMessage, + request.getMethod(), + request.getRequestURI() + ); + } +} diff --git a/src/main/java/team/flight/backend/global/exception/GlobalExceptionHandler.java b/src/main/java/team/flight/backend/global/exception/GlobalExceptionHandler.java index 7266551..ea70983 100644 --- a/src/main/java/team/flight/backend/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/team/flight/backend/global/exception/GlobalExceptionHandler.java @@ -1,9 +1,23 @@ package team.flight.backend.global.exception; +import jakarta.persistence.EntityNotFoundException; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; +@Slf4j @RestControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { + @ExceptionHandler(EntityNotFoundException.class) + public ResponseEntity handleEntityNotFoundException(HttpServletRequest request, + EntityNotFoundException ex) { + log.error("[Entity Not Found Exception 발생]: {}", ex.getMessage()); + log.error("[발생 위치: {} {}]", request.getMethod(), request.getRequestURI()); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ErrorResponse.of(ErrorCode.ENTITY_NOT_FOUND, request)); + } } From 755839434dd2610d88b5020c345c6b7bd65a0ab2 Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 5 Sep 2024 21:29:05 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=ED=8A=B9=EC=A0=95=20=EC=84=B8?= =?UTF-8?q?=EC=85=98id=EC=97=90=20=ED=95=B4=EB=8B=B9=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EB=AA=A9=EB=A1=9D=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../team/flight/backend/dto/PostInfoResponse.java | 12 ++++++++++++ .../java/team/flight/backend/dto/PostsResponse.java | 10 ++++++++++ .../flight/backend/repository/PostRepository.java | 3 +++ .../team/flight/backend/service/PostService.java | 11 +++++++++++ 4 files changed, 36 insertions(+) create mode 100644 src/main/java/team/flight/backend/dto/PostInfoResponse.java create mode 100644 src/main/java/team/flight/backend/dto/PostsResponse.java diff --git a/src/main/java/team/flight/backend/dto/PostInfoResponse.java b/src/main/java/team/flight/backend/dto/PostInfoResponse.java new file mode 100644 index 0000000..414eb9c --- /dev/null +++ b/src/main/java/team/flight/backend/dto/PostInfoResponse.java @@ -0,0 +1,12 @@ +package team.flight.backend.dto; + +import team.flight.backend.entity.Post; + +public record PostInfoResponse( + Long postId, + String request +) { + public static PostInfoResponse from(Post post) { + return new PostInfoResponse(post.getId(), post.getRequest()); + } +} diff --git a/src/main/java/team/flight/backend/dto/PostsResponse.java b/src/main/java/team/flight/backend/dto/PostsResponse.java new file mode 100644 index 0000000..9f655a2 --- /dev/null +++ b/src/main/java/team/flight/backend/dto/PostsResponse.java @@ -0,0 +1,10 @@ +package team.flight.backend.dto; + +import java.util.List; +import java.util.UUID; + +public record PostsResponse( + UUID sessionId, + List posts +) { +} diff --git a/src/main/java/team/flight/backend/repository/PostRepository.java b/src/main/java/team/flight/backend/repository/PostRepository.java index 5e454a8..fc3c134 100644 --- a/src/main/java/team/flight/backend/repository/PostRepository.java +++ b/src/main/java/team/flight/backend/repository/PostRepository.java @@ -1,5 +1,6 @@ package team.flight.backend.repository; +import java.util.List; import java.util.Optional; import java.util.UUID; import org.springframework.data.jpa.repository.JpaRepository; @@ -7,4 +8,6 @@ public interface PostRepository extends JpaRepository { Optional findByIdAndSessionId(Long postId, UUID sessionId); + + List findAllBySessionId(UUID sessionId); } diff --git a/src/main/java/team/flight/backend/service/PostService.java b/src/main/java/team/flight/backend/service/PostService.java index 83bf618..bef63d8 100644 --- a/src/main/java/team/flight/backend/service/PostService.java +++ b/src/main/java/team/flight/backend/service/PostService.java @@ -1,9 +1,12 @@ package team.flight.backend.service; +import java.util.List; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import team.flight.backend.dto.PostInfoResponse; +import team.flight.backend.dto.PostsResponse; import team.flight.backend.entity.Post; import team.flight.backend.repository.PostRepository; import team.flight.backend.service.dto.FirstResponse; @@ -28,4 +31,12 @@ public FirstResponse sendUserFirstRequest(UUID sessionId, Long postId, String re postRepository.save(post); return FirstResponse.from(post); } + + @Transactional(readOnly = true) + public PostsResponse findAllPostsBy(UUID sessionId) { + List response = postRepository.findAllBySessionId(sessionId).stream() + .map(PostInfoResponse::from) + .toList(); + return new PostsResponse(sessionId, response); + } } From 8cc7b4b47c92711334bb30f5d53829783740fc0c Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 5 Sep 2024 21:29:22 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=ED=8A=B9=EC=A0=95=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../team/flight/backend/dto/PostDetailResponse.java | 8 ++++++++ .../java/team/flight/backend/service/PostService.java | 10 ++++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/main/java/team/flight/backend/dto/PostDetailResponse.java diff --git a/src/main/java/team/flight/backend/dto/PostDetailResponse.java b/src/main/java/team/flight/backend/dto/PostDetailResponse.java new file mode 100644 index 0000000..c930c0a --- /dev/null +++ b/src/main/java/team/flight/backend/dto/PostDetailResponse.java @@ -0,0 +1,8 @@ +package team.flight.backend.dto; + +public record PostDetailResponse( + Long postId, + String request, + String result +) { +} diff --git a/src/main/java/team/flight/backend/service/PostService.java b/src/main/java/team/flight/backend/service/PostService.java index bef63d8..9774828 100644 --- a/src/main/java/team/flight/backend/service/PostService.java +++ b/src/main/java/team/flight/backend/service/PostService.java @@ -1,10 +1,12 @@ package team.flight.backend.service; +import jakarta.persistence.EntityNotFoundException; import java.util.List; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import team.flight.backend.dto.PostDetailResponse; import team.flight.backend.dto.PostInfoResponse; import team.flight.backend.dto.PostsResponse; import team.flight.backend.entity.Post; @@ -39,4 +41,12 @@ public PostsResponse findAllPostsBy(UUID sessionId) { .toList(); return new PostsResponse(sessionId, response); } + + @Transactional(readOnly = true) + public PostDetailResponse findPostsBy(Long postId, UUID sessionId) { + Post post = postRepository.findByIdAndSessionId(postId, sessionId) + .orElseThrow(() -> new EntityNotFoundException("해당 게시글을 찾을 수 없습니다.")); + + return new PostDetailResponse(post.getId(), post.getRequest(), post.getResult()); + } } From 39c7338a1188cdbda7a6f44d2cd6f67dd0c355a0 Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 5 Sep 2024 21:29:36 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=ED=8A=B9=EC=A0=95=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20,=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=EA=B8=80=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/controller/PostController.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/team/flight/backend/controller/PostController.java b/src/main/java/team/flight/backend/controller/PostController.java index 7d7fb6c..642c1fd 100644 --- a/src/main/java/team/flight/backend/controller/PostController.java +++ b/src/main/java/team/flight/backend/controller/PostController.java @@ -5,11 +5,16 @@ import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +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.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import team.flight.backend.dto.FirstPostRequest; +import team.flight.backend.dto.PostDetailResponse; +import team.flight.backend.dto.PostsResponse; import team.flight.backend.service.PostService; import team.flight.backend.service.dto.FirstResponse; @@ -27,4 +32,16 @@ public ResponseEntity sendFirstRequest(@RequestBody FirstPostRequ return ResponseEntity.ok() .body(postService.sendUserFirstRequest(UUID.fromString(request.sessionId()), request.postId(), request.request())); } + + @GetMapping + public ResponseEntity getPosts(@RequestParam("sessionId") String sessionId) { + return ResponseEntity.ok().body(postService.findAllPostsBy(UUID.fromString(sessionId))); + } + + @Operation(summary = "특정 게시글 결과 조회 API") + @GetMapping("/{id}") + public ResponseEntity getPostDetail(@PathVariable("id") Long postId, + @RequestParam("sessionId") String sessionId) { + return ResponseEntity.ok().body(postService.findPostsBy(postId, UUID.fromString(sessionId))); + } }