멍청한 코딩

Map packeddata = (Map)request.getAttribute(“packeddata”);
List years = new ArrayList();
while(packeddata.keySet().iterator().hasNext()){
Integer year = (Integer)packeddata.keySet().iterator().next();
years.add(year);
}

이걸….

이걸루
바꾸다

Map packeddata = (Map)request.getAttribute(“packeddata”);
List years = new ArrayList();
Iterator iterator = packeddata.keySet().iterator();
while(iterator.hasNext()){
Integer year = (Integer)iterator.next();
years.add(year);
}

while 문 돌때마다 생성되는 객체가 무수히 많아져서 OutOfMemory 에러가 나더군요..
음…
그래서 아래와 같이 변환…짠.~~~
역시 멍청하게 코딩하면 안되는거군요..

에궁… 게시판 페이징 로직이다..

리스트에서 빠질 수 없는게 페이징 시스템입니다…

[1][2][3][4][5][6][7][8][9][10]

위와 같은 페이지를 누름으로써 그에 대한 리스트만 출력하는 것이지요…

이렇게 하는 이유는 전체의 리스트를 화면에 다 보여준다면 빨리 찾을 수도 없고

속도 또한 느립니다. 그래서 페이지로 구분해놓으면 찾아가기 싶게 됩니다..

여기서는 가장 기본적인 개념으로 페이징 시스템을 구현하겠습니다….

방법은 여러가지니깐 여러 각도로 시도해보는 것도 좋을 듯 합니다….

페이징 시스템에서 필요로 하는 것이

1. 현재 페이지

2. 현재 페이지의 블럭

(블럭은 페이지가 속해있는 그룹입니다. 예를 들어서 한 블럭에는 10페이지가 들어가는데 현재의

페이지가 20 페이지 라면 블럭은 두번째 블럭으로 선택이 됩니다.. 그럼 표시는

[11][12][13][14][15][16][17][18][19][20] 으로 되겠죠…

이렇게 하는 이유는 페이지 또한 무한히 많을 수 있기 때문에 페이지 자체의 페이징 시스템을

만드는 거죠. 그것이 블럭입니다. )

3. 전체 행의 개수

(이것을 알아야지만 현재 페이지가 속해 있는 블럭을 계산 할 수 있습니다. )

4. 현재 페이지의 블럭에서 시작페이지와 끝 페이지

(숫자 더하기, 빼기 계산만 하면 되기 때문에 특별한 건 없습니다.)

5. 한 페이지에 보여질 리스트 수 (limitList)

한 블럭에 보여질 페이지 수 (limitPage)

(위의 두가지가 있어야지 전체적인 계산이 됩니다… ^^ )

이상 위의 다섯가지로 일단은 페이지 시스템에 대해서 보여지는 것이 가능하구여

이제 가상으로 페이징 시스템을 만들어 보겠습니다…

1. 현재의 페이지 : 1페이지

2. 현재의 블럭 : 1블럭

3. 전체 행의 개수(total) : 100

4. limitList : 10, limitPage : 5

이렇게 네개의 구성요소로서 시작을 합니다….

리스트가 젤 처음 보여질 때 페이징 시스템은 1블럭의 1페이지를 가리키고 있어야 합니다..

1. 현재 페이지에서 현재 블럭구하는 방법

$block = ceil($page/$limitPage);

=> ceil 함수는 만약 숫자가 4.5라고 하면 올림을 하여 5가 되게 하는 함수입니다.

2. 현재 블럭의 시작 페이지와 끝 페이지

// 현재 블럭이 1블럭이라면 1이지만 2 블럭일때는 11이 되어야 합니다

$startPage = ($block-1)*$limitPage + 1;

// 마지막 블럭에서 페이지가 총페이지 수 보다 커지면 안되기 때문에

// 미리 총 페이지 수를 구해서 큰지 확인해줍니다.

$endPage = $startPage + $limitPage – 1;

if ($endPage > $totalPage ) $endPage = $totalPage;

3. 총 페이지 수 구하는 방법

$totalPage = ceil($total/$limitList);

4. 그럼 페이징 시스템을 출력하는건 간단하죠…

for ($i = $startPage; $i <= $endPage; $i++) { if ($page == $i) echo “[$i]”;

else echo “[$i]”;

}

현재 페이지는 찐하게 표시해줍니다. 그럼 기본적인 페이지 표시 시스템이 끝이 납니다.

설마 여기서 끝내는건 아니겠죠.. ^^

아까 블럭이란걸 만들었기 때문에 블럭 자체도 이동할 수가 있어야 겠습니다..

보통 게시판에 보면 ◀, ▶ 이런 화살표로 표시 되거나 prev, next 라는 말로 표시되거나 합니다.

[prev] 1 2 3 4 5 6 7 8 9 10 [next]

그래서 블럭을 옮길 수 있게 됩니다..

1. 현재의 블럭이 어딘지 알고 그 앞에 블럭이 있는지 뒤에 블럭이 있는지를 계산해서 표시합니다

현재 블럭은 위에서 구했기 때문에 넘어가구여

// 현재의 블럭이 앞에 있는 아닌지 검사

if ($block <= 1) echo ""; else echo “[prev]”; // 위의 페이징 시스템 표시 // 마지막 블럭인지 아닌지 검사 $totalBlock = ceil($totalPage/$limitPage); if ($block >= $totalBlock) echo ” “;

else echo [“next”];

위와 같이 쉽게 구할 수 있습니다. 이건 완전히 산수네요.. ㅋㅋㅋ

이제 페이징 시스템의 마지막 단계가 남았습니다..

디비 관련 작업입니다.. ^^

정렬한 것에 대해서 그 페이지에 맞는 내용을 가져와야 하기 때문에

여기서는 디비 쿼리 명령중 limit라는게 사용됩니다.

예 : select * from test order by groupNum desc, listNum asc limit $start, $limitList;

젤 마지막에 변수 두개만 설정 해주면 되는데요,,

두가지 옵션은 처음에는 시작되는 row의 번호구여, 뒤에꺼는 몇개를 얻어올껀지 입니다

0, 5 하면 0번째에서 5개행을 얻어온다는 소리하고 같죠.. ^^

마지막 $limitList는 아까 위에 있는 변수랑 같은 거기 때문에 그 대로 주시면 되구여

$start만 계산하면 됩니다..

계산하는 방법은 1페이지 일때 1에서 10, 2 페이지 일때 11에서 20 이런식으로 된다면

디비에서 row는 0부터 시작하기 때문에 0에서 9, 10에서 19 이런식으로 됩니다. 하나 작죠.. ^^

그럼 어떻게 계산을 하느냐…

($page-1)*$limitList;

어디서 많이 본 공식인데..ㅋㅋ 저위에 보면 블럭의 시작페이지 구하는 공식하고 비슷한데

+1 이 빠졌네요 .. 왜 그렇냐면 1씩 작으니깐요.. ^^ 그래서 +1을 해 줄 필요가 없죠….

그래서

select * from test order by groupNum desc, listNum asc limit 0, 10;

하면 0번째 행에서 10개의 행을 얻어오는것이니 바로 리스트에 적용할 수 있겠죠..

리스트 화면에서는 이것에 대한 처리만 해주면 되구여… ^^

약간씩 복잡해 보일 수도 있지만 실상은 더하기 빼기밖에 없네요.. ^^

우리 모두 게시판을 누워서 떡 먹듯 다루는 그 날까지.. 화이팅.. ^^

ps . 예전에 개발해본적이 있는데 jsp로 다시 할라니 조금 헤멧넹…
암튼 이런 자주 사용하는 로직은 정리가 필수다..