[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());
	}
	
}




image



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());
	}
}




image



한글이 제대로 인코딩된 것을 볼 수 있습니다~!


저는 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를 구현할 때 엄청 많이 사용될 것입니다!