공부공부

게시판 만들기 9.페이징 따라하기

냘로하 2020. 8. 24. 16:05

오늘은 말 그대로 페이징 기능을 '따라해서' 작성하려고 한다.

다른 블로그에 있는 글을 이용하여 따라하기 때문에, 이해하느라 주석을 많이 넣는부분이 있을 수 있고, 지금까지의 스타일과 다르게 작성될수도 있다. (물논 수정하는 도중에 내 스타일로 바뀔 것이다.)

1. 페이징 DTO 만들기.

po9357.github.io/spring/2019-05-28-Board_Paging/

 

[Spring] 스프링 게시판 만들기 - 페이징(Paging) 처리하기

글 목록을 보여줄 때 더 깔끔하고 편리하게 보여주기 위한 페이징 처리에 대해 알아본다

po9357.github.io

참고했던 블로그에서는 vo라고 부른다. (vo와 dto의 정확한 구분까지는 아직 이해하기 힘들...다..)

참고 : ijbgo.tistory.com/9

 

VO vs DTO

VO vs DTO VO(Value Object) -       데이터 그 자체로 의미 있는 것을 담고 있는 객체이다. -       DTO와 동일한 개념이나 차이점은 Read–Only 속성 객체이다. -       간단한 독립체( Entit..

ijbgo.tistory.com

이 글을 참고해서 더 공부해야겠읍니다.

일단 페이징으로 넘어가자.

// 현재페이지, 시작페이지, 끝페이지, 게시글 총 갯수, 페이지당 글 갯수, 마지막페이지, SQL쿼리에 쓸 start, end
	private int nowPage, startPage, endPage, total, cntPerPage, lastPage, start, end;
	private int cntPage = 5;
	public Board2Page() {	}
	public Board2Page(int total, int nowPage, int cntPage) {
		setNowPage(nowPage);
		//현재 페이지
		setCntPerPage(cntPerPage);
		//페이지 당 게시글수
		setTotal(total);
		//게시글 총 갯수
		calcLastPage(getTotal(), getCntPerPage());
		//제일 마지막 페이지 계산
		//시작 끝 페이지 계산 - 아래.
		calcStartEndPage(getNowPage(), cntPage);
		calcStartEnd(getNowPage(), getCntPerPage());
		
	}
	// 제일 마지막 페이지 계산
		public void calcLastPage(int total, int cntPerPage) {
			setLastPage((int) Math.ceil((double)total / (double)cntPerPage));
		}
		// 시작, 끝 페이지 계산
		public void calcStartEndPage(int nowPage, int cntPage) {
			setEndPage(((int)Math.ceil((double)nowPage / (double)cntPage)) * cntPage);
			if (getLastPage() < getEndPage()) {
				setEndPage(getLastPage());
			}
			setStartPage(getEndPage() - cntPage + 1);
			if (getStartPage() < 1) {
				setStartPage(1);
			}
		}
		// DB 쿼리에서 사용할 start, end값 계산
		public void calcStartEnd(int nowPage, int cntPerPage) {
			setEnd(nowPage * cntPerPage);
			setStart(getEnd() - cntPerPage + 1);
		}

DTO를 생성했다. 이 글을 복사하고 이클립스의  getter, setter, tostring 기능을 이용하여 작업하면 쉽게 dto 완성~

2. 총 게시글 수 구하기.

이것은 쿼리문으로 쉽게 구분 가능하다.

select count(*) from BOARDTABLE;

count(*) 을 이용하여 boardtable을 조회해서 총 게시글 수 20개를 구했고, 이걸 이클립스에 적용시키면 된다.

적용방법은  sql.xml파일에 <select></select> 구문을 추가해서 안에 해당 코드를 넣어주면 된다.

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

이제 이것을 불러오는 dao를 생성하고, 서비스단에서 컨트롤러의 메소드에서 작업하게끔 도와주면 끝! (말은 쉽다.)

DAO단

	public int countBoard() {
		
		return session.selectOne("boarddate.countboard");
	}

서비스단

public int countBoard() {
		return dao.countBoard();
	}

컨트롤러단(메인페이지 메소드)

int total = service.countBoard();
System.out.println("total의 값: "+total);

이 구문을 만들어주어서 테이블 페이지를 실행하면..

총 게시글 수 20개가 잘 출력된다.

총 게시글 구하기 성공!

3. 페이징 작업

게시판으로 들어가기 시작할때 컨트롤러에서 파라미터를 요청하게 된다.하지만 첫 페이지에서는 파라미터를 넘겨받을수 없을수도 있기 때문에, 파라미터 받기 옵션에서  required=false 를 추가하게 된다.

@Controller
public class board2Controller {
	@Autowired 
	BoardService service;
	
	@RequestMapping("/board")
	public ModelAndView seeboardController(ModelAndView mv,Board2DTO dto,Board2Page page
			, @RequestParam(value="nowPage", required=false)String nowPage
			, @RequestParam(value="cntPerPage", required=false)String cntPerPage) {
		
		//페이징
		int total = service.countBoard();
		System.out.println("total의 값: "+total);
		if (nowPage == null && cntPerPage == null) {
			nowPage = "1";
			cntPerPage = "5";
		} else if (nowPage == null) {
			nowPage = "1";
		} else if (cntPerPage == null) { 
			cntPerPage = "5";
		}
		page = new Board2Page(total, Integer.parseInt(nowPage), Integer.parseInt(cntPerPage));
		System.out.println(page);
		//페이징 끝
		List<Board2DTO> dtolist = service.seeboardService(dto);
		List<Board2DTO> dtolist2 = service.selectBoard(page);
		mv.addObject("dtolist",dtolist2);
		mv.setViewName("board");
		return mv;
		
	}

}

컨트롤러를 다 긁어왔다.  보면 @RequestParam 구문이 이전글에서 추가되었는데, 옵션에 required=false로 꼭 필수도 받을 필요는 없다고 옵션에 추가해두었다.

페이징이 끝나고 그 정보로 dtolist를 새로 출력해야 한다. (dtolist 변수는 모든 게시글을 출력한다.)

그래서 dtolist2 변수를 만들고, selectBoard 메소드를 서비스단에 만들어서 DAO에 연결할수 있도록 했다.

서비스단

	public List<Board2DTO> selectBoard(Board2Page page){
		 List<Board2DTO> result = dao.selectBoard(page);
		return result;
		 
	}

DAO단

	//페이징 작업을해서 해당 페이지의 게시글을 보는 기능.
	public List<Board2DTO> selectBoard(Board2Page page) {
		 List<Board2DTO> result = session.selectList("boarddate.selectBoard", page);
		return result;
	}

sql.xml 파일

	<select id="selectBoard" resultType="com.board2.DTO.Board2DTO">
	select * from (
			select ROWNUM RN, A.* from (
				SELECT * FROM BOARDTABLE 
				ORDER BY boardno DESC 
			)A
		)
		where RN between #{start} and #{end}
	</select>

이로서 페이징 작업이 백단에서는 완료! 이제 jsp페이지단에서 작업을 해보자!

4.jsp에 반영하기.

jsp단에서 넣어야 할 부분은, 페이지를 누르면 해당 페이지의 게시글이 출력되게 하는 기능입니다.

 그러니까 꼭 해야할 부분은...페이징 작업에 사용했던 DTO의 정보를 이용해서 총 페이지가 나와야 하고

페이지를 누르면 링크로 해당 페이지로 들어가야 합니다.

그 내용을 출력하기 위해서 아래 코드를 넣었습니다.

<div style="display: block; text-align: center;">		
		<c:if test="${page.startPage != 1 }">
			<a href="/board?nowPage=${page.startPage - 1 }&cntPerPage=${page.cntPerPage}">&lt;</a>
		</c:if>
		<c:forEach begin="${page.startPage }" end="${page.endPage }" var="p">
			<c:choose>
				<c:when test="${p == page.nowPage }">
					<b>${p }</b>
				</c:when>
				<c:when test="${p != page.nowPage }">
					<a href="/board?nowPage=${p }&cntPerPage=${page.cntPerPage}">${p }</a>
				</c:when>
			</c:choose>
		</c:forEach>
		<c:if test="${page.endPage != page.lastPage}">
			<a href="/board?nowPage=${page.endPage+1 }&cntPerPage=${page.cntPerPage}">&gt;</a>
		</c:if>
	</div>

 

 

페이징 성공!

페이징 성공!