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))); + } } 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/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/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)); + } } 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..9774828 100644 --- a/src/main/java/team/flight/backend/service/PostService.java +++ b/src/main/java/team/flight/backend/service/PostService.java @@ -1,9 +1,14 @@ 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; import team.flight.backend.repository.PostRepository; import team.flight.backend.service.dto.FirstResponse; @@ -28,4 +33,20 @@ 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); + } + + @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()); + } }