- 게시글 상세보기 페이지에서 이전글 또는 다음글로 바로 이동할 수 있도록 버튼을 생성하고 구현해주었습니다.
- 기능 구현은 이전에 구현했던 코드와 비슷하여 어렵지 않았으나 쿼리를 짜는데 시간이 조금 들었습니다.
📝 BoardRepository
- 우선 쿼리는 아래와 같이 작성하였습니다.
SELECT * FROM board
WHERE id = (SELECT prev_no FROM (SELECT id, LAG(id, 1, -1) OVER(ORDER BY id) AS prev_no FROM board) B
WHERE id = :id)
SELECT * FROM board
WHERE id = (SELECT prev_no FROM (SELECT id, LEAD(id, 1, -1) OVER(ORDER BY id) AS prev_no FROM board) B
WHERE id = :id)
- LAG와 LEAD는 각각 기준 행의 이전 행과 다음 행을 출력해줍니다.
- 위 쿼리를 그대로 사용하여 BoardRepository에 함수를 추가해주었습니다.
package com.cos.blog.repository;
...
// @Repository
public interface BoardRepository extends JpaRepository<Board, Long>{
...
@Query(value = "SELECT * FROM board "
+ "WHERE id = (SELECT prev_no FROM (SELECT id, LAG(id, 1, -1) OVER(ORDER BY id) AS prev_no FROM board) B "
+ "WHERE id = :id)", nativeQuery = true)
Board findPrevBoard(Long id);
@Query(value = "SELECT * FROM board "
+ "WHERE id = (SELECT prev_no FROM (SELECT id, LEAD(id, 1, -1) OVER(ORDER BY id) AS prev_no FROM board) B "
+ "WHERE id = :id)", nativeQuery = true)
Board findNextBoard(Long id);
}
📝 BoardService
- 이후 Service 단에서는 위에서 구현한 함수를 사용하여 사용자에게 출력될 게시글의 이전 게시글과 다음 게시글을 저장하여 View 단에서 해당 정보를 사용할 수 있도록 구현해주어야 합니다.
- 따라서 우선 Board 객체에 새로운 변수를 추가해주었습니다.
package com.cos.blog.model;
...
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Board {
...
@Transient
private Board prev_board;
@Transient
private Board next_board;
...
}
- 두 변수에는 각각 현재 게시글의 이전 게시글과 다음 게시글 객체가 저장될 것이며 그 방법은 아래와 같습니다.
package com.cos.blog.service;
...
@Service
@RequiredArgsConstructor
public class BoardService {
...
@Transactional
public Board detail(Long id, HttpServletRequest request, HttpServletResponse response, Long principal_id) {
...
board.setPrev_board(boardRepository.findPrevBoard(id));
board.setNext_board(boardRepository.findNextBoard(id));
return board;
}
...
📝 detail.jsp
- 마지막으로 View 단에 아래와 같은 코드를 추가해주었습니다.
<div class="list-group">
<a href="/board/${board.next_board.id}?page=${param.page}&searchKeyword=${param.searchKeyword}" class="list-group-item list-group-item-action <c:if test="${empty board.next_board}">disabled</c:if>">
<span style="font-weight: bold;">다음글</span> │ <c:choose>
<c:when test="${empty board.next_board}">
다음글이 없습니다.
</c:when>
<c:otherwise>
<span style="color: blue;">${board.next_board.title}</span>
</c:otherwise>
</c:choose>
</a>
<a href="/board/${board.prev_board.id}?page=${param.page}&searchKeyword=${param.searchKeyword}" class="list-group-item list-group-item-action <c:if test="${empty board.prev_board}">disabled</c:if>">
<span style="font-weight: bold;">이전글</span> │ <c:choose>
<c:when test="${empty board.prev_board}">
이전글이 없습니다.
</c:when>
<c:otherwise>
<span style="color: blue;">${board.prev_board.title}</span>
</c:otherwise>
</c:choose>
</a>
</div>
📝 Result
'🚗 Backend Toy Project > 스프링 부트 게시판' 카테고리의 다른 글
[스프링부트 게시판] 33. 댓글 알림 기능 (1) | 2022.09.23 |
---|---|
[스프링부트 게시판] 32. 이전에 봤던 글 표시 (0) | 2022.09.17 |
[스프링부트 게시판] 30. 게시판 정렬 기능 구현 (0) | 2022.09.03 |
[스프링부트 게시판] 29. 추천 기능 구현 (1) | 2022.09.01 |
[스프링부트 게시판] 28. 게시글 검색 기능 구현 (0) | 2022.08.30 |