알고보면코딩천재

게시판 만들기 - Paging (2) 본문

spring

게시판 만들기 - Paging (2)

알코천 2022. 9. 7. 10:37

테스트 할때

매개변수 값 given

테스트 하는 것 when

 

SELECT totalCount,
totalPage,
currentPage,
decode(currentPage, 0, 1, 0) first,
decode(currentPage, totalPage-1, 1, 0) last
FROM
(
select count(*) totalCount, ceil(count(*)/10) totalPage, 0 currentPage, 0 first, 0 last
FROM boards
);

이거를 내가 짤 줄 알아야 한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="site.metacoding.red.domain.boards.BoardsDao">


	<select id="paging" resultType="site.metacoding.red.web.dto.response.boards.PagingDto">
		SELECT totalCount,
		totalPage,
		currentPage,
		decode(currentPage, 0, 1, 0) first,
		decode(currentPage, totalPage-1, 1, 0) last
		FROM
		(
		select count(*) totalCount, ceil(count(*)/10) totalPage, #{page} currentPage, 0
		first, 0 last
		FROM boards
		)
	</select>
	
	<insert id="insert">
		INSERT INTO boards(id, title, content, usersId,
		createdAt)
		VALUES(boards_seq.nextval, #{title}, #{content}, #{usersId},
		sysdate)
	</insert>

	<select id="findById"
		resultType="site.metacoding.red.domain.boards.Boards">
		SELECT id, title, content FROM boards WHERE id=#{id}

	</select>

	<select id="findAll"
		resultType="site.metacoding.red.web.dto.response.boards.MainDto">
		SELECT b.id, b.title, u.username
		FROM boards b
		INNER JOIN
		users u
		ON b.usersId = u.id
		ORDER BY b.id DESC
		OFFSET #{startNum} ROWS
		FETCH NEXT 10 ROWS ONLY
	</select>

	<update id="update">

	</update>

	<delete id="delete">

	</delete>

</mapper>

boolean은 is를 붙인다 -> el에서는 last로 찾아진다

 

package site.metacoding.red.web.dto.response.boards;

public class PagingDto { 
	private Integer totalCount; // 23
	private Integer totalPage; // 3
	private Integer currentPage; // 0
	private boolean isLast; // false
	private boolean isFirst; // true
}
package site.metacoding.red.domain.boards;

import java.util.List;

import site.metacoding.red.web.dto.response.boards.MainDto;
import site.metacoding.red.web.dto.response.boards.PagingDto;

public interface BoardsDao {
	public PagingDto paging(Integer page);
	public void insert(Boards boards); // DTO 생각해보기
	public Boards findById(Integer id);
	public List<MainDto> findAll(int startNum);
	public void update(Boards boards); // DTO 생각해보기
	public void delete(Integer id);
}
package site.metacoding.red.web.dto.response.boards;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class PagingDto { 
	private Integer totalCount; // 23
	private Integer totalPage; // 3
	private Integer currentPage; // 0
	private boolean isLast; // false
	private boolean isFirst; // true
}
package site.metacoding.red.web;

import java.util.List;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;

import lombok.RequiredArgsConstructor;
import site.metacoding.red.domain.boards.BoardsDao;
import site.metacoding.red.domain.users.Users;
import site.metacoding.red.web.dto.request.boards.WriteDto;
import site.metacoding.red.web.dto.response.boards.MainDto;
import site.metacoding.red.web.dto.response.boards.PagingDto;

@RequiredArgsConstructor
@Controller
public class BoardsController {

	private final HttpSession session;
	private final BoardsDao boardsDao;
	// @PostMapping("/boards/{id}/delete")
	// @PostMapping("/boards/{id}/update")
	
	@PostMapping("/boards")
	public String writeBoards(WriteDto writeDto) {
		// 1번 세션에 접근해서 세션값을 확인한다. 그때 Users로 다운캐스팅하고 키값은 principal로 한다.
		Users principal = (Users) session.getAttribute("principal");
		
		// 2번 pricipal null인지 확인하고 null이면 loginForm 리다이렉션해준다.
		if(principal == null) {
			return "redirect:/loginForm";
		}
		
		// 3번 BoardsDao에 접근해서 insert 메서드를 호출한다.
		// 조건 : dto를 entity로 변환해서 인수로 담아준다.
		// 조건 : entity에는 세션의 principal에 getId가 필요하다.
		boardsDao.insert(writeDto.toEntity(principal.getId()));
		
		return "redirect:/";
	}
	
	// http://localhost:8000/
	// http://localhost:8000/?page=0
	@GetMapping({"/", "/boards"}) // 메인페이지
	public String getBoardList(Model model, Integer page) { // 0 -> 0, 1->10, 2->20
		if(page == null) page = 0;
		int startNum = page * 10;
		List<MainDto> boardsList = boardsDao.findAll(startNum);
		PagingDto paging = boardsDao.paging(page);
		model.addAttribute("boardsList", boardsList);
		model.addAttribute("paging", paging);
		return "boards/main";
	}
	
	@GetMapping("/boards/{id}") // 상세보기
	public String getBoardList(@PathVariable Integer id, Model model) {
		model.addAttribute("boards", boardsDao.findById(id));
		return "boards/detail";
	}
	
	
	@GetMapping("/boards/writeForm")
	public String writeForm() {
		Users principal = (Users) session.getAttribute("principal");
		if(principal == null) {
			return "redirect:/loginForm";
		}
		
		return "boards/writeForm";
	}
}

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ include file="../layout/header.jsp"%>

<div class="container">
	<table class="table table-striped">
		<thead>
			<tr>
				<th>번호</th>
				<th>게시글제목</th>
				<th>작성자이름</th>
			</tr>
		</thead>
		<tbody>
			<c:forEach var="boards" items="${boardsList }">
				<tr>
					<td>${boards.id }</td>
					<td><a href="/boards/${boards.id }">${boards.title }</a></td>
					<td>${boards.username }</td>
				</tr>
			</c:forEach>

		</tbody>
	</table>

	<a href="?page=${paging.currentPage+1 }">다음페이지</a>

	<div style="background-color: grey;">
		<h3>totalCount:${paging.totalCount }</h3>
		<h3>totalPage:${paging.totalPage }</h3>
		<h3>currentPage:${paging.currentPage }</h3>
		<h3>isLast:${paging.last }</h3>
		<h3>isFirst:${paging.first }</h3>


	</div>

	<ul class="pagination">
		<li class="page-item"><a class="page-link" href="?page=${paging.currentPage-1 }">Previous</a></li>
		<c:forEach var="i" begin="1" end="${paging.totalPage }">
		<li class="page-item"><a class="page-link" href="?page=${i-1}">${i }</a></li>
		
		<!-- <li class="page-item active"><a class="page-link" href="#">2</a></li>
		<li class="page-item"><a class="page-link" href="#">3</a></li> -->
		</c:forEach>
		<li class="page-item"><a class="page-link" href="?page=${paging.currentPage+1}">Next</a></li>
	</ul>


</div>

<%@ include file="../layout/footer.jsp"%>
Comments