Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/main/java/com/example/be/repository/PostRepository.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
package com.example.be.repository;

import com.example.be.domain.Post;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

public interface PostRepository extends JpaRepository<Post, Long> {
}
// PostRepository에 추가
@Query("SELECT p FROM Post p LEFT JOIN FETCH p.comments ORDER BY p.createDate DESC")
Page<Post> findAllWithCommentsOrderByCreateDateDesc(Pageable pageable);}
33 changes: 33 additions & 0 deletions src/main/java/com/example/be/service/PostServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,15 @@
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;


@Service
Expand Down Expand Up @@ -55,4 +60,32 @@ public CommonDTO.IsSuccessDTO write(PostDTO.postRequestDTO request, HttpServletR

return CommonDTO.IsSuccessDTO.builder().isSuccess(true).build();
}

// 페이지네이션을 활용한 게시글 조회 메서드 추가
public PostDTO.PageResponseDTO getPosts(int page, int size) {
Pageable pageable = PageRequest.of(page, size);
Page<Post> postPage = postRepository.findAllWithCommentsOrderByCreateDateDesc(pageable);

List<PostDTO.postResponseDTO> postDtoList = postPage.getContent().stream()
.map(post -> PostDTO.postResponseDTO.builder()
.id(post.getId())
.title(post.getTitle())
.content(post.getContent())
.userName(post.getUser().getName())
.createDate(post.getCreateDate().toLocalDate())
.isDone(post.isDone())
// 댓글 개수 추가
.commentCount(post.getComments() != null ? post.getComments().size() : 0)
.build())
.collect(Collectors.toList());

return PostDTO.PageResponseDTO.builder()
.posts(postDtoList)
.currentPage(postPage.getNumber())
.totalPages(postPage.getTotalPages())
.totalElements(postPage.getTotalElements())
.first(postPage.isFirst())
.last(postPage.isLast())
.build();
}
}
11 changes: 11 additions & 0 deletions src/main/java/com/example/be/web/controller/PostController.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,13 @@
import com.example.be.web.dto.PostDTO;
import com.example.be.web.dto.UserDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/post")
@RequiredArgsConstructor
Expand All @@ -29,4 +32,12 @@ public ApiResponse<CommonDTO.IsSuccessDTO> write(@RequestBody PostDTO.postReques
return ApiResponse.onSuccess(postService.write(request, req));
}

@GetMapping("/list")
@Operation(summary = "게시글 목록 조회 API (페이지네이션)", description = "15개씩 페이지네이션하여 게시글 목록을 조회합니다.")
public ApiResponse<PostDTO.PageResponseDTO> getPosts(
@Parameter(description = "페이지 번호 (0부터 시작)") @RequestParam(defaultValue = "0") int page) {
return ApiResponse.onSuccess(postService.getPosts(page, 4)); // 4개씩 페이지네이션
}


}
20 changes: 16 additions & 4 deletions src/main/java/com/example/be/web/dto/PostDTO.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.example.be.web.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

Expand All @@ -25,17 +27,27 @@ public static class postRequestDTO{
@NoArgsConstructor
@AllArgsConstructor
public static class postResponseDTO {
Long id;
String title;
String content;
String user;
LocalDate date;
String userName;
@JsonFormat(pattern = "yyyy-MM-dd")
LocalDate createDate;
int commentCount;
boolean isDone;
}

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class postListResponseDTO{
List<postResponseDTO> postList;
@Schema(description = "게시글 페이지네이션 응답 DTO")
public static class PageResponseDTO {
private List<postResponseDTO> posts;
private int currentPage;
private int totalPages;
private long totalElements;
private boolean first;
private boolean last;
}
}