Loading...

Spring/Tistory / / 2022. 4. 27. 00:22

블로그-V3. 카테고리별 글 목록 보기(페이징 적용)

반응형

 

 

처리방법

 

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

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형