Paging
From JCFWiKi
Copyright © 2008 Daewoo Information Systems Co., Ltd. |
|
이 곳은 다량의 row를 처리하기 위한 페이징 처리에 대한 설명이다. |
목차 |
[편집] 개요
가져올 row의 개수가 많은 경우, 많은 양의 데이터를 로딩하는 과정에서 out of Memory가 발생하거나, 가져왔다 하더라도 너무 많은 데이터는 오히려 가독성과 효율을 저하시킨다. 그러므로 적당한 row를 끊어서 가져오고 다음 데이터를 가져올 수 있게끔 네비게이션 해 줄 수 있는 기능에 대해 구현하도록 하자. 이를 처리하기 위해 다음과 같은 작업을 수행한다.
[편집] 소스다운받기
- edu_blog.zip 다운
- 위 소스를 다운 받은 후 DB 를 만들고 이클립스에서 WTP 실행시킨 다음에 http://localhost:8080/edu_blog/ 실행
|
[편집] JCF관련모듈
- jcf/dao/ibatis/BaseSqlMapClientDAO.java
- iBATIS의 DAO 프레임워크를 구성하는 BaseSqlMapClientDAO에 4개의 파라미터를 가지는 executeQueryForPaginatedList 메소드를 제공한다.
- 페이지 처리된 조회 결과를 보여주기 위해서는 statementName, Object parameterObject, page, pageSize를 제공하여야 한다.
- webapp/WEB-INF/tld/app.tld
- 페이지 표시를 위한 테그 라이브러리를 정의하는 파일이다. 여러 태그 중에서도 paging을 위한 태그도 포함하고 있다.
- jcf/web/taglib/PagingTag.java
- 페이징 태그를 위한 자바 클래스이다.
- jcf/templetes/paging_index.vm
- 페이지를 보여주는데 사용되는 jsp화면을 동적으로 구성하기 위한 velocity 탬플릿 파일이다.
- 이 탬플릿 파일을 수정하면 동적으로 변경해 줄 수 있다.
[편집] 환경 설정
페이징 처리를 위해 다음과 같은 설정이 되어 있는지 확인한다.
[편집] app.properties
- app.properties 에서는 app 태그를 위한 정보와 화면 구성을 위한 Velocity에 필요한 정보를 가지고 있다.
########################################### # Page tag(<app:page />) page.index.size 10 --> 화면에 보여줄 페이지 개수 page.template.location jcf/web/taglib/templates/paging_index.vm --> 페이징 화면을 위한 템플릿 화면 ########################################### # Velocity(Template Engine) input.encoding EUC-KR output.encoding EUC-KR parser.pool.size 100 file.resource.loader.path=xdocs/stylesheets
[편집] applicationContext.xml
- 어플리케이션의 공통 설정 파일인 applicationContext.xml 파일에는 velocityEngine이 있는지 확인한다.
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean"> <property name="velocityProperties"> <props> <prop key="resource.loader">class</prop> <prop key="class.resource.loader.class"> org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader </prop> <prop key="input.encoding">${input.encoding}</prop> <prop key="output.encoding">${output.encoding}</prop> <prop key="parser.pool.size">${parser.pool.size}</prop> </props> </property> </bean>
[편집] 코딩하기
- 작업순서
- JSP - <app:page/> 적용
- Action - 페이지 프라퍼티 추가, 목록 조회 메소드 변경
- Service - 페이지 파라미터를 Dao로 전달
- Dao - queryForPagenatedList(..) 적용
- Statement XML - count를 위한 statement 추가
[편집] JSP
- 우선 <%@ taglib uri="/WEB-INF/tld/app.tld" prefix="app" %> 를 페이징을 적용할 jsp 파일에 추가하여 프레임워크의 커스텀 태그인 페이징 태그를 사용할 수 있도록 하여야 한다.
- app:paging Taglib를 이용하여 원하는 위치에 페이징 처리를 한다.
<app:paging name="userList" action="/user/findUsers"/>
위에서 보이는 페이징 테그의 속성과 의미는 다음과 같다.
- name : scope에 셑팅된 어트리뷰트의 이름이다. 타입은 지정할 필요가 없으며,
- model.PaginatedArrayList타입임을 가정하게 된다.
- action : 페이지를 선택하였을때 사용할 조회 액션
[편집] Action
- 페이지 프라퍼티 정의 및 getter/setter 추가
- 페이지 사이즈 결정, 서비스 클래스 메소드로 파라미터 전달
public class UserAction extends BaseAction { /* * ******************************** PROPERTIES * ****************************** */ … private IUserService userService; private int page; // page 프라퍼티의 getter/setter 추가 public String findUsers() { if (this.page < 1) { page = 1; } int pageSize = 5; HashMap searchCondition = new HashMap(); searchCondition.put("searchKey", searchKey); searchCondition.put("searchValue", searchValue); userList = userService.findUsers(searchCondition, page, pageSize); .. return SUCCESS; }
[편집] Dao
- 해당 페이지에 필요한 목록만 잘라오기 위해 DAO에서는 반드시 BaseSqlMapClientDAO의 메소드 중에서 executeQueryForPaginatedList 메소드를 통해 구현한다.
- parameter로 받은 현재 page와 pageSize를 넘겨준다.
protected List executeQueryForPaginatedList(String statementName,
Object parameterObject,
int page,
int pageSize)
이 메소드를 사용한 결과는 PagenatedArrayList 객체를 반환하는데 객체에는 조회된 리스트, 페이지 사이즈, 총 사이즈를 가지게 된다.
public List findUsers(HashMap searchCondition, int page, int pageSize) { PaginatedArrayList list = executeQueryForPaginatedList("findUsers",searchCondition, page, pageSize); return list; }
[편집] Statement XML
- 전체 Rows 수를 알기 위해 count statement를 추가한다.
- statement id는 반드시 [list statement]+Count 로 해야 한다
- resultClass는 int로 한다.
- 만약 list statement에 where절이나 dynamic prepend가 있으면 count statement도 똑같이 처리해주도록 한다.
<statement id="findUsersCount" parameterClass="java.util.HashMap" resultClass="int"> SELECT count(*) FROM USERS <dynamic prepend="WHERE"> <isNotEmpty property="searchKey">$searchKey$ = #searchValue#</isNotEmpty> </dynamic> </statement>
