[Spring Boot] 페이징

고운·2023년 5월 23일
0

Spring Boot

목록 보기
4/13
post-custom-banner

Controller

필요한 변수들을 초기화한다.

int static pageSIZE=4;     //한 페이지에 레코드를 몇 개씩 보여줄지
int static totalRecord=0;  //총 레코드 수
int static totalPage=1;    //총 페이지 수

URL 뒤에 붙는 parameter(페이지 번호)를 매개변수로 전달받기 위해 @RequestParam을 사용

@RequestParam(value="pageNUM",defaultValue="1") int pageNUM

pageNUM으로 전달되는 값이 없을 시 디폴트로 1을 설정한다.

totalRecord (총 레코드 수) 구하기

Mapper

<select id="total" resultType="java.lang.Integer">
  	select count(*) from goods
</select>

DBManager

public static int getTotal() {
		int cnt=0;
		SqlSession session=sqlSessionFactory.openSession();
		cnt=session.selectOne("goods.total");
		session.close();
		return cnt;
	}

Controller

totalRecord=dao.getTotalRecord();

totalPage 구하기

totalPage=(int)Math.ceil((double)totalRecord/pageSIZE);

Math.ceil은 올림해주는 함수.

totalRecord/pageSIZE 가 나누어 떨어질 경우 그대로 쓰면 되고 나머지가 있을 경우 올림하면 됨. (예: 4.2→5페이지 / 4→4페이지)

모델에 totalPage를 실어 view로 전달해준다.

model.addAttribute("totalPage", totalPage);

view 에서 페이지 번호 출력 및 링크 쿼리 스트링으로 연결

<c:forEach var="i" begin="1" end="${totalPage }">
		<a href="listGoods?pageNUM=${i }">${i }</a>&nbsp;&nbsp;
	</c:forEach>

start(해당 페이지에서 보여줄 레코드 중 제일 처음 레코드), end(마지막 레코드) 구하기

int start=(pageNUM-1)*pageSIZE+1;
int end=pageNUM*pageSIZE;
if (end>totalRecord) {
	end=totalRecord;
}

Mapper에 전달해주기 위해 HashMap에 넣기

map.put("start", start);
map.put("end", end);

Mapper의 findAll에 전달

<select id="findAll" resultType="goodsVO" parameterType="java.util.HashMap">
  select no,name,price,qty,fname from
	(select rownum n, a.* from
	(select * from goods) a)
	where n between #{start} and #{end} 
</select>

페이지 그룹 나누기

(한 페이지에 페이지 번호 몇개씩 보일지)

Controller

//변수 선언, 초기화
private static int pageGroup=5; 
//한 화면에 보여줄 페이지 번호 수 (1 2 3 4 5 ▶ / ◀ 6 7 8 9 10 ▶ / ◀ 11 ...)
//만약 현재페이지가 1,2,3,4,5 ==> startPage=1, endPage=5
//만약 현재페이지가 6,7,8,9,10 ==> startPage=6, endPage=10
//만약 현재페이지가 11,12,13,14,15 ==> startPage=11, endPage=15
//9를 5로 나눈 몫->1 1*5+1

int startPage=((pageNUM-1)/pageGroup)*pageGroup+1;
int endPage=startPage+pageGroup-1;
if(endPage>totalPage) {
	endPage=totalPage;
}  //endPage가 totalPage보다 크면 안 되니까

model.addAttribute("startPage", startPage);
model.addAttribute("endPage", endPage);

View에서 페이지 번호 출력

<c:if test="${startPage>1}">
	<a href="listBoard?pageNUM=${startPage-1 }"></a>&nbsp;&nbsp;
</c:if>
<c:forEach var="i" begin="${startPage }" end="${endPage }">
	<a href="listBoard?pageNUM=${i }">${i }</a>&nbsp;&nbsp;
</c:forEach>
<c:if test="${endPage<totalPage}">
	<a href="listBoard?pageNUM=${endPage+1 }"></a>
</c:if>

컨트롤러 전체코드

package com.example.demo.controller;

import java.util.HashMap;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.example.demo.dao.BoardDAO;
import com.example.demo.vo.BoardVO;

@Controller
public class BoardController {
	
	private static int pageSIZE=3;	//한 화면에 보여줄 레코드의 수
	private static int totalRecord=0; //전체 레코드(게시글)의 수
	private static int totalPage=0;	//전체 페이지 수
	
	private static int pageGroup=5; //한 화면에 보여줄 페이지 번호 수 (1 2 3 4 5 ▶ / ◀ 6 7 8 9 10 ▶ / ◀ 11 ...)
	
	@Autowired
	private BoardDAO dao;

	public void setDao(BoardDAO dao) {
		this.dao = dao;
	}
	
	@RequestMapping("/listBoard")
	public void list(Model model,
			@RequestParam(value="pageNUM", defaultValue="1") int pageNUM) {
		totalRecord=dao.getTotalRecord();
		totalPage=(int) Math.ceil((double)totalRecord/pageSIZE);
		
		int start=(pageNUM-1)*pageSIZE+1;
		int end=start+pageSIZE-1;
		HashMap<String, Object> map=new HashMap<>();
		map.put("start", start);
		map.put("end", end);
		
		System.out.println("pageNUM:"+pageNUM);
		System.out.println("start:"+start);
		System.out.println("end:"+end);
		
		model.addAttribute("list",dao.findAll(map));
		model.addAttribute("totalPage", totalPage);
		
		//만약 현재페이지가 1,2,3,4,5 ==> startPage=1, endPage=5
		//만약 현재페이지가 6,7,8,9,10 ==> startPage=6, endPage=10
		//만약 현재페이지가 11,12,13,14,15 ==> startPage=11, endPage=15
		//9를 5로 나눈 몫->1 1*5+1
		
		int startPage=((pageNUM-1)/pageGroup)*pageGroup+1;
		int endPage=startPage+pageGroup-1;
		if(endPage>totalPage) {
			endPage=totalPage;
		}
		
		System.out.println("startPage:"+startPage);
		System.out.println("endPage:"+endPage);
		
		model.addAttribute("startPage", startPage);
		model.addAttribute("endPage", endPage);
	}
	
	@GetMapping("/detailBoard")
	public void detail(Model model, int no) {
		model.addAttribute("b", dao.findByNo(no));
	}
}
profile
백엔드 개발자
post-custom-banner

0개의 댓글