본문 바로가기
Spring

Spring Mybatis 페이징 처리 이해하기 2

by 차가운개발 2024. 9. 11.

스프링을 이용한 웹 애플리케이션에서 페이징 처리 해보기(DB:mySQL)

 

2024.09.11 - [Spring] - Spring 페이징 처리 이해하기 1

ㅇ 응답 DTO 만들기

매퍼에서 가져오는 todo의 목록과 전체 데이터의 수를 한번에 담아 서비스 계층에 전달하기 위한 DTO를 만든다.

제네릭을 이용하여 설계한 이유는 단지 todo의 페이지 처리만이 아닌 공통적인 처리를 위한 것이다.

생성자를 이용해 정보를 처리한다. 

 

ㅇ 페이지 번호 계산

페이지 번호를 계산하기 위해서는 현재 페이지의 번호가 필요하다. 화면에 10개의 페이지 번호를 출력한다고 가정하면 다음과 같은 경우의 수가 생긴다.

 

  • page = 1 : start : 1, end : 10
  • page = 10 : start 1, end : 10
  • page = 11 : start 11, end : 20

페이지의 번호를 계산할 때는 마지막 페이지를 구하는 계산을 이용하면 더 편할 수 있다.

this.end = (int)(Math.ceil(this.page / 10.0)) * 10;
# page를 10으로 나눈 값을 올림 처리한 후 10을 곱한다.

# 마지막 페이지를 계산했다면 시작페이지는 마지막 페이지에서 9를 빼주면 된다.
this.start = this.end - 9;

 

마지막 페이지의 경우 전체 개수(total)를 고려해야한다. 10개씩 보여주는 경우 total이 65라면 마지막 페이지는 10이 아닌 7이 되어야 하기 때문이다.

int last = (int)(Math.ceil((total/(double)size)));
# 125 / 10.0 = 12.5 => 13
# 100 / 10.0 = 10.0 => 10
# 65 / 10.0 = 6.5 => 7

# 마지막 페이지의 값은 앞에서 구한 last보다 작은 경우에 last 값이 end가 되어야한다.
this.end = end > last ? last:end;

 

이전(prev)와 다음(next) 계산

이전 페이지의 존재 여부는 시작 페이지가 1이 아니라면 무조건 true

다음 페이지는 마지막 페이지(end)와 페이지당 개수(size)를 곱한 값보다 전체 개수(total)이 더 많은지 보고 판단한다.

# 이전 페이지
this.prev = this.start > 1;
# 다음 페이지
this.next = total > this.end * this.size;

 

ㅇ 서비스 계층에 구현하기

서비스 인터페이스에 메서드를 구현한다

오버라이딩한 메서드를 구현한다.

 

ㅇ Test

테스트 코드를 작성한다.

 

테스트의 결과를 확인해보면 시작 페이지, 마지막 페이지, 이전 여부, 다음 여부, 전체 개수등을 확인할 수 있다.

 

ㅇ 컨트롤러 처리

컨트롤러의 작성이 끝나면 jsp를 처리하면 된다. 

jsp의 처리는 포스팅하지 않을 계획이다.

 

'Spring' 카테고리의 다른 글

[Spring] WebClient  (1) 2024.12.09
Spring Mybatis 페이징 처리 이해하기 1  (0) 2024.09.11
Spring MVC란  (0) 2024.09.03
Spring Framework란  (2) 2024.09.03