수업/스프링
[Spring] 10일차 - table 데이터 증가시키기, 페이징, 검색
분홍야자
2023. 4. 21. 16:34
페이징이 필요한 이유
데이터가 모두 나올 때 까지 로딩이 걸린다...
페이징을 위한 클래스생성 - Criteria
package com.smart.hrd.domain;
import lombok.Data;
@Data
public class Criteria {
private int pageNum; // 보여줄 페이지
private int amount; // 페이지별 보여줄 데이터 행 수
public Criteria() {
this(1,10); // 자기 자신 생성자
}
public Criteria(int pageNum, int amount) {
this.pageNum = pageNum;
this.amount = amount;
}
}
IBoardDAO 수정
// 글 목록 , 페이징 처리 기능으로 수정
public List<BoardDTO> listAll(Criteria cri) throws Exception;
boardMapper 수정 - 기존 게시글 목록
hint
쿼리 힌트는 SQL 쿼리에 대한 추가 정보를 제공하여 데이터베이스 엔진이 쿼리를 처리하는 방법을 조정하거나 최적화할 수 있다
쿼리 실행 계획에서 특정 인덱스를 사용하도록 지시하거나, 조인 순서를 변경하도록 지시하거나, 캐시 사용 여부 등을 지시할 수 있
데이터베이스 엔진에게 쿼리 실행 방법을 강제할 수 있는 강력한 기능
잘못 사용할 경우 실행 계획을 엉망으로 만들 수도 있다.
<!-- 게시글 목록 -->
<select id="getListWithPaging" resultType="com.smart.hrd.domain.BoardDTO">
<!-- 비교연산자가 문자열로 처리되는 경우가 있어 그걸 방지하기 위해 -->
<![CDATA[
SELECT bno,
title,
content,
writer,
regdate,
viewcnt
FROM (
SELECT /*+ INDEX_DESC(tbl_board IDX_tbl_board_PK) */
rownum rn,
bno,
title,
content,
writer,
regdate,
viewcnt
FROM tbl_board
WHERE rownum <= #{pageNum} * #{amount}
)
WHERE rn > (#{pageNum} - 1) * #{amount}
]]>
</select>
BoardDAOImpl 구현체 수정
@Override // 목록
public List<BoardDTO> listAll(Criteria cri) throws Exception {
return session.selectList("BoardMapper.getListWithPaging", cri);
}
DAO 테스트해보기
@Test
public void testListCriteria() throws Exception {
Criteria cri = new Criteria();
cri.setPageNum(1);
cri.setAmount(10);
List<BoardDTO> list = bDao.listAll(cri);
list.forEach(board -> log.info(board.getBno() + " : " + board.getContent()));
}
서비스 인터페이스 IBoardService 수정
public List<BoardDTO> listAll(Criteria cri) throws Exception;
서비스 구현체 BoardServiceImpl 수정
@Override
public List<BoardDTO> listAll(Criteria cri) throws Exception {
return bDao.listAll(cri);
}
컨트롤러 BoardController 수정
// 게시물 목록
// list 라는 경로로 들어오면 바로 listAll 함수 실행
@RequestMapping(value = "/list", method = RequestMethod.GET)
public void listAll(Criteria cri, Model model) throws Exception {
log.info("show all list..................");
// 스프링에서 기본적으로 쓰는 객체 - model
// service 에서 list 객체 호출
model.addAttribute("list", service.listAll(cri));
}
pageDTO 생성
package com.smart.hrd.domain;
import lombok.Data;
@Data
public class PageDTO {
private int startPage;
private int endPage;
private boolean prev, next;
private int total;
private Criteria cri; // 객체 주입 받기
public PageDTO(Criteria cri, int total) {
this.cri = cri;
this.total = total;
// ceil 반올림 : 계산은 더블 타입으로
this.endPage = (int)(Math.ceil(cri.getPageNum()/10/0)) * 10;
this.startPage = endPage - 9;
int realEnd = (int)(Math.ceil((total * 1.0) / cri.getAmount()));
if (realEnd < this.endPage) {
this.endPage = realEnd;
}
this.prev = this.startPage > 1; // prev 버튼 만들어 줄지 말지
this.next = this.endPage < realEnd; // next 버튼 만들어 줄지 말지
}
}
boardMapper 추가 - getTotalCnt
<select id="getTotalCnt" resultType="int">
SELECT COUNT(*)
FROM tbl_board
WHERE bno > 0
</select>
서비스 인터페이스에 추가 - IBoardService
// TOTAL PAGE
public int getTotalCnt(Criteria cri) throws Exception;
서비스 구현체에 추가
@Override
public int getTotalCnt(Criteria cri) throws Exception {
// TODO Auto-generated method stub
return 0;
}
컨트롤러 수정
// 게시물 목록
// list 라는 경로로 들어오면 바로 listAll 함수 실행
@RequestMapping(value = "/list", method = RequestMethod.GET)
public void listAll(Criteria cri, Model model) throws Exception {
log.info("show all list..................");
// 스프링에서 기본적으로 쓰는 객체 - model
// service 에서 list 객체 호출
model.addAttribute("list", service.listAll(cri));
int total = service.getTotalCnt(cri) ;
log.info("total..........." + total);
model.addAttribute("pageMaker", new PageDTO(cri, total));
}
list.jsp version 3 덮어 씌우기