오늘은 말 그대로 페이징 기능을 '따라해서' 작성하려고 한다.
다른 블로그에 있는 글을 이용하여 따라하기 때문에, 이해하느라 주석을 많이 넣는부분이 있을 수 있고, 지금까지의 스타일과 다르게 작성될수도 있다. (물논 수정하는 도중에 내 스타일로 바뀔 것이다.)
1. 페이징 DTO 만들기.
po9357.github.io/spring/2019-05-28-Board_Paging/
[Spring] 스프링 게시판 만들기 - 페이징(Paging) 처리하기
글 목록을 보여줄 때 더 깔끔하고 편리하게 보여주기 위한 페이징 처리에 대해 알아본다
po9357.github.io
참고했던 블로그에서는 vo라고 부른다. (vo와 dto의 정확한 구분까지는 아직 이해하기 힘들...다..)
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);
이 구문을 만들어주어서 테이블 페이지를 실행하면..
총 게시글 구하기 성공!
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}"><</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}">></a>
</c:if>
</div>
페이징 성공!
'공부공부' 카테고리의 다른 글
게시판 만들기 11.CURD의 첫걸음 - 상세보기 (1) | 2020.08.25 |
---|---|
게시판 만들기 10.부트스트랩 ,테이블 정리 (0) | 2020.08.25 |
게시판 만들기 8. 뷰단 만들기 (0) | 2020.08.22 |
spring 게시판 만들기 7.흐름? (0) | 2020.08.16 |
spring 게시판 만들기 6.DTO (0) | 2020.08.16 |