게시판 목록 페이지

총 글 개수가 38개이므로 마지막 페이지에는 3개의 글만 있어야하지만, 현재 5개가 뜬다.

남은 글 개수를 계산해서 겹치지 않고 마지막 페이지에 남아있는 글이 뜨도록 기능을 수정해보자. PageVO의 setTotalData에서 계산하자.

public void setTotalData(int totalData) {
	this.totalData = totalData;
	
	// 총 페이지 수 계산하기
	totalPage = (int)Math.ceil((double)totalData/dataPerPage);
	
	// 마지막 페이지에 남아있는 데이터 수
	lastPageData = totalData%dataPerPage;
	if(lastPageData==0) lastPageData = dataPerPage;
}
public int getLastPageData() {
	return lastPageData;
}

public void setLastPageData(int lastPageData) {
	this.lastPageData = lastPageData;
}

boardMapper.xml에서 쿼리문에 조건문을 생성할 것이다.

<choose><when><otherwise>태그를 이용해서 조건에 따라서 실행할 쿼리문을 다르게 설정할 수 있다.

<select id="boardList" resultType="com.poby.myapp.vo.BoardVO">
    <![CDATA[
    SELECT * FROM 
        (SELECT * FROM 
            (SELECT postno, subject, username, hitcount, to_char(regdate, 'mm-dd hh:mi') regdate 
            FROM board_tbl ORDER BY postno DESC) 
        WHERE rownum<=${nowPage}*${dataPerPage} ORDER BY postno ASC) 
    <choose>
        <when test="totalPage!=nowPage">
            WHERE rownum<=${dataPerPage} ORDER BY postno DESC
        </when>
        <otherwise>
            WHERE rownum<=${lastPageData} ORDER BY postno DESC
        </otherwise>
    </choose>
    ]]>
</select>

※ 500에러 BadSqlGrammarException

위 sql문으로 실행했을때, CDATA의 잘못된 사용으로 sql문법에 예외가 발생했다.

새로 추가한 <choose>는 태그이기 때문에, CDATA안에서 사용하게되면 제기능을 못하게된다.

쿼리문 전체를 CDATA로 감싸주기보다, 부등호에서만 CDATA를 사용하도록 하자.

<select id="boardList" resultType="com.poby.myapp.vo.BoardVO">
	SELECT * FROM 
		(SELECT * FROM 
			(SELECT postno, subject, username, hitcount, to_char(regdate, 'mm-dd hh:mi') regdate 
			FROM board_tbl ORDER BY postno DESC) 
		WHERE rownum<![CDATA[<=]]>${nowPage}*${dataPerPage} ORDER BY postno ASC) 
	<choose>
		<when test="totalPage!=nowPage">
			WHERE rownum<![CDATA[<=]]>${dataPerPage} ORDER BY postno DESC
		</when>
		<otherwise>
			WHERE rownum<![CDATA[<=]]>${lastPageData} ORDER BY postno DESC
		</otherwise>
	</choose>
</select>

총 글 수가 38이므로, 맨 마지막 페이지인 8번 페이지엔 3개에 글만 표시된다.

+ Recent posts