수업/스프링

[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 덮어 씌우기