[스프링부트 게시판] 31. 이전글, 다음글 구현

2022. 9. 6. 13:34·🚗 Backend Toy Project/스프링 부트 게시판
  • 게시글 상세보기 페이지에서 이전글 또는 다음글로 바로 이동할 수 있도록 버튼을 생성하고 구현해주었습니다.
  • 기능 구현은 이전에 구현했던 코드와 비슷하여 어렵지 않았으나 쿼리를 짜는데 시간이 조금 들었습니다.

📝 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


 

GitHub - Daegwon-Kim/SpringBoot-JPA-Blog

Contribute to Daegwon-Kim/SpringBoot-JPA-Blog development by creating an account on GitHub.

github.com

 

저작자표시 (새창열림)

'🚗 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
'🚗 Backend Toy Project/스프링 부트 게시판' 카테고리의 다른 글
  • [스프링부트 게시판] 33. 댓글 알림 기능
  • [스프링부트 게시판] 32. 이전에 봤던 글 표시
  • [스프링부트 게시판] 30. 게시판 정렬 기능 구현
  • [스프링부트 게시판] 29. 추천 기능 구현
Baeg-won
Baeg-won
  • Baeg-won
    좋았다면 추억이고 나빴다면 경험이다.
    Baeg-won
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 🍃 Spring, Spring Boot
        • 스프링 프레임워크 기초
        • 스프링 핵심 원리 - 기본편
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편
        • 스프링 MVC
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리..
      • 🥑 Web Technoloy
      • 🚗 Backend Toy Project
        • 스프링 부트 게시판
        • Photogram
        • Baeg-won Clothing Gallery
      • 🥇 Problem Solving
        • Breadth-First Search
        • Depth-First Search
        • Backtracking
        • Simulation
        • Two-pointer
        • Binary Search
        • Greedy
        • Dynamic Programming
        • Minimum Spanning Tree
        • Dijkstra
        • Floyd warshall
      • ☕ Java
        • 명품 자바 에센셜
        • Applications
      • 🍦 JavaScript
        • JavaScript 기초
      • 🐧 Linux
        • 이것이 리눅스다(CentOS 8)
      • 📟 Database
        • 혼자 공부하는 SQL
      • 🧬 Data Structure
      • 🎬 HTML
      • 🎤 Tech Interview
      • 📌 etc
        • Unity 2D Raising Jelly Game
        • C++
        • 영어 쉐도잉
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Baeg-won
[스프링부트 게시판] 31. 이전글, 다음글 구현
상단으로

티스토리툴바