본문 바로가기
👨‍💻 2. 웹개발_Back end/2-6 Spring

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

by 달님🌙 2021. 11. 4.
반응형

 

실습 코드 참조

 

moonhy7/SpringFramework: Spring Framework 실습 코드 정리 (github.com)

 

GitHub - moonhy7/SpringFramework: Spring Framework 실습 코드 정리

Spring Framework 실습 코드 정리. Contribute to moonhy7/SpringFramework development by creating an account on GitHub.

github.com

 

 

1. 페이징 처리를 위한 클래스 생성 및 화면 구현

 

1. PageVO 클래스 생성 ( _81_BoardWeb_Spring_MVC_Paging )

 

package com.springbook.biz.board;

public class PageVO {
	private int startPage;
	private int endPage;
	private boolean prev, next;
	
	private int total;
	//현재 페이지 번호, 한 페이지에 표출할 데이터 개수
	private Criteria cri;
	
	public PageVO(Criteria cri, int total) {
		this.cri = cri;
		this.total = total;
		
		//시작페이지, 마지막페이지 계산
		this.endPage = (int)(Math.ceil(cri.getPageNum() / 10.0)) * 10;
		this.startPage = this.endPage -9;
		
		int realEnd = (int) (Math.ceil(total * 1.0) / cri.getAmount());
		
		if(realEnd < this.endPage) {
			this.endPage = realEnd;
		}
		
		//이전, 다음 버튼 표출 여부 결정
		this.prev = this.startPage > 1;
		this.next = this.endPage < realEnd;
	}
	
	public int getStartPage() {
		return startPage;
	}
	public int getEndPage() {
		return endPage;
	}
	public boolean isPrev() {
		return prev;
	}
	public boolean isNext() {
		return next;
	}
	public int getTotal() {
		return total;
	}
	public Criteria getCri() {
		return cri;
	}

	@Override
	public String toString() {
		return "PageVO [startPage=" + startPage + ", endPage=" + endPage + ", prev=" + prev + ", next=" + next
				+ ", total=" + total + "]";
	}
}

 

2. Criteria 클래스 생성

 

package com.springbook.biz.board;

public class Criteria {
	private int pageNum;
	private int amount;
	private int startNum;
	
	public Criteria() {
		//객체 생성시 기본 생성자를 호출하여 매개변수를 줘서 매개변수를 가지고 있는 생성자 함수 호출
		this(1, 10); //생성자에서 pageNum=1, amount=10으로 설정
	}
	
	// 기본 생성자 설정
	public Criteria(int pageNum, int amount) {
		this.pageNum = pageNum;
		this.amount = amount;
	}

	public int getPageNum() {
		return pageNum;
	}

	public void setPageNum(int pageNum) {
		this.pageNum = pageNum;
	}

	public int getAmount() {
		return amount;
	}

	public void setAmount(int amount) {
		this.amount = amount;
	}
	
	public int getStartNum() {
		return startNum;
	}

	public void setStartNum(int startNum) {
		this.startNum = startNum;
	}

	@Override
	public String toString() {
		return "Criteria [pageNum=" + pageNum + ", amount=" + amount + "]";
	}
}

 

3. BoardController.java

 

	@RequestMapping(value="/getBoardList.do")
	//@RequestParam : Command 객체인 VO에 매핑값이 없는 사용자 입력정보는 직접 받아서 처리
	//				  value = 화면으로부터 전달된 파라미터 이름(jsp의 input의 name속성 값)
	//				  required = 생략 가능 여부
	public String getBoardList(BoardVO vo, Model model, Criteria cri) {
		System.out.println("글 목록 검색 처리");
		
		//Null check
		//로그인 화면에서 로그인성공 시 getBoardList.do 호출 할 때 searchKeyword, searchCondition 값의 null 방지 
		if(vo.getSearchCondition() == null) {
			vo.setSearchCondition("TITLE");
		}
		if(vo.getSearchKeyword() == null) {
			vo.setSearchKeyword("");
		}
		
		model.addAttribute("boardList", boardService.getBoardList(vo));
		model.addAttribute("pageMaker", new PageVO(cri, 123));
		return "getBoardList.jsp";
	}

 

4. getBoardList.jsp

 

- Previous, Next 버튼 추가

<div>
  <ul class="pagination">
    <c:if test="${pageMaker.prev }">
      <li class="pagination_button">
      	<a href="#">Previous</a>
      </li>
    </c:if>

    <c:forEach var="num" begin="${pageMaker.startPage }" end="${pageMaker.endPage }">
      <li class="pagination_button">
      	<a href="#">${num }</a>
      </li>
    </c:forEach>

    <c:if test="${pageMaker.next }">
      <li class="pagination_button">
        <a href="#">Next</a>
      </li>
    </c:if>
  </ul>
</div>

 

- 스타일 태그 추가

	<style>
		ul {
			list-style: none;
			width : 30%;
			display: inline-block;
		}
		
		li {
			float: left;
			margin-left : 5px;
		}
	</style>
</head>

 

5. 실행 화면

 

 

2. 데이터베이스 처리 및 기능 구현

 

1. BoardController

 

