처음 게시판을 만들 때 가장 고민되는 것은 역시
페이징 처리를 어떻게 하느냐의 문제일 것이다.
이 페이지에서는 그 부분을 다뤄보도록 하겠다
먼저 우리는 페이지의 기준을 잡아야한다.
현재 페이지가 몇페이지인지, 페이지에 몇개의 게시글을 보여줄 것인지를
모니터링 하는 클래스를 하나 만들자
public class PaginationCriteria {
private int page; // 현재 보고 있는 페이지
private int numsPerPage; // 한 페이지에 보여줄 게시글 갯수
public PaginationCriteria() {
this.page = 1;
this.numsPerPage = 10;
}
public PaginationCriteria(int page, int numsPerPage) {
this.page = page;
this.numsPerPage = numsPerPage;
}}
이런식으로 구성했다.
우리가 게시판을 만들 때 생각해야되는 것은
전체페이지(totalPageNum)
페이지번호(1,2,3,4,5 이런 식으로 밑에 넘버링되는 번호)(numsOfLinks),
첫번호(startPage, 마지막번호(endPage)
다음(next), 이전(false) 버튼
이다.
먼저 전체 페이지이다.
게시글 / 페이지에 표시될 갯수로 페이지의 숫자를 계산해야 한다..
Java같은 경우에는 나누기를 할 때 int값으로 계산을 하고
소수점을 날려버리기에 이는 실수값으로 계산하여 반올림할 필요가 있다. 아니면 인트값으로 계산하여 소수점이 존재할 경우 +1을 하는 방법도 있다.
예로 한페이지에 10개를 보여주는 게시판에서 15개의 글이 있다고 해보자
그러면 15/10을 하여 1.5의 페이지를 보여줄텐데
int의 경우 0.5를 날려버리고 1페이지만을 보여준다. 이렇게 되면 10개의 게시글 밖에 보지 못하는 페이지가 된다는 이야기이다.
때문에 먼저 실수로 형변환을 하여 반올림을 하고, 다시 인트값으로 돌려놓는 방식을 취하면 된다.
int totalPageNum = (int)
Math.ceil((double) totalCount / criteria.getNumsPerPage());
이런 방식으로 말이다.
다음으로는 페이지의 앞번호와, 끝 번호를 어떻게 뽑아낼까의 문제이다.
먼저 끝번호를 뽑아낸다면 앞번호를 뽑아내기는 쉬워지므로
끝번호를 뽑아보도록 하자
일반적으로 1,2,3,4,5,6,7,8,9,10 이 표현되는 페이징에서 끝번호는 10.
11~20 에서 끝번호는 20 이다.
이 일련의 과정을 일정하게 표현해주는 식을 찾아야 한다.
int temp = (int)
(Math.ceil((double) criteria.getPage() / numsOfLinks)) * numsOfLinks;
// 임시 = (현재페이지 / 페이지 번호를 몇개씩 보여줄 지 숫자) * 페이지 번호를 몇개식 보여줄 지 숫자
이런 식을 사용할 수 있다.
criteria.getPage()는 현재 보고있는 페이지를 의미한다. 이 페이지를 페이징에서 보여주는 만큼(우리의 경우 10)으로 나눈 뒤 반올림하고
다시 그 숫자로 곱해주면 10,20,30 으로 일정하게 숫자가 나온다. 이 숫자를 엔드번호로 사용하면 된다.
하지만 마지막 페이지의 경우 이 숫자를 사용하지 않기 때문에
if 처리를 하여 이 숫자를 사용할 때와 안할 때를 구분해줘야 한다.
if (temp > totalPageNum) {
endPage = totalPageNum;
} else {
endPage = temp;
}
이런 식으로 말이다.
시작페이지는 이를 이용하면 된다.
startPage = ((endPage - 1) / numsOfLinks) * numsOfLinks + 1;
만약 끝페이지가 20일 경우 20-1은 19
19를 10(numsOfLinks)로 나눈다면 1.9가 나오지만, int의 나누기이게 소수점 아래값은 날아가고
1만 남게된다. 이 숫자에 페이징수(numsOfLinks)를 다시 곱하면 10 여기에 1을 더해주면
11이 되게 된다
11~20의 숫자가 만들어지게 된것이다.
예제로 한번 정리하자면
502개의 게시글이 있는 개시판을 만든다고 가정해보자.
한번에 보여지는 게시글은 10개이고, 페이징은 10개 단위로 할 것이다.
이 경우 전체 페이지는 502/10 = 50.2 -> 51 개가 된다.
51개의 페이지를 만들어야 된다는 숫자를 얻었다.
마지막페이지는 51페이지
이제 페이징을 하기 위해 중간과정에서의
1~10
11~20
21~30
31~40
41~50
이라는 숫자를 얻어야 한다.
31~40을 예로 보자면
보고 있는 페이지 입력값이 33으로 들어왔을 경우
33/10 = 3.3 -> 4 * 10 = 40
으로 endPage가 만들어지게 된다
40은
40-1 = 39
39/10 = 3.9 -> 3 *10 = 30
30+1 = 31
31로 startPage를 만들 수 있다
31~40이라는 숫자를 만들어 낸 것이다.
if (startPage == 1) {
prev = false;
} else {
prev = true;
}
if (endPage * criteria.getNumsPerPage() >= totalCount) {
next = false;
} else {
next = true;
}
다음으로 이전버튼
다음버튼이다.
이전버튼은 간단하다 startPage는 1일 때는 없앤다
다음버튼은 endPage가 총 게시글 숫자보다 적을 대 표시해준다
예를들어 223개의 게시글이 있는 게시판을 생각해보자
마지막 21~23의 페이지에서는 endPage가 23일 것이다
23 * 10(한번에 표시해주는 게시글 숫자)를 곱한 합은 230이고 이는 223보다 크다
이 경우 다음 버턴이 false가 되는 것이다.
'개발문제해결 > 알고리즘 문제풀이' 카테고리의 다른 글
백준 11720번 - 숫자의 합 (0) | 2018.02.22 |
---|---|
백준 11718번 11719번 - 그대로 출력하기 1, 2 (0) | 2018.02.20 |
자바 선형 리스트 구현과 개념 (Linear List) (0) | 2018.01.28 |