Part 14. 페이징 화면 처리

14.6 MyBatis에서 전체 데이터의 개수 처리

  • 페이지의 이동이 모든 작업에서 정상적으로 이루어지는 것을 확인했다면 최종적으로는 데이터베이스에 있는 실제 모든 게시물의 수(total)를 구해서 PageDTO를 구성할 때 전달해 주어야 한다.
  • 전체의 개수를 구하는 SQL은 어렵거나 복잡하지 않기 때문에 어노테이션으로 처리해도 무방하지만 BoardMapper 인터페이스에 getTotalCount()메서드를 정의하고 XML을 이용해 SQL을 처리한다.
< BoardMapper 인터페이스 >
package org.zerock.mapper;
import java.util.List;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;
public interface BoardMapper {
	... 생략 ...
	// MyBatis에서 전체 데이터 개수 처리
	public int getTotalCount(Criteria cri)	
}
  • getTotalCount()는 Criteria를 파라미터로 전달받도록 설계하지 않아도 문제가 생기지는 않지만, 게시물의 목록과 전체 데이터 수를 구하는 작업은 일관성 있게 Criteria를 받는 것이 좋다.
< BoradMapper.xml >
<select id="getTotalCount" resultType="int">
	select count(*) from tbl_board where bno > 0
</select>
  • BoardService와 BoardServiceImpl에서는 별도의 메서드를 작성해 BoardMapper의 getTotalCount()를 호출한다.
< BoardService 인터페이스 >
package org.zerock.service;
import java.util.List;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;
public interface BoardService {
	... 생략 ...
    // 추가
    public int getTotal(Criteria cri);
}
  • BoardService의 getTotal()에 굳이 Criteria는 파라미터로 전달될 필요가 없기는 하지만, 목록과 전체 데이터 개수는 항상 동작하는 경우가 많기 때문에 파라미터로 지정한다.
  • BoardServiceImpl 클래스는 getTotal() 메서드를 구현한다.
< BoardServiceImpl 클래스 >
	@Override
	public int getTotal(Criteria cri) {
		log.info("get total count");
		return mapper.getTotalCount(cri);
	}
  • BoardController에서는 BoardService 인터페이스를 통해 getTotal()을 호출하도록 변경한다.
< BoardController 클래스 >
	@GetMapping("/list")
	public void list(Criteria cri, Model model) {
		log.info("list: " + cri);
		model.addAttribute("list", service.getList(cri));
		model.addAttribute("pageMaker", new PageDTO(cri, 123));
		int total = service.getTotal(cri);
		log.info("total: " + total);
		model.addAttribute("pageMaker", new PageDTO(cri, total));
	}
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글