[Spring] 21.SpringProject-페이징 처리(3)
페이징 처리 - UriComponentBuilder
저번 장에서 listPage.jsp 에 페이지 번호를 출력해주는 PageMaker라는 클래스를 만들었습니다!
저희가 앞으로 해야할 일은 다음과 같습니다!
- BoardController에 페이징 기능을 하는 listPage 메소드 추가 (컨트롤러)
- listPage.jsp 생성 (프리젠테이션 계층)
그 전에 해야할 작업이 한가지 더 있습니다~!
앞으로 전체 목록은 항상 페이지 기능이 적용되서 보여질 것이기 때문에 모든 페이지의 URI는 page와 perPageNum 을 달고 다녀야 합니다.
예를 들어 6 페이지의 118번 게시물을 조회하고 다시 목록으로 돌아갔을 때 6페이지 상태로 유지하려면, /board/listPage?page=6&perPageNum=10 , /board/read?page=6&perPageNum=10&bno=118 처럼 URI 에 page와 perPageNum이 달려있어야합니다!
따라서 모든 페이지의 URI에 ?page={page}&perPageNum={perPageNum} 을 붙여줘야합니다!
이 때 도움이 되는 클래스가 UriComponentsBuilder 와 UriComponets 클래스입니다!
URI를 생성해주는 클래스라고 생각하시면 됩니다!
UriComponentsBuiler의 사용에 대한 간단한 테스트코드는 다음과 같습니다!
//URITestData.java
package com.gguri.swp;
import static org.junit.Assert.assertEquals;
...
public class URITestData {
private static final Logger logger =
LoggerFactory.getLogger(BoardDAOTest.class);
@Test
public void uriTest() {
int page = 6;
int perPageNum = 10;
UriComponents uriComponets = UriComponentsBuilder.newInstance()
.path("/board/listPage")
.queryParam("page", page)
.queryParam("perPageNum", perPageNum)
.build();
String uri = "/board/listPage?page=" + page + "&perPageNum=" + perPageNum;
logger.info(uri);
logger.info(uriComponets.toString());
//같지 않으면 에러
assertEquals(uri, uriComponets.toString());
}
}
URI가 제대로 생성되었네요~!
UriComponentsBuilders는 특정 URI를 먼저 지정하고 작업하는 것도 가능합니다!
또 encode() 메서드도 제공하는데 URI에 허용되지 않는 값들이 인코딩 됩니다.(한글 특수문자가 인코딩 됨)
//URITestData.java
package com.gguri.swp;
...
public class URITestData {
private static final Logger logger =
LoggerFactory.getLogger(BoardDAOTest.class);
@Test
public void uriTest() {
int page = 6;
int perPageNum = 10;
UriComponents uriComponets = UriComponentsBuilder.newInstance()
.path("/{module}/{page}")
.queryParam("page", page)
.queryParam("perPageNum", perPageNum)
.queryParam("search","강원도 횡성군 쀍 ㅋㅋㅋ 인코딩 예제")
.build()
.expand("board","read")
.encode();
logger.info(uriComponets.toString());
}
}
한글이 제대로 인코딩된 것을 볼 수 있습니다~!
저는 UriComponents와 UriComponentsBuilder를 이용해서 page와 perPageNum을 URI에 붙일 것입니다!
먼저, PageMaker에 makeQuery라는 메소드를 추가합니다!
//PageMaker.java
package com.gguri.swp.domain;
...
public class PageMaker {
private int displayPageCnt = 10; // 화면에 보여질 페이지 번호 수
private int totalDataCount; // 실제 게시물 수
private int startPage; // 현재 페이지 기준 시작 페이지 번호
private int endPage; // 현재 페이지 기준 끝 페이지 번호
private boolean prev; // 이전 버튼 활성화 여부
private boolean next; // 다음 버튼 활성화 여부
private Criteria cri; //page(현재 페이지), perPageNum(페이지 당 보여질 게시물의 수)
...
public String makeQuery(int page) {
UriComponents uriComponents = UriComponentsBuilder.newInstance()
.queryParam("page", page)
.queryParam("perPageNum", this.cri.getPerPageNum())
.build()
.encode();
return uriComponents.toString();
}
...
}
또 Criteria 에도 makeQuery 메소드를 추가해줍니다!
package com.gguri.swp.domain;
import org.springframework.web.util.UriComponentsBuilder;
public class Criteria {
private int page;
private int perPageNum;
...
public String makeQuery() {
return UriComponentsBuilder.newInstance()
.queryParam("page", page)
.queryParam("perPageNum", this.perPageNum)
.build().encode().toString();
}
...
}
이 makeQuery() 메소드는 다음 장에서 listPage.jsp를 구현할 때 엄청 많이 사용될 것입니다!