-
[Spring] 게시판 만들기(17) - 페이징(Paging) 처리Spring/4.3.x - 게시판 만들기 2018. 12. 19. 11:03반응형
1. 페이징 처리를 위한 쿼리 추가 및 수정
1_1) 게시물 총 개수를 구하는 쿼리 추가
페이징 처리를 위해서는 게시물 총 개수가 필요하기 때문에 쿼리를 추가하세요.
123456<select id="getBoardCnt" parameterType="com.spring.board.form.BoardForm" resultType="int">SELECT COUNT(*)FROM BOARD.TB_BOARD</select>cs 1_2) 게시물 목록을 조회하는 쿼리 수정
페이징 처리를 위해서는 한 페이지의 게시물 목록만 조회해야 합니다. MYSQL에서는 LIMIT ~ OFFSET을 사용하며 한 페이지의 게시물 목록만 조회할 수 있으므로 게시물 목록을 조회하는 쿼리에 LIMIT ~ OFFSET을 추가하세요. LIMIT는 게시물 목록의 수, OFFSET은 게시물을 몇 번째부터 가져올지를 정의할 수 있습니다.
1234567891011121314151617181920212223<select id="getBoardList" parameterType="com.spring.board.form.BoardForm" resultType="com.spring.board.dto.BoardDto">SELECT *FROM (SELECT BOARD_SEQ, BOARD_RE_REF, BOARD_RE_LEV, BOARD_RE_SEQ, BOARD_WRITER, BOARD_SUBJECT, BOARD_CONTENT, BOARD_HITS, DEL_YN, INS_USER_ID, CAST( DATE_FORMAT( INS_DATE, '%Y-%m-%d %H:%i:%s' ) AS CHAR(19) ) AS INS_DATE, UPD_USER_ID, CAST( DATE_FORMAT( UPD_DATE, '%Y-%m-%d %H:%i:%s' ) AS CHAR(19) ) AS UPD_DATEFROM BOARD.TB_BOARDORDER BY BOARD_RE_REF DESC, BOARD_RE_SEQ ASC) T1LIMIT #{limit} OFFSET #{offset}</select>cs boardMapper.xml
더보기123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.spring.board.boardMapper"><select id="getBoardCnt" parameterType="com.spring.board.form.BoardForm" resultType="int">SELECT COUNT(*)FROM BOARD.TB_BOARD</select><select id="getBoardList" parameterType="com.spring.board.form.BoardForm" resultType="com.spring.board.dto.BoardDto">SELECT *FROM (SELECT BOARD_SEQ, BOARD_RE_REF, BOARD_RE_LEV, BOARD_RE_SEQ, BOARD_WRITER, BOARD_SUBJECT, BOARD_CONTENT, BOARD_HITS, DEL_YN, INS_USER_ID, CAST( DATE_FORMAT( INS_DATE, '%Y-%m-%d %H:%i:%s' ) AS CHAR(19) ) AS INS_DATE, UPD_USER_ID, CAST( DATE_FORMAT( UPD_DATE, '%Y-%m-%d %H:%i:%s' ) AS CHAR(19) ) AS UPD_DATEFROM BOARD.TB_BOARDORDER BY BOARD_RE_REF DESC, BOARD_RE_SEQ ASC) T1LIMIT #{limit} OFFSET #{offset}</select><delete id="updateBoardHits" parameterType="com.spring.board.form.BoardForm">UPDATE BOARD.TB_BOARDSET BOARD_HITS = BOARD_HITS + 1, UPD_USER_ID = 'NONMEMBER', UPD_DATE = NOW()WHERE BOARD_SEQ = #{board_seq}</delete><select id="getBoardDetail" parameterType="com.spring.board.form.BoardForm" resultType="com.spring.board.dto.BoardDto">SELECT BOARD_SEQ, BOARD_RE_REF, BOARD_RE_LEV, BOARD_RE_SEQ, BOARD_WRITER, BOARD_SUBJECT, BOARD_CONTENT, BOARD_HITS, DEL_YN, INS_USER_ID, CAST( DATE_FORMAT( INS_DATE, '%Y-%m-%d %H:%i:%s' ) AS CHAR(19) ) AS INS_DATE, UPD_USER_ID, CAST( DATE_FORMAT( UPD_DATE, '%Y-%m-%d %H:%i:%s' ) AS CHAR(19) ) AS UPD_DATEFROM BOARD.TB_BOARDWHERE BOARD_SEQ = #{board_seq}</select><insert id="insertBoard" parameterType="com.spring.board.form.BoardForm">INSERTINTO BOARD.TB_BOARD(BOARD_RE_REF, BOARD_RE_LEV, BOARD_RE_SEQ, BOARD_WRITER, BOARD_SUBJECT, BOARD_CONTENT, INS_USER_ID, INS_DATE, UPD_USER_ID, UPD_DATE)VALUES(0, 0, 0, #{board_writer}, #{board_subject}, #{board_content}, 'NONMEMBER', NOW(), 'NONMEMBER', NOW())</insert><insert id="insertBoardFail" parameterType="com.spring.board.form.BoardForm">INSERTINTO BOARD.TB_BOARD(BOARD_RE_REF, BOARD_RE_LEV, BOARD_RE_SEQ, BOARD_WRITER, BOARD_SUBJECT, BOARD_CONTENT, INS_USER_ID, INS_DATE, UPD_USER_ID, UPD_DATE)VALUES(0, 0, 0, #{board_writer1}, #{board_subject}, #{board_content}, 'NONMEMBER', NOW(), 'NONMEMBER', NOW())</insert><delete id="deleteBoard" parameterType="com.spring.board.form.BoardForm">DELETEFROM BOARD.TB_BOARDWHERE BOARD_SEQ = #{board_seq}</delete><delete id="updateBoard" parameterType="com.spring.board.form.BoardForm">UPDATE BOARD.TB_BOARDSET BOARD_SUBJECT = #{board_subject}, BOARD_CONTENT = #{board_content}, UPD_USER_ID = 'NONMEMBER', UPD_DATE = NOW()WHERE BOARD_SEQ = #{board_seq}</delete></mapper>cs 2. 페이징 처리를 위한 파일 추가 및 수정
2_1) 페이징 처리를 위한 변수 설명
pagination : 페이징 네비게이션 결과 값을 저장할 변수
functionName : 페이지의 번호를 클릭했을 때 호출되는 자바스크립트 함수명 또는 게시글 조회를 요청하는 함수명을 저장할 변수
currentPageNo : 현재 화면에 출력되고 있는 페이지 번호 또는 페이지의 번호를 클릭했을 때에 번호를 저장할 변수
countPerList : 한 화면에 출력되는 게시글의 수를 저장할 변수
countPerPage : 한 화면에 출력되는 페이지의 수를 저장할 변수
totalListCount : 총 게시글의 수를 저장할 변수
totalPageCount : 총 페이지의 수를 저장할 변수
viewFirstPage : 첫 페이지 번호를 저장할 변수
viewLastPage : 마지막 페이지 번호를 저장할 변수
totalListCount 는 총 게시글의 수를 구하는 쿼리를 추가하여 결과 값을 저장해야 합니다.
totalPageCount 는 총 게시글의 수(totalListCount) / 한 화면에 출력되는 페이지의 수(countPerPage) 에 값을 저장하면 되는데, 나머지가 존재하는 경우는 1을 더해주어야 합니다. 예를 들어, 총 게시글의 수(totalListCount)가 100개이고 한 화면에 출력되는 페이지의 수(countPerPage)가 10개인 게시글을 출력하는 경우 총 게시글의 수(totalListCount)를 한 화면에 출력되는 페이지의 수(countPerPage)로 나눌 때 나머지가 존재하지 않아 게시글을 모두 출력할 수 있지만, 총 게시글의 수(totalListCount)가 95개이고 한 화면에 출력되는 페이지의 수(countPerPage)가 10개인 게시글을 출력하는 경우 총 게시글의 수(totalListCount)를 한 화면에 출력되는 페이지의 수(countPerPage)로 나눌 때 나머지 5가 존재하여 게시글을 모두 출력할 수 없습니다. 이처럼 나머지가 존재할 때는 1을 더해주어야 합니다.
1234int totalPageCount = totalListCount / countPerList;if (totalListCount % countPerList > 0) {totalPageCount = totalPageCount + 1;}cs viewFirstPage 는 (((현재 페이지 번호(currentPageNo) - 1) / 한 화면에 출력되는 페이지의 수(countPerPage)) * 한 화면에 출력되는 페이지의 수(countPerPage)) + 1에 값을 저장해야 합니다. 연산되는 내용에 1을 빼고 더하는 이유는 한 화면에 출력되는 페이지 수(countPerPage)가 10일 때 페이징 네비게이션에 출력되는 페이지 번호는 1~10, 11~20, 21~30 처럼 출력되고, 마지막 페이지의 번호(viewLastPage)를 한 화면에 출력되는 페이지의 수(countPerPage)로 나누었을 때 첫 페이지의 번호(viewFirstPage)부터 마지막 페이지의 번호(viewLastPage) 전에 번호보다 값이 1 많습니다. 그래서 한 화면에 출력되는 페이지 수(countPerPage)로 나누기 전에 1을 빼고 곱하기 전에 1을 더해주어야 합니다.
1int firstPageNo = (((currentPageNo - 1) / countPerPage) * countPerPage) + 1;cs viewLastPage 는 (첫 페이지 번호(viewFirstPage) + 한 화면에 출력되는 페이지 수(countPerPage)) - 1에 값을 저장해야 합니다. 첫 페이지 번호(viewFirstPage)가 1, 11, 21처럼 일의 자리가 1로 시작하므로 한 화면에 출력되는 페이지 수(countPerPage)를 더한 후 1을 빼주어야 합니다. 그리고 마지막 페이지 번호(viewLastPage)에 경우 총 페이지의 수(totalPageCount)를 고려해야 되는데요. 예를 들어, 총 게시글 수(totalListCount)가 150개인 경우 총 페이지의 수(totalPageCount)는 15가 되고, 마지막 페이지 번호(viewLastPage)는 10과 20입니다. 이처럼 마지막 페이번 번호(ViewLastPage)가 총 페이지 번호(totalPageCount)보다 큰 경우는 16~20 페이지에는 출력할 수 있는 게시글이 없기 때문에 마지막 페이지 번호(viewLastPage)에 총 페이지 번호(totalPageCount)를 저장해야 합니다.
1234int viewLastPage= firstPageNo + countPerPage - 1;if (viewLastPage> totalPageCount) {viewLastPage= totalPageCount;}cs totalFirstPage : 전체 페이지 중에 처음 페이지 번호를 저장할 변수
totalLastPage : 전체 페이지 중에 마지막 페이지 번호를 저장할 변수
prePerPage : 이전 페이지 네이게이션 중에 처음 페이지 번호를 저장할 변수
nextPerPage : 다음 페이지 네비게이션 중에 처음 페이지 번호를 저장할 변수
페이지 번호를 설정하는 부분은 첫 페이지 번호, 마지막 페이지 번호만 알고 있다면 for을 사용하여 구현할 수 있습니다. for문 안에 if문은 현재 페이지 번호에 스타일을 추가하기 위해 추가했습니다. a태그 구현 시에 functionName을 추가한 것은 페이지 번호를 클릭 시에 게시판 조회 함수를 호출하기 위해 추가했습니다.
1234567891011pagination += "<a href='javascript:" + functionName + "(\"" + totalFirstPage + "\");' class=\"direction_left01\">[<<]</a>";pagination += "<a href='javascript:" + functionName + "(" + prePerPage + ");' class=\"direction_left01\">[<]</a>";for (int a = viewFirstPage; a <= ViewLastPage; a++) {if (a == currentPage) {pagination += "<a href='javascript:" + functionName + "(\"" + a + "\");' class='onpage'>[" + a + "]</a>";} else {pagination += "<a href='javascript:" + functionName + "(\"" + a + "\");'>[" + a + "]</a>";}}pagination += "<a href='javascript:" + functionName + "(" + nextPerPage + ");' class=\"direction_right01\">[>]</a>";pagination += "<a href='javascript:" + functionName + "(" + totalLastPage + ");' class=\"direction_right01\">[>>]</a>";cs 2_2) PagingUtil.Java 추가
com.spring.board.common 패키지 밑에 페이징 처리를 위한 PagingUtil.java 추가하세요.
PagingUtil.Java
더보기123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172package com.spring.board.common;import com.spring.board.dto.CommonDto;import com.spring.board.form.CommonForm;/*** 페이지 네비게이션 정보 설정을 위한 클래스*/public class PagingUtil {public static CommonDto setPageUtil(CommonForm commonForm) {CommonDto commonDto = new CommonDto();String pagination = ""; // 페이징 결과 값String functionName = commonForm.getFunction_name(); // 페이징 목록을 요청하는 자바스크립트 함수명int currentPage = commonForm.getCurrent_page_no(); // 현재 페이지 번호int countPerList = commonForm.getCount_per_list(); // 한 화면에 출력될 게시물 수int countPerPage = commonForm.getCount_per_page(); // 한 화면에 출력될 페이지 수int totalListCount = commonForm.getTatal_list_count(); // 총 게시물 수int totalPageCount = totalListCount / countPerList; // 총 페이지 수if (totalListCount % countPerList > 0) { // 총 페이수를 구할 때 int형으로 계산하면 나머지가 있는 경우 게시물이 존재하기 때문에 총 페이지의 수를 수정totalPageCount = totalPageCount + 1;}int viewFirstPage = (((currentPage - 1) / countPerPage) * countPerPage) + 1; // 한 화면에 첫 페이지 번호int ViewLastPage = viewFirstPage + countPerPage - 1; // 한 화면에 마지막 페이지 번호if (ViewLastPage > totalPageCount) { // 마지막 페이지의 수가 총 페이지의 수보다 큰 경우는 게시물이 존재하지 않기 때문에 마지막 페이지의 수를 수정ViewLastPage = totalPageCount;}int totalFirstPage = 1; // 전체 페이지 중에 처음 페이지int totalLastPage = totalPageCount; // 전체 페이지 중에 마지막 페이지int prePerPage = 0; // 이전 화면에 첫번째 번호if (viewFirstPage - countPerPage > 0) {prePerPage = viewFirstPage - countPerPage;} else {prePerPage = totalFirstPage;}int nextPerPage = 0; // 이후 화면에 첫번째 번호if (viewFirstPage + countPerPage < totalPageCount) {nextPerPage = viewFirstPage + countPerPage;} else {nextPerPage = totalPageCount;}// 페이지 네이게이션 설정pagination += "<div class='pagination'>";pagination += "<a href='javascript:" + functionName + "(\"" + totalFirstPage + "\");' class=\"direction_left01\">[<<]</a>";pagination += "<a href='javascript:" + functionName + "(" + prePerPage + ");' class=\"direction_left01\">[<]</a>";for (int a = viewFirstPage; a <= ViewLastPage; a++) {if (a == currentPage) {pagination += "<a href='javascript:" + functionName + "(\"" + a + "\");' class='onpage'>[" + a + "]</a>";} else {pagination += "<a href='javascript:" + functionName + "(\"" + a + "\");'>[" + a + "]</a>";}}pagination += "<a href='javascript:" + functionName + "(" + nextPerPage + ");' class=\"direction_right01\">[>]</a>";pagination += "<a href='javascript:" + functionName + "(" + totalLastPage + ");' class=\"direction_right01\">[>>]</a>";pagination += "</div>";int offset = ((currentPage - 1) * countPerList); // 한 화면의 표출되는 게시물의 시작 번호 (쿼리 조건절)// LIMIT는 가져올 row의 수, OFFSET은 몇 번째 row부터 가져올지를 결정commonDto.setLimit(countPerList);commonDto.setOffset(offset);commonDto.setPagination(pagination);return commonDto;}}cs 2_3) CommonForm.java, CommonDto.java 추가- com.spring.board.dto.common 패키지 밑에 CommonForm.java 추가하세요.
- com.spring.board.dto.common 패키지 밑에 CommonDto.java 추가하세요.
CommonForm.java
더보기1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677package com.spring.board.form;public class CommonForm {String function_name;int current_page_no;int count_per_page;int count_per_list;int tatal_page_count;int tatal_list_count;int limit;int offset;public String getFunction_name() {return function_name;}public void setFunction_name(String function_name) {this.function_name = function_name;}public int getCurrent_page_no() {return current_page_no;}public void setCurrent_page_no(int current_page_no) {this.current_page_no = current_page_no;}public int getCount_per_page() {return count_per_page;}public void setCount_per_page(int count_per_page) {this.count_per_page = count_per_page;}public int getCount_per_list() {return count_per_list;}public void setCount_per_list(int count_per_list) {this.count_per_list = count_per_list;}public int getTatal_page_count() {return tatal_page_count;}public void setTatal_page_count(int tatal_page_count) {this.tatal_page_count = tatal_page_count;}public int getTatal_list_count() {return tatal_list_count;}public void setTatal_list_count(int tatal_list_count) {this.tatal_list_count = tatal_list_count;}public int getLimit() {return limit;}public void setLimit(int limit) {this.limit = limit;}public int getOffset() {return offset;}public void setOffset(int offset) {this.offset = offset;}}cs CommonDto.java더보기1234567891011121314151617181920212223242526272829303132package com.spring.board.dto;public class CommonDto {int limit;int offset;String pagination;public int getLimit() {return limit;}public void setLimit(int limit) {this.limit = limit;}public int getOffset() {return offset;}public void setOffset(int offset) {this.offset = offset;}public String getPagination() {return pagination;}public void setPagination(String pagination) {this.pagination = pagination;}}cs 2_4) BoardForm.java, BoardDto.java 수정BoardForm.java는 CommonForm.java를 BoardDto.java는 CommonDto.java를 상속받도록 수정하세요.
BoardForm.java
더보기123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133package com.spring.board.form;import java.util.Date;public class BoardForm extends CommonForm {int board_seq;int board_re_ref;int board_re_lev;int board_re_seq;String board_writer;String board_subject;String board_content;int board_hits;String del_yn;String ins_user_id;Date ins_date;String upd_user_id;Date upd_date;String search_type;public int getBoard_seq() {return board_seq;}public void setBoard_seq(int board_seq) {this.board_seq = board_seq;}public int getBoard_re_ref() {return board_re_ref;}public void setBoard_re_ref(int board_re_ref) {this.board_re_ref = board_re_ref;}public int getBoard_re_lev() {return board_re_lev;}public void setBoard_re_lev(int board_re_lev) {this.board_re_lev = board_re_lev;}public int getBoard_re_seq() {return board_re_seq;}public void setBoard_re_seq(int board_re_seq) {this.board_re_seq = board_re_seq;}public String getBoard_writer() {return board_writer;}public void setBoard_writer(String board_writer) {this.board_writer = board_writer;}public String getBoard_subject() {return board_subject;}public void setBoard_subject(String board_subject) {this.board_subject = board_subject;}public String getBoard_content() {return board_content;}public void setBoard_content(String board_content) {this.board_content = board_content;}public int getBoard_hits() {return board_hits;}public void setBoard_hits(int board_hits) {this.board_hits = board_hits;}public String getDel_yn() {return del_yn;}public void setDel_yn(String del_yn) {this.del_yn = del_yn;}public String getIns_user_id() {return ins_user_id;}public void setIns_user_id(String ins_user_id) {this.ins_user_id = ins_user_id;}public Date getIns_date() {return ins_date;}public void setIns_date(Date ins_date) {this.ins_date = ins_date;}public String getUpd_user_id() {return upd_user_id;}public void setUpd_user_id(String upd_user_id) {this.upd_user_id = upd_user_id;}public Date getUpd_date() {return upd_date;}public void setUpd_date(Date upd_date) {this.upd_date = upd_date;}public String getSearch_type() {return search_type;}public void setSearch_type(String search_type) {this.search_type = search_type;}}cs BoardDto.java
더보기123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132package com.spring.board.dto;public class BoardDto extends CommonDto {int board_seq;int board_re_ref;int board_re_lev;int board_re_seq;String board_writer;String board_subject;String board_content;int board_hits;String del_yn;String ins_user_id;String ins_date;String upd_user_id;String upd_date;String result;public int getBoard_seq() {return board_seq;}public void setBoard_seq(int board_seq) {this.board_seq = board_seq;}public int getBoard_re_ref() {return board_re_ref;}public void setBoard_re_ref(int board_re_ref) {this.board_re_ref = board_re_ref;}public int getBoard_re_lev() {return board_re_lev;}public void setBoard_re_lev(int board_re_lev) {this.board_re_lev = board_re_lev;}public int getBoard_re_seq() {return board_re_seq;}public void setBoard_re_seq(int board_re_seq) {this.board_re_seq = board_re_seq;}public String getBoard_writer() {return board_writer;}public void setBoard_writer(String board_writer) {this.board_writer = board_writer;}public String getBoard_subject() {return board_subject;}public void setBoard_subject(String board_subject) {this.board_subject = board_subject;}public String getBoard_content() {return board_content;}public void setBoard_content(String board_content) {this.board_content = board_content;}public int getBoard_hits() {return board_hits;}public void setBoard_hits(int board_hits) {this.board_hits = board_hits;}public String getDel_yn() {return del_yn;}public void setDel_yn(String del_yn) {this.del_yn = del_yn;}public String getIns_user_id() {return ins_user_id;}public void setIns_user_id(String ins_user_id) {this.ins_user_id = ins_user_id;}public String getIns_date() {return ins_date;}public void setIns_date(String ins_date) {this.ins_date = ins_date;}public String getUpd_user_id() {return upd_user_id;}public void setUpd_user_id(String upd_user_id) {this.upd_user_id = upd_user_id;}public String getUpd_date() {return upd_date;}public void setUpd_date(String upd_date) {this.upd_date = upd_date;}public String getResult() {return result;}public void setResult(String result) {this.result = result;}}cs 2_5) BoardDao.java 수정boardMapper.xml에 추가한 getBoardCnt를 호출하는 메소드를 추가하세요.BoardDao.java더보기123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566package com.spring.board.dao;import java.util.List;import javax.annotation.Resource;import org.apache.ibatis.session.SqlSession;import org.springframework.stereotype.Repository;import com.spring.board.dto.BoardDto;import com.spring.board.form.BoardForm;@Repositorypublic class BoardDao {@Resource(name = "sqlSession")private SqlSession sqlSession;private static final String NAMESPACE = "com.spring.board.boardMapper";/** 게시판 - 목록 수 */public int getBoardCnt(BoardForm boardForm) throws Exception {return sqlSession.selectOne(NAMESPACE + ".getBoardCnt", boardForm);}/** 게시판 - 목록 조회 */public List<BoardDto> getBoardList(BoardForm boardForm) throws Exception {return sqlSession.selectList(NAMESPACE + ".getBoardList", boardForm);}/** 게시판 - 조회 수 수정 */public int updateBoardHits(BoardForm boardForm) throws Exception {return sqlSession.update(NAMESPACE + ".updateBoardHits", boardForm);}/** 게시판 - 상세 조회 */public BoardDto getBoardDetail(BoardForm boardForm) throws Exception {return sqlSession.selectOne(NAMESPACE + ".getBoardDetail", boardForm);}/** 게시판 - 등록 */public int insertBoard(BoardForm boardForm) throws Exception {return sqlSession.insert(NAMESPACE + ".insertBoard", boardForm);}/** 게시판 - 등록 실패(트랜잭션 테스트) */public int insertBoardFail(BoardForm boardForm) throws Exception {return sqlSession.insert(NAMESPACE + ".insertBoardFail", boardForm);}/** 게시판 - 삭제 */public int deleteBoard(BoardForm boardForm) throws Exception {return sqlSession.delete(NAMESPACE + ".deleteBoard", boardForm);}/** 게시판 - 수정 */public int updateBoard(BoardForm boardForm) throws Exception {return sqlSession.update(NAMESPACE + ".updateBoard", boardForm);}}cs 여러 개의 결과 값을 리턴하기 위한 클래스를 추가하세요.ResultUtil.java더보기1234567891011121314151617181920212223242526272829303132333435package com.spring.board.common;/*** 여러 개의 결과 값을 리턴하기 위한 클래스 (성공 유무, 메세지, 조회 내용 등)*/public class ResultUtil {private String state = "FAIL";private String msg = "";private Object data = "";public String getState() {return state;}public void setState(String state) {this.state = state;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}}cs 페이징 처리에 한 내용을 ResultUtil.java에 담아서 응답하기 위해 BoardController.java, BoardService.java 수정를 수정하세요.BoardController.java더보기BoardService.java123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100package com.spring.board.controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.spring.board.common.ResultUtil;import com.spring.board.dto.BoardDto;import com.spring.board.form.BoardForm;import com.spring.board.service.BoardService;@Controller@RequestMapping(value = "/board")public class BoardController {@Autowiredprivate BoardService boardService;/** 게시판 - 목록 페이지 이동 */@RequestMapping( value = "/boardList")public String boardList(HttpServletRequest request, HttpServletResponse response) throws Exception{return "board/boardList";}/** 게시판 - 목록 조회 */@RequestMapping(value = "/getBoardList")@ResponseBodypublic ResultUtil getBoardList(HttpServletRequest request, HttpServletResponse response, BoardForm boardForm) throws Exception {ResultUtil resultUtils = boardService.getBoardList(boardForm);return resultUtils;}/** 게시판 - 상세 페이지 이동 */@RequestMapping( value = "/boardDetail")public String boardDetail(HttpServletRequest request, HttpServletResponse response) throws Exception{return "board/boardDetail";}/** 게시판 - 상세 조회 */@RequestMapping(value = "/getBoardDetail")@ResponseBodypublic BoardDto getBoardDetail(HttpServletRequest request, HttpServletResponse response, BoardForm boardForm) throws Exception {BoardDto boardDto = boardService.getBoardDetail(boardForm);return boardDto;}/** 게시판 - 작성 페이지 이동 */@RequestMapping( value = "/boardWrite")public String boardWrite(HttpServletRequest request, HttpServletResponse response) throws Exception{return "board/boardWrite";}/** 게시판 - 등록 */@RequestMapping( value = "/insertBoard")@ResponseBodypublic BoardDto insertBoard(HttpServletRequest request, HttpServletResponse response, BoardForm boardForm) throws Exception{BoardDto boardDto = boardService.insertBoard(boardForm);return boardDto;}/** 게시판 - 삭제 */@RequestMapping( value = "/deleteBoard")@ResponseBodypublic BoardDto deleteBoard(HttpServletRequest request, HttpServletResponse response, BoardForm boardForm) throws Exception{BoardDto boardDto = boardService.deleteBoard(boardForm);return boardDto;}/** 게시판 - 수정 페이지 이동 */@RequestMapping( value = "/boardUpdate")public String boardUpdate(HttpServletRequest request, HttpServletResponse response) throws Exception{return "board/boardUpdate";}/** 게시판 - 수정 */@RequestMapping( value = "/updateBoard")@ResponseBodypublic BoardDto updateBoard(HttpServletRequest request, HttpServletResponse response, BoardForm boardForm) throws Exception{BoardDto boardDto = boardService.updateBoard(boardForm);return boardDto;}}cs 더보기123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131package com.spring.board.service;import java.util.HashMap;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.spring.board.common.PagingUtil;import com.spring.board.common.ResultUtil;import com.spring.board.dao.BoardDao;import com.spring.board.dto.BoardDto;import com.spring.board.dto.CommonDto;import com.spring.board.form.BoardForm;import com.spring.board.form.CommonForm;@Service()public class BoardService {@Autowiredprivate BoardDao boardDao;/** 게시판 - 목록 조회 */public ResultUtil getBoardList(BoardForm boardForm) throws Exception {ResultUtil resultUtil = new ResultUtil();CommonDto commonDto = new CommonDto();int totalCount = boardDao.getBoardCnt(boardForm);if (totalCount != 0) {CommonForm commonForm = new CommonForm();commonForm.setFunction_name(boardForm.getFunction_name());commonForm.setCurrent_page_no(boardForm.getCurrent_page_no());commonForm.setCount_per_page(10);commonForm.setCount_per_list(10);commonForm.setTatal_list_count(totalCount);commonDto = PagingUtil.setPageUtil(commonForm);}boardForm.setLimit(commonDto.getLimit());boardForm.setOffset(commonDto.getOffset());List<BoardDto> list = boardDao.getBoardList(boardForm);HashMap<String, Object> resultMap = new HashMap<String, Object>();resultMap.put("list", list);resultMap.put("totalCount", totalCount);resultMap.put("pagination", commonDto.getPagination());resultUtil.setData(resultMap);resultUtil.setState("SUCCESS");return resultUtil;}/** 게시판 - 상세 조회 */public BoardDto getBoardDetail(BoardForm boardForm) throws Exception {BoardDto boardDto = new BoardDto();String searchType = boardForm.getSearch_type();if ("S".equals(searchType)) {int updateCnt = boardDao.updateBoardHits(boardForm);if (updateCnt > 0) {boardDto = boardDao.getBoardDetail(boardForm);}} else {boardDto = boardDao.getBoardDetail(boardForm);}return boardDto;}/** 게시판 - 등록 */public BoardDto insertBoard(BoardForm boardForm) throws Exception {BoardDto boardDto = new BoardDto();int insertCnt = 0;insertCnt = boardDao.insertBoard(boardForm);insertCnt = boardDao.insertBoardFail(boardForm);if (insertCnt > 0) {boardDto.setResult("SUCCESS");} else {boardDto.setResult("FAIL");}return boardDto;}/** 게시판 - 삭제 */public BoardDto deleteBoard(BoardForm boardForm) throws Exception {BoardDto boardDto = new BoardDto();int deleteCnt = boardDao.deleteBoard(boardForm);if (deleteCnt > 0) {boardDto.setResult("SUCCESS");} else {boardDto.setResult("FAIL");}return boardDto;}/** 게시판 - 수정 */public BoardDto updateBoard(BoardForm boardForm) throws Exception {BoardDto boardDto = new BoardDto();int deleteCnt = boardDao.updateBoard(boardForm);if (deleteCnt > 0) {boardDto.setResult("SUCCESS");} else {boardDto.setResult("FAIL");}return boardDto;}}cs 2_8) boardList.jsp 수정
페이징 처리에 대한 내용을 구현하기 위해 boardList.jsp를 수정하세요.
boardList.jsp더보기123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>게시판 목록</title><!-- 공통 CSS --><link rel="stylesheet" type="text/css" href="/css/common/common.css"/><!-- 공통 JavaScript --><script type="text/javascript" src="/js/common/jquery.js"></script><script type="text/javascript">$(document).ready(function(){getBoardList();});/** 게시판 - 상세 페이지 이동 */function goBoardDetail(boardSeq){location.href = "/board/boardDetail?boardSeq="+ boardSeq;}/** 게시판 - 작성 페이지 이동 */function goBoardWrite(){location.href = "/board/boardWrite";}/** 게시판 - 목록 조회 */function getBoardList(currentPageNo){if(currentPageNo === undefined){currentPageNo = "1";}$("#current_page_no").val(currentPageNo);$.ajax({url : "/board/getBoardList",data : $("#boardForm").serialize(),dataType : "JSON",cache : false,async : true,type : "POST",success : function(obj) {getBoardListCallback(obj);},error : function(xhr, status, error) {}});}/** 게시판 - 목록 조회 콜백 함수 */function getBoardListCallback(obj){var state = obj.state;if(state == "SUCCESS"){var data = obj.data;var list = data.list;var listLen = list.length;var totalCount = data.totalCount;var pagination = data.pagination;var str = "";if(listLen > 0){for(var a=0; a<listLen; a++){var boardSeq = list[a].board_seq;var boardReRef = list[a].board_re_ref;var boardReLev = list[a].board_re_lev;var boardReSeq = list[a].board_re_seq;var boardWriter = list[a].board_writer;var boardSubject = list[a].board_subject;var boardContent = list[a].board_content;var boardHits = list[a].board_hits;var delYn = list[a].del_yn;var insUserId = list[a].ins_user_id;var insDate = list[a].ins_date;var updUserId = list[a].upd_user_id;var updDate = list[a].upd_date;str += "<tr>";str += "<td>"+ boardSeq +"</td>";str += "<td onclick='javascript:goBoardDetail("+ boardSeq +");' style='cursor:Pointer'>"+ boardSubject +"</td>";str += "<td>"+ boardHits +"</td>";str += "<td>"+ boardWriter +"</td>";str += "<td>"+ insDate +"</td>";str += "</tr>";}} else {str += "<tr>";str += "<td colspan='5'>등록된 글이 존재하지 않습니다.</td>";str += "<tr>";}$("#tbody").html(str);$("#total_count").text(totalCount);$("#pagination").html(pagination);}}</script></head><body><div id="wrap"><div id="container"><div class="inner"><h2>게시글 목록</h2><form id="boardForm" name="boardForm"><input type="hidden" id="function_name" name="function_name" value="getBoardList" /><input type="hidden" id="current_page_no" name="current_page_no" value="1" /><div class="page_info"><span class="total_count"><strong>전체</strong> : <span id="total_count" class="t_red">0</span>개</span></div><table width="100%" class="table01"><colgroup><col width="10%" /><col width="25%" /><col width="10%" /><col width="15%" /><col width="20%" /></colgroup><thead><tr><th>글번호</th><th>제목</th><th>조회수</th><th>작성자</th><th>작성일</th></tr></thead><tbody id="tbody"></tbody></table></form><div class="btn_right mt15"><button type="button" class="btn black mr5" onclick="javascript:goBoardWrite();">작성하기</button></div></div><div id="pagination"></div></div></div></body></html>cs 3. 페이징 처리 확인
소스 코드는 Github Repository - https://github.com/tychejin1218/board_v1 (branch : section17)를 참조하세요.
Github에서 프로젝트 가져오기 - https://tychejin.tistory.com/33반응형'Spring > 4.3.x - 게시판 만들기' 카테고리의 다른 글
[Spring] 게시판 만들기(19) - 파일 업로드(MultipartHttpServletRequest) (2) 2018.12.20 [Spring] 게시판 만들기(18) - 계층형 게시판(답글쓰기) 적용 (11) 2018.12.19 [Spring] 게시판 만들기(16) - 트랜잭션(Transaction) 설정 (11) 2018.12.19 [Spring] 게시판 만들기(15) - 게시글 등록(INSERT), 수정(UPDATE), 삭제(DELETE), 상세 조회(SELECT) (28) 2018.12.17 [Spring] 게시판 만들기(14) - 게시글 조회(SELECT) (28) 2018.12.17