diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index 26f6ff49..3c7fa2cf 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -1,7 +1,7 @@ package leets.weeth.domain.post.controller; import leets.weeth.domain.post.dto.RequestPostDTO; -import leets.weeth.domain.post.dto.ResponsePostDTO; +import leets.weeth.domain.post.dto.PostDTO; import leets.weeth.domain.post.service.PostService; import leets.weeth.global.auth.annotation.CurrentUser; import leets.weeth.global.common.error.exception.custom.InvalidAccessException; @@ -28,20 +28,28 @@ public CommonResponse<String> createOrUpdate(@RequestPart(value = "requestPostDT } @GetMapping("") - public CommonResponse<List<ResponsePostDTO>> findAllPosts(){ - List<ResponsePostDTO> posts = postService.findAllPosts(); + public CommonResponse<List<PostDTO>> findAllPosts(){ + List<PostDTO> posts = postService.findAllPosts(); return CommonResponse.createSuccess(posts); } + @GetMapping("/load") + public CommonResponse<List<PostDTO>> loadPosts(@RequestParam(required = false) Long lastPostId) throws InvalidAccessException { + List<PostDTO> postsLoaded = postService.loadPosts(lastPostId); + return CommonResponse.createSuccess(postsLoaded); + } + + + @GetMapping("/myPosts") - public CommonResponse<List<ResponsePostDTO>> showMyPost(@CurrentUser Long userId){ - List<ResponsePostDTO> myPost = postService.myPosts(userId); + public CommonResponse<List<PostDTO>> showMyPost(@CurrentUser Long userId){ + List<PostDTO> myPost = postService.myPosts(userId); return CommonResponse.createSuccess(myPost); } @GetMapping("/{postId}") - public CommonResponse<ResponsePostDTO> showPost(@PathVariable Long postId){ - ResponsePostDTO newPost = postService.show(postId); + public CommonResponse<PostDTO> showPost(@PathVariable Long postId){ + PostDTO newPost = postService.show(postId); return CommonResponse.createSuccess(newPost); } diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java b/src/main/java/leets/weeth/domain/post/dto/PostDTO.java similarity index 89% rename from src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java rename to src/main/java/leets/weeth/domain/post/dto/PostDTO.java index 765936b6..c27a5a9c 100644 --- a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/PostDTO.java @@ -13,7 +13,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @ToString -public class ResponsePostDTO { +public class PostDTO { private Long id; @NotBlank @@ -30,8 +30,8 @@ public class ResponsePostDTO { private Long totalComments; - public static ResponsePostDTO createResponsePostDTO(Post post) { - return ResponsePostDTO.builder() + public static PostDTO createResponsePostDTO(Post post) { + return PostDTO.builder() .id(post.getId()) .name(post.getUser().getName()) .title(post.getTitle()) diff --git a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java index 2d333e02..3bcc3483 100644 --- a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java +++ b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java @@ -1,8 +1,11 @@ package leets.weeth.domain.post.repository; import leets.weeth.domain.post.entity.Post; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.ArrayList; import java.util.List; @@ -10,4 +13,10 @@ public interface PostRepository extends JpaRepository<Post, Long> { ArrayList<Post> findAll(); List<Post> findByUserId(Long userId, Sort sort); + @Query("SELECT MAX(p.id) FROM Post p") + Long findMaxPostId(); + + @Query("SELECT p FROM Post p WHERE p.id < :maxPostId ORDER BY p.id DESC") + List<Post> findRecentPosts(@Param("maxPostId") Long maxPostId, Pageable pageable); + } diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index ccb7b969..234c3bf7 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -4,7 +4,7 @@ import leets.weeth.domain.file.entity.File; import leets.weeth.domain.file.service.FileService; import leets.weeth.domain.post.dto.RequestPostDTO; -import leets.weeth.domain.post.dto.ResponsePostDTO; +import leets.weeth.domain.post.dto.PostDTO; import leets.weeth.domain.post.entity.Post; import leets.weeth.domain.post.repository.PostRepository; import leets.weeth.domain.user.entity.User; @@ -14,6 +14,8 @@ import leets.weeth.global.common.error.exception.custom.UserNotFoundException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -29,30 +31,30 @@ public class PostService { private final FileService fileService; //모든 게시물 가져오기 - public List<ResponsePostDTO> findAllPosts() { + public List<PostDTO> findAllPosts() { // 모든 게시물을 id에 대해 오름차순으로 조회 List<Post> posts = postRepository.findAll(Sort.by(Sort.Direction.ASC, "id")); return posts.stream() - .map(ResponsePostDTO::createResponsePostDTO) + .map(PostDTO::createResponsePostDTO) .collect(Collectors.toList()); } // 특정 postId의 게시물만 조회 - public ResponsePostDTO show(Long postId) { + public PostDTO show(Long postId) { Post target = postRepository.findById(postId) .orElseThrow(PostNotFoundException::new); - return ResponsePostDTO.createResponsePostDTO(target); + return PostDTO.createResponsePostDTO(target); } // 특정 유저(본인)의 게시물만 조회 - public List<ResponsePostDTO> myPosts(Long userId){ + public List<PostDTO> myPosts(Long userId){ // 특정 유저의 모든 게시물을 오름차순으로 조회 List<Post> myPosts = postRepository.findByUserId(userId, Sort.by(Sort.Direction.ASC, "id")); // Post 리스트를 ResponsePostDTO 리스트로 변환 return myPosts.stream() - .map(ResponsePostDTO::createResponsePostDTO) // Post -> ResponsePostDTO 변환 + .map(PostDTO::createResponsePostDTO) // Post -> ResponsePostDTO 변환 .collect(Collectors.toList()); } @@ -100,4 +102,22 @@ public void delete(Long postId, Long userId) throws InvalidAccessException { } postRepository.delete(deleted); } + + public List<PostDTO> loadPosts(Long lastPostId) throws InvalidAccessException { + Long maxPostId = postRepository.findMaxPostId(); + + if(lastPostId==null){ // 첫번째 요청인 경우 + lastPostId = maxPostId + 1; + } + if(lastPostId <= 1 || lastPostId > maxPostId + 1){ + throw new InvalidAccessException(); // postId가 1 이하이거나 최대값보다 클경우 + } + + Pageable pageable = PageRequest.of(0, 15); // 첫 페이지, 페이지당 15개 게시글 + List<Post> posts = postRepository.findRecentPosts(lastPostId, pageable); + return posts.stream() + .map(PostDTO::createResponsePostDTO) + .toList(); + } + }