처리방법
1. 게시글목록보기( )
- 카테고리가 있으면
- 카테고리가 없으면
장점 : 컨트롤러에서 심플하게 호출 가능
2. 게시글목록보기( )
카테고리별게시글보기( )
장점 : 카테고리별게시글보기 재사용 가능
어떤 방법으로 만들든 동작을 하지만
분리시켜서 서비스를 만드는 게 좋다.
해당 유저의 블로그를 들어갔을 때 전체 글 목록이 나온다.
-- 그 페이지 주인 userId = 1의 모든 게시글!!
-- 카테고리 선택하면
SELECT * FROM post WHERE userId = 1 AND categoryId = 클릭한번호;
카테고리가 쿼리 스트링으로 날아가기 때문에 카테고리가 null일 때는 전체 글 목록,
카테고리를 선택하면 해당 카테고리 아이디로 SELECT 하며 뿌려주자.
@Query(value = "SELECT * FROM post WHERE userId = :userId", nativeQuery = true)
List<Post> findByUserId(@Param("userId") Integer userId);
@Query(value = "SELECT * FROM post WHERE userId = :userId AND categoryId = :categoryId", nativeQuery = true)
List<Post> findByUserIdAndCategoryId(@Param("userId") Integer userId, @Param("categoryId") Integer categoryId);
public PostResponseDto 게시글목록보기(Integer userId) {
// 카테고리목록보기
List<Category> categoriesEntity = categoryRepository.findByUserId(userId);
List<Post> postsEntity = postRepository.findByUserId(userId);
return new PostResponseDto(postsEntity, categoriesEntity);
}
public PostResponseDto 카테고리별게시글목록보기(Integer userId, Integer categoryId) {
List<Category> categoriesEntity = categoryRepository.findByUserId(userId);
List<Post> postsEntity = postRepository.findByUserIdAndCategoryId(userId, categoryId);
return new PostResponseDto(postsEntity, categoriesEntity);
}
@GetMapping("/user/{id}/post")
public String postList(Integer categoryId, @PathVariable Integer id, @AuthenticationPrincipal LoginUser loginUser,
Model model) {
PostResponseDto postResponseDto = null;
if (categoryId == null) {
// SELECT * FROM category WHRER userId = :id
postResponseDto = postService.게시글목록보기(id);
} else {
// SELECT * FROM post WHERE userId = :id AND categoryId = :categoryId
postResponseDto = postService.카테고리별게시글목록보기(id, categoryId);
}
model.addAttribute("postResponseDto", postResponseDto);
return "/post/list";
}
똑같이 postResponseDto로 모델에 담아줬기 때문에 mustache에는 손댈 게 없다.
이제 ORDER BY DESC 해줄 것이다.
최근에 적은 게시글이 위로 올라오게 한다.
post의 id 순서로 ORDER BY 코드를 추가해준다.
@Query(value = "SELECT * FROM post WHERE userId = :userId ORDER BY id DESC", nativeQuery = true)
List<Post> findByUserId(@Param("userId") Integer userId);
@Query(value = "SELECT * FROM post WHERE userId = :userId AND categoryId = :categoryId ORDER BY id DESC", nativeQuery = true)
List<Post> findByUserIdAndCategoryId(@Param("userId") Integer userId, @Param("categoryId") Integer categoryId);
페이징만 하면 끝이다.
글을 5건 정도 쓴 상태로 페이징을 해보자.
Pageable 객체를 사용하면 끝이다.
우리는 page 넘버를 쿼리 스트링으로 받고 있지 않지만 Pageable을 사용하면
얘가 자동으로 page넘버를 쿼리 스트링으로 받아준다.
@Query(value = "SELECT * FROM post WHERE userId = :userId ORDER BY id DESC", nativeQuery = true)
Page<Post> findByUserId(@Param("userId") Integer userId, Pageable pageable);
@Query(value = "SELECT * FROM post WHERE userId = :userId AND categoryId = :categoryId ORDER BY id DESC", nativeQuery = true)
Page<Post> findByUserIdAndCategoryId(@Param("userId") Integer userId, @Param("categoryId") Integer categoryId,
Pageable pageable);
List <Post>로 받던 변수들을 Page<Post> 타입으로 바꿔주고 나면 mustache에서 뿌릴 때도 수정해야 한다.
postResponseDto.posts.content에 접근해야 내부에 값을 가져올 수 있다.
이게 page 객체이다.
페이지의 사이즈, 첫 번째 페이지인지, 토탈 페이지가 몇 개인지
다 리턴해준다.
page 넘버는 0페이지부터 시작한다는 점에 주의하자!!!
다음 시간에는 이전, 다음 버튼을 만들어 페이지 이동을 해보자.
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9