저번에도 올렸던 페이징 처리
아무래도 빠르게 보다보니 많이 까먹어서 다시 영상을 보면서 글을 올려본다.
별거 아닌 거 같지만 페이징 만큼은 난 많이 헷갈린다.
처음에는 StartPage와 EndPage 그냥 보면 식만 외우면 될꺼 같은데 뭔가 어렵다.. ㅠ
먼저 매퍼쪽부터 보자
<select id ="GetListWithPaging" resultType = "org.zerock.domain.BoardVO">
<![CDATA[
SELECT * FROM
(
SELECT /*+ INDEX_DESC(tbl_board pk_board)*/ rownum rn, bno,title,writer,regDate,updateDate
FROM tbl_board
WHERE bno > 0 and rownum > 0 and rownum <= (#{pageNum} * #{amount})
)
WHERE rn > (#{pageNum}-1) * #{amount}
]]>
</select>
BoardMapper.xml에 추가한 페이징 쿼리
참... 복잡해보인다 인라인뷰부터 시작해서 아무래도 이해를 확실히 해야할꺼같다.
:: resultType은 select절에는 항상 들어간다. 결과 데이터를 어떻게 처리해줘야하는지 명시해 줘야하는데 그때 쓰는게 resultType이다.
FROM부터 조회가 되기때문에 인라인뷰를 타는데 여기서 인라인뷰 조건절 끝에 #{pageNum} * #{amount}은
Criteria.java에 있는 필드인데 pageNum은 현재페이지, amount는 한페이지당 몇개씩 보자 정해주는 것이다.
그리고 <![CDATA[ 쿼리 ]]> 꺽새가 있는 쿼리에 쓰는데, 이게 >,<,&가 있을 경우 컴퓨터는 태그로 인식 하기 때문에
CDATA를 쓰면 "야! 이거 쿼리에 쓰는 거야 오해하지마" 라고 해주는 것!
public class Criteria {
//현재 페이지 번호
private int pageNum;
private int amount;
//한페이지당 10개씩 즉, 1~10개의 페이지 번호
public Criteria() {
this(1,10);
}
public Criteria(int pageNum, int amount) {
super();
this.pageNum = pageNum;
this.amount = amount;
}
}
Criteria.java
클래스이름 진짜 적응안되서 바꾸고 싶지만, 혹시나 헷갈리까바 냅뒀다.
Criteria는 페이징처리와 검색을 동시에 할 수 있는 클래스
PageDTO.java
public class PageDTO {
private int startPage ,endPage;
private boolean prev, next;
private int total;
private Criteria cri;
public PageDTO(Criteria cri, int total) {
this.cri = cri;
this.total = total;
this.endPage = (int)(Math.ceil(cri.getPageNum()/ 10.0)) * 10;
this.startPage = endPage - 9;
this.prev = this.startPage > 1;
// 만약 총 페이지가 71건이면 71.0 / 10 = realEnd는 7.1이 됨 ceil 사용으로 올린다.
int realEnd = (int) ( Math.ceil( (total * 1.0) / cri.getAmount()) ) ;
this.endPage = realEnd <= endPage? realEnd : endPage;
this.next = this.endPage < realEnd;
}
}
실질적으로 페이징을 담당하는 요녀석 Criteria에 현재페이지, 한페이지에 보여줄 페이지를 가져와
밑에 게시판 1~10 페이징버튼을 만드는데 필요하다.
endPage가 은근 헷갈려서 고생했는데, 이해하고 나니 쉬운거였다.
현재페이지가 예로 4페이지라고 한다면 4/10.0 * 10 하면 그냥 똑같은 숫자가 나온다. 이러면 의미가 없고
0.4를 강제로 올림 해주는 Math.ceil를 쓴다. ceil은 반환형이 double형이기 때문에 캐스팅 int를 꼭 해줘야한다.
realEnd(마지막페이지 계산)
'Back-End > Spring' 카테고리의 다른 글
[Spring] 검색 화면 처리 (0) | 2021.08.11 |
---|---|
[Spring] 검색 처리 (0) | 2021.08.11 |
[Spring] 인덱스,힌트와 ROWNM (0) | 2021.08.05 |
[Spring] 조회 처리 및 페이지 이동 (0) | 2021.08.04 |
[Spring] 한글 필터 설정 및 모달창 (0) | 2021.08.03 |