- getBoardList() 메소드에 Criteria 매개변수 추가해줄것

public String getBoardList(BoardVO vo, Model model, Criteria cri) {
	System.out.println("글 목록 검색 처리");
	...
}

 

2. BoardService 클래스와 BoardServiceImpl 클래스

 

- 마찬가지로 getBoardList() 메소드에 Criteria 매개변수 추가해줄것

//글 목록 조회
List<BoardVO> getBoardList(BoardVO vo, Criteria cri);
public List<BoardVO> getBoardList(BoardVO vo, Criteria cri) {
	return boardDAO.getBoardList(vo, cri);
}

 

3. BoardServiceClient 클래스는 삭제해준다. (사용X)

 

 

4. BoardDAOMybatis 코드 수정

 

public List<BoardVO> getBoardList(BoardVO vo, Criteria cri) {
  Map<String, Object> paramMap = new HashMap<String, Object>();
  paramMap.put("board", vo);
  cri.setStartNum((cri.getPageNum() - 1) * cri.getAmount());
  paramMap.put("criteria", cri);
  System.out.println("====> Mybatis로 getBoardList() 기능 처리");
  return mybatis.selectList("BoardDAO.getBoardList", paramMap);
}

 

5. board-mapping.xml 파일에 쿼리 수정 

 

- ORACLE 쿼리

<!-- ORACLE -->
<select id="getBoardList" parameterMap="HashMap" resultMap="boardResult">	
<![CDATA[
SELECT * FROM
(
SELECT ROWNUM RN, * FROM BOARD 
WHERE 1=1
AND ROWNUM <+ #{criteria.pageNum} * #{criteria.amount}
]]>
<if test="board.searchCondition == 'TITLE'">
AND TITLE LIKE CONCAT_WS('%', #{searchKeyword}, '%')
</if>
<if test="board.searchCondition == 'CONTENT'">
AND TITLE LIKE CONCAT_WS('%', #{searchKeyword}, '%')
</if>
<![CDATA[
)
WHERE RN > (#{criteria.pageNum} - 1) * #{criteria.amount}
]]>
</select>

 

- MySQL 쿼리

<!-- MySQL -->
<select id="getBoardList" parameterMap="HashMap" resultMap="boardResult">					
SELECT * FROM BOARD 
WHERE 1=1
<if test="board.searchCondition == 'TITLE'">
AND TITLE LIKE CONCAT_WS('%', #{searchKeyword}, '%')
</if>
<if test="board.searchCondition == 'CONTENT'">
AND TITLE LIKE CONCAT_WS('%', #{searchKeyword}, '%')
</if>
LIMIT #{criteria.amount} OFFSET #{criteria.startNum}
</select>

 

- ORDER BY SEQ DESC 사용하면 에러가 발생하는 이유

이미 ROWNUM에서 역순으로 되어있어서 

 

6. 테이블에 데이터 추가하기(500개 정도)

 

- Ctrl + Shift + Enter -> 한 번에 실행

SELECT * FROM BOARD;
INSERT INTO BOARD(SEQ, TITLE, WRITER, CONTENT) 
VALUE((SELECT IFNULL(MAX(SEQ), 0) + 1 FROM BOARD A), 'test', '관리자', 'test입니다.....');

 

7. selectBoardCount 메소드 추가

 

- BoardService 인터페이스와 BoardController 클래스, BoardDAOMybatis 클래스에 selectBoardCount 메소드 추가로 선언

- BoardController.java에 total 변수 선언

- board-mapping 파일에 selectBoardCount 매핑

 

8) 실행 화면

 

 

페이지 이동 기능 구현

 

1. 코드

 

<div>
			<ul class="pagination">
				<c:if test="${pageMaker.prev }">
					<li class="pagination_button">
						<a href="${pageMaker.startPage - 1 }">Previous</a>
					</li>
				</c:if>
				
				<c:forEach var="num" begin="${pageMaker.startPage }" end="${pageMaker.endPage }">
					<li class="pagination_button">
						<a href="${num }">${num }</a>
					</li>
				</c:forEach>
				
				<c:if test="${pageMaker.next }">
					<li class="pagination_button">
						<a href="${pageMaker.endPage + 1 }">Next</a>
					</li>
				</c:if>
			</ul>
		</div>

 

2. js 파일 추가 및 스크립트 추가

 

 

 

 

3. jsp 파일 수정

 

<script>
		$(document).ready(function() {
			var listForm = $("#listForm");
			
			$(".pagination_button a").on("click", function(e) {
				e.preventDefault();
				
				listForm.find("input[name='pageNum']").val($(this).attr("href"));
				listForm.submit();
			});
		});
	</script>

 

4. 실행 화면

 

 

 

4. 새 글 등록 시 1페이지로 돌아가는 문제점 해결

 

1) 코드 수정

BoardController 코드 수정

 

getBoard.jsp 파일 링크 부분 수정

 

2. 실행 화면

91번 글 제목에 들어가서

 

글 상세페이지에서 글 목록을 눌렀을 때 

 

1페이지가 아닌 다시 원래 페이지로 돌아오게 됨

 

 

 

** 글 등록 글 삭제 일때도 해보기~~

 

반응형

댓글