- 최신순, 인기순(조회수), 추천순으로 게시판을 정렬하는 기능을 구현해보았습니다.
- Controller에서 파라미터로 정렬 타입을 전달받고 PageRequest.of 메서드를 사용하여 정렬 방식을 변경하는 식으로 구현하려 하였으나 해당 방법을 사용할 경우 데이터를 제대로 정렬하여 뽑아오지만 페이징이 되지 않는 오류가 발생하여 조금 다른 방법을 사용하였습니다.
📝 RecommendRepository, RecommendService
- 우선 추천순 정렬을 위해 Repository에 코드를 추가해주었습니다.
package com.cos.blog.repository;
...
public interface RecommendRepository extends JpaRepository<Recommend, Long>{
...
@Modifying
@Query("update Board b set b.recommendCount = b.recommendCount + 1 where b.id = :board_id")
void increaseRecommendCount(Long board_id);
@Modifying
@Query("update Board b set b.recommendCount = b.recommendCount - 1 where b.id = :board_id")
void decreaseRecommendCount(Long board_id);
}
- 이후 Service에서 위에서 추가한 메서드를 사용하여 카운팅 해주었습니다.
package com.cos.blog.service;
...
@RequiredArgsConstructor
@Service
public class RecommendService {
private final RecommendRepository recommendRepository;
@Transactional
public void recommend(Long board_id, Long principal_id) {
recommendRepository.recommend(board_id, principal_id);
recommendRepository.increaseRecommendCount(board_id);
}
@Transactional
public void cancelRecommend(Long board_id, Long principal_id) {
recommendRepository.cancelRecommend(board_id, principal_id);
recommendRepository.decreaseRecommendCount(board_id);
}
}
📝 BoardController
- Controller에서는 요청되는 경로에 따라 데이터를 알맞게 정렬하여 가져올 수 있도록 구현해주었습니다.
package com.cos.blog.controller;
...
@Controller
@RequiredArgsConstructor
public class BoardController {
...
@GetMapping("/")
public String index(Model model,
@PageableDefault(size = 10, sort = "id", direction = Sort.Direction.DESC) Pageable pageable,
@RequestParam(value = "searchType", defaultValue = "title") String searchType,
@RequestParam(value = "searchKeyword", defaultValue = "") String searchKeyword) {
if(searchKeyword == null || searchKeyword.isBlank()) {
model.addAttribute("boards", boardRepository.findAll(pageable));
}
if(searchType.equals("nickname")) {
model.addAttribute("boards", boardRepository.findByUserNicknameContaining(searchKeyword, pageable));
} else {
model.addAttribute("boards", boardRepository.findByTitleContaining(searchKeyword, pageable));
}
return "index";
}
@GetMapping("/board/{id}")
public String detail(@PathVariable Long id, Model model,
HttpServletRequest request, HttpServletResponse response,
@AuthenticationPrincipal PrincipalDetail principal,
@RequestParam(value = "page", defaultValue = "0") String page,
@RequestParam(value = "sort", defaultValue = "id") String sort,
@RequestParam(value = "searchType", defaultValue = "title") String searchType,
@RequestParam(value = "searchKeyword", defaultValue = "") String searchKeyword) {
model.addAttribute("board", boardService.detail(id, request, response, principal.getUser().getId()));
model.addAttribute("page", page);
model.addAttribute("sort", sort);
model.addAttribute("searchType", searchType);
model.addAttribute("searchKeyword", searchKeyword);
return "board/detail";
}
...
📝 index.jsp
- 마지막으로 View에 Dropdown 엘리먼트를 추가하여 사용자가 클릭할 시에 자동으로 요청을 수행하도록 하였습니다.
<div class="dropdown-menu">
<a class="dropdown-item" href="/?page=${param.page}&sort=id,DESC&searchType=${param.searchType}&searchKeyword=${param.searchKeyword}">최신순</a>
<a class="dropdown-item" href="/?page=${param.page}&sort=count,DESC&searchType=${param.searchType}&searchKeyword=${param.searchKeyword}">인기순</a>
<a class="dropdown-item" href="/?page=${param.page}&sort=recommendCount,DESC&searchType=${param.searchType}&searchKeyword=${param.searchKeyword}">추천순</a>
</div>
'🚗 Backend Toy Project > 스프링 부트 게시판' 카테고리의 다른 글
[스프링부트 게시판] 32. 이전에 봤던 글 표시 (0) | 2022.09.17 |
---|---|
[스프링부트 게시판] 31. 이전글, 다음글 구현 (0) | 2022.09.06 |
[스프링부트 게시판] 29. 추천 기능 구현 (1) | 2022.09.01 |
[스프링부트 게시판] 28. 게시글 검색 기능 구현 (0) | 2022.08.30 |
[스프링부트 게시판] 27. 게시글 작성일 및 조회수 추가 (0) | 2022.07.03 |