관련된 클래스는 다음과 같다.

1. com.omnibuscode.util.board.paging.PagingDao.java
2. com.omnibuscode.util.board.paging.PagingHelper.java
3. com.omnibuscode.util.board.paging.PagingHelperImpl.java
4. com.omnibuscode.util.board.paging.PagingHelperImplDao.java

 

paginghelper.gif

 

페이지 계산시 가장 핵심적인 변수는 다음과 같다.

1. 전체 리스트 갯수 (totalCount)
2. 한 페이지당 표시할 리스트 갯수 (cPerPage)
3. 한 블럭당 표시할 페이지 갯수 (pPerBlock)

위의 변수가 설정이 되면 전체 페이지의 수(totalPage)와 전체 블럭의 수(totalBlock) 를 계산해 낼 수 있다.
그리고 사용자가 페이지 이동을 하게 되어 현재 표시하고 싶은 페이지(curPage)가 입력이 되면 현재 페이지가 속한 블럭(curBlock)을 계산해 낼 수 있다.

페이징에서 뽑아내야 할 값들은 위와 같으며 이 값들을 계산하게 도와줄 클래스는 PagingHelperImpl 클래스이다.
이 클래스는 사실 JDF(Java Development Framework) 에서 사용하는 페이징 도우미 클래스이다.
PagingHelper 인터페이스를 상속받아 실제 페이징 계산을 구현하고 결과물로 페이지 이동 링크 및 텍스트를 리턴하거나 현재 페이지의 목록을 리턴해 주는 메서드들을 제공해 준다.
하지만 이 클래스는 원래 설계 목적이 DAO 클래스에서 이 클래스를 상속받아 미리 정의해 놓은 탬플릿 메서드들을 이용하는 것이었다.
물론 그러한 방식에 있어서 별다른 문제점이 존재하는 것은 아니지만 상속을 통해 구현을 해야 하기 때문에 DAO클래스가 PagingHelper 클래스에 의존적이 될 수 밖에 없었다.
해서 PagingDao 인터페이스를 생성하고 PagingHelperImpl을 확장한 PagingHelperImplDao 클래스를 작성하였다.
DAO클래스가 PagingDao 인터페이스를 implements하고 이 클래스를 구현한 객체를 PagingHelperImplDao 클래스에 구성객체로 셋팅을 해주면 나머지는 PagingHelperImplDao 클래스가 알아서 계산하고 현재페이지의 리스트를 리턴해주도록 바꿔주었다.
이는 리스트를 뽑아오는데에 있어서 실행도중 DAO를 다른 객체로 교체하게 되면 리스트를 다르게 뽑아올 수 있다는 것을 의미한다.
여기에 적용된 패턴은 Template 메소드 패턴이고 상속이 아닌 구성을 통해서 DAO가 PagingHelperImplDao 클래스에게 의존적이지 않게 만들어준다.
Strategy패턴과 같이 PagingHelperImplDao 클래스에 전달하는 DAO 구성객체 따라서 실행시에 동적으로 리스트에 변화를 줄 수 있는 잇점을 얻을 수 있다.

개발자가 해주어야 할 것은, PagingDao를 implements하는 DAO클래스를 작성하고, 이를 PagingHelperImplDao 클래스의 setPagingDao(PagingDao pd) 메서드로 구성객체를 셋팅해주면
PagingHelper 인터페이스에 정의된 public 메서드들을 통해 페이징에 필요한 값들을 리턴 받을 수 있게 된다.
코드 예제는 다음과 같다.

·미리보기 | 소스복사·
 
  1. PagingHelper phd = new PagingHelperImplDao(req);   
  2. phd.setPagingParams("/TestPagingProject/simplePagingTest", 20, 5); //RequestURI, ContentsPerPage, PagesPerBlock   
  3. phd.setPagingDao(new SimplePagingDaoForMysqlImpl(args));  

DAO의 생성자 파라미터로 전달받는 args 변수는 검색정보와 정렬정보등의 추가적인 파라미터들을 저장하고 있는 변수이다.

번호 제목 글쓴이 날짜 조회 수
347 java.util.Optional 에서의 map() 함수의 이해 황제낙엽 2026.06.24 666
346 linux(ubuntu) 의 jdk 21 이 설정된 환경에서 jdk 17 로 다운그레이드 절차 황제낙엽 2025.09.22 1532
345 [ChatGPT] javax.* 패키지와 jakarta.* 패키지의 혼합 사용 방안 황제낙엽 2025.04.15 2459
344 [ChatGPT] *.servlet.http.HttpServlet 클래스를 사용할 수 있는 주요 WAS 목록 황제낙엽 2025.04.14 2038
343 [ChatGPT] JDBC API에서 java.sql과 javax.sql 패키지의 차이점 황제낙엽 2025.01.31 2218
342 jakarta.servlet 패키지를 이용한 File Upload 구현 (2024.03.03, Servlet 5.0) 황제낙엽 2025.01.02 2310
341 [ChatGPT] Java EE가 Jakarta EE로 전환 황제낙엽 2025.01.01 2525
340 [ChatGPT] File.delete() 함수로 파일 삭제가 되지 않는 경우 황제낙엽 2024.12.10 2809
339 [ChatGPT] <jsp:include>에서 flush="true"를 설정시의 몇 가지 문제점 과 대안 황제낙엽 2024.07.19 2493
338 [Copilot] JSP, Servlet, web.xml, mysql 한글 설정 황제낙엽 2024.07.12 2555
337 Base64 클래스의 encode, decode 에서 URL-safe 황제낙엽 2024.07.10 2624
336 [Copilot] JSP 에서 다른 페이지를 현재 페이지에 포함시키는 문법 (include) 황제낙엽 2024.06.26 2570
335 Exception 출력에 대한 고찰 황제낙엽 2024.06.10 2198
334 google-auth-library-oauth2-http 라이브러리 다운로드 황제낙엽 2023.11.19 4025
333 firebase-admin-java 라이브러리 다운로드 (firebase admin sdk library) 황제낙엽 2023.11.19 2805
332 Enum 활용 (개인블로그, Effective Java) file 황제낙엽 2023.11.02 2759
331 Enum 활용 (우아한기술블로그) file 황제낙엽 2023.11.02 2790
330 servlet name 에 camel case 를 사용해서는 안되는 이유 황제낙엽 2023.10.24 2508
329 org.apache.commons.fileupload.servlet.ServletFileUpload 이용 예시 황제낙엽 2023.08.25 3336
328 ServletFileUpload.parseRequest() 실행 결과 리스트가 비어있는 오류 황제낙엽 2023.08.25 2935