2013. 11. 19. 15:44

위와 같이 구현해보려고 합니다. 게시판만들때 좀 까다로운 부분이긴 알고보면 원리는 간단합니다. 최대한 이해하기 쉽고 짧게 써볼려고 합니다.

ASP, PHP, JSP로 게시판을 만들보려는분들에게 많은 도움이 되었으면 합니다. 그럼 시작하겠습니다.

 

먼저 알아야 할건 페이징 알고리즘의 개념입니다. 페이지와 블록이라는것이 있는데요 천천히 알아보겠습니다.

 

 

1. 게시판에 저장된 총 글의 개수를 구한다.

 

conn = dbMgr.getConnection("mydb");

stmt = conn.createStatement();

rs = stmt.executeQuery("select count(*) from " + tableName);

if (rs.next()) rowCount = rs.getInt(1);

pageCount = rowCount / 15;

if (rowCount%15 > 0) pageCount++;

 

일단 위코드는 모르셔도 되구여 위에서 몇개만 보면됩니다.

rs = select count(*) from tableName;

위 쿼리에 보시면 현재 게시판 테이블에 저장된 글의 총 개수를 구하고 있습니다.

만약 게시판에 글이 100개가 저장되어있다면 100값을 리턴하겠죠... 52개가 저장되어있다면 52를 리턴하겠죠

 

위 코드에서 rs는 ResultSet를 의미하는 변수인데요.. 이곳에 쿼리의 결과가 저장됩니다. 당연히 여기에는 게시판의 총 글 개수가 저장되어있겠죠.

rowCount = rs.getInt(1);

rs에서 값을 뽑아와서 변수 rowCount에 저장합니다

rowCount에는 이제 게시판의 총 글개수가 저장되어있습니다.

이제 이것을 가지고 약간 잔머리를 굴려고 페이지를 나누고 하면됩니다.

 

여기에서는 한 페이지에 글이 15개가 보여진다고 하겠습니다.

만약 총 글의 개수가 100개가 저장되어있다면 한 페이지에 100개나 되는 글을 보여줄수도 있지만

한 페이지에 게시글 15개를 보여주고 페이지를 나눠야 보기 편하겠지요.

1 2 3 4 5 6

이런식으로요

1페이지에 글 15개, 2페이지 클릭하면 글 15개 보여지고 3페이지에 글 15개 4페이지에 글 15개, 5페이지에 글 15개, 6페이지에 글 15개

15*6 = 90    글10개가 남네요 글 10개를 위해서 페이지를 하나더 만들어야겠지요 그건 밑에서 알아보겠습니다. 

 

 

위 코드에 보시면

pageCount = rowCount / 15;

 

rowCount는 게시판의 총 글 개수가 저장되어있구여

여기에 15를 나누면 총 몇 페이지로 나눌지 알수 있겠습니다.

게시판의 총 글 개수가 100개있다고 가정하고 15를 나누면 pageCount에 6이라는 값이 저장되겠습니다.

pageCount값이 6이 니깐 이 값을 이용하여

 

게시판 밑에 페이지를 만들면 되겠지요

1 2 3 4 5 6

이렇게요

자 이렇게 페이지를 나누는 방법을 알아봤습니다. 하지만 아직 중요한게 남아있습니다.

100에서 15를 나누면 6 페이지가 나옵니다. 한 페이지당 15개씩 게시글이 보여지구여

하지만 계산해보니 나머지가 10개가 있군요 이 말은 10개의 게시물이 남는다는겁니다.

이 10개의 게시물을 보여주기 위해 하나의 페이지를 더 만들어야겠지요.

1 2 3 4 5 6 7

이렇게요.

 

6까지는 90개의 글이 보여지고 7을 클릭하면 나머지 10개의 글을 보여줍니다.

 

젤 위 코드를 보시면

if (rowCount%15 > 0) pageCount++;

위 내용을 이렇게 구현하고 있습니다.

총 게시물에서 나머지가 0이 아니구 1개 이상있으면 pageCount++를 해서 페이지 하나를 더 할당해주는겁니다.

 

만약 총 게시물이 90개라면 나머지가 0이지요. 이러면 페이지가 딱 6개만 있으면 됩니다.

하지만 만약 총 게시물이 91이라면 나머지가 1이 남습니다. 이 말은 1개의 게시물이 남습니다.

이 게시물도 보여줘야 하기때문에 pageCount++를 해서 페이지 하나를 더 만들어서 나머지 1개의 게시물을 보여주면 되겠지요.

 

최종적으로 pageCount에 페이지 개수가 저장되겠습니다.

 

만약 총 게시물이 1000개라면 ;;; 위 알고리즘이 알아서 페이지 개수를 계산해서 pageCount에 저장하겠지요

만약 총 게시물이 10000개라면 ;;;; 역시 위 알고리즘이 간단히 페이지 개수를 계산해서 pageCount에 저장합니다. 

 

 

지금까지 배운건 총 게시물을 몇 페이지로 나누는지 계산한 거였습니다.

계속 잘못된건 수정하겠구여 잘못된거나 만약 제 글이 너무 애매하게 써져있어서 이해하기 어렵다면 댓글 남겨주시기 바랍니다.

다음에는 이 페이지를 실제로 어떻게 구현할것인지와 블럭이라는 개념에 대해서 알아보겠습니다.

 

 

게시판 페이징 알고리즘 2번째 시간입니다...

 

uniqitem.com

위 사이트는 현재 강좌에 맞춰 만들어진 게시판이 있는곳입니다 참조하시면 됩니다 ^ ^

 

아 깜빡한게 있는데요 다음은 페이지번호를 이용하여 글 15개를 뽑아내는 SQL입니다.

"select no,name,title,registerDate, readno from "
   +tableName+ " order by no desc limit " +((pageNo-1)*15) + ",15"

 

쿼리 보시면 대충 어떤건지 이해가 가실겁니다.

tableName은 해당 게시판테이블명이며, pageNo는 페이지번호입니다. 해당테이블에서 페이지번호에 해당하는 글 15개를 뽑아서 리턴해줍니다.

예를 들어 아래그림에서 2페이지를 클릭했다면 2페이지에 해당하는 글 15개가 보여져야겠죠.. 만약 6페이지를 클릭했다면 6페이지에 해당하는 글 15개가 보여줘야 겠습니다. 위 쿼리가 저렇게 해당 페이지번호(pageNo)를 입력받으면 해당페이지 글 15개를 알아서 뽑아줍니다.

getBoardList(String tableName, int pageNo) {

         

        // 기타코드

"select no,name,title,registerDate, readno from "
   +
tableName+ " order by no desc limit " +((pageNo-1)*15) + ",15"

        // 기타코드

}

위와 같이 함수를 만들어서 사용하면 되겠습니다.

예)getBoardList("bbs", 2);

위 함수는 bbs테이블에서 2페이지에 해당하는 글 15개를 뽑아옵니다.

이방법 말구두 여러가지 방법이 있습니다.

 

 

 

전에 1에 이어 계속 써보겠습니다.

전 시간에는 페이지를 나누는 법을 배웠습니다. 이번에는 전 시간에 말씀드렸습니다 블록이라는 개념을 알아보겠습니다.. 블록이 무엇이냐 함은 다음 그림을 보시면

 

 

 

 

위 그림을 보시면 1부터 10

11부터 20

 

이렇게 페이지를 10개씩 해놨습니다..

저는 한블럭당 페이지를 10개씩 나눴는데요...

이렇게 페이지를 10개씩 나눠서 한 덩어리를 블럭이라고 합니다.

 

위에는 페이지가 24개가 있는데 3개의 블럭으로 나눴네요 ^ ^

 

앞에서 페이징알고리즘의 계산을 통해 페이지가 100개가 나왔다고 치면 한 화면에 100개의 링크를 만들면 좀 복잡하겠죠... 이렇게 위처럼 각 블럭마다 10개 씩 페이지를 출력하게 하고 다음 버튼이나 이전 버튼을 사용하여 블럭을 이동하면 편리하겠죠...

아마 대부분 게시판 사용해보셨으니 무슨 이야기인줄 아실겁니다.

 

이제 블럭을 계산해야 합니다. 게시판 페이징 알고리즘1에서 전체 페이지가 몇개인지 구했었죠...

인제 이 전체 페이지를 이용하여 블럭을 구해야 합니다. 공식은

 

block = (전체페이지/10);

 

if (전체페이지%10 != 0) block++;

 

 

공식을 보시면 저는 블럭마다 페이지를 10개로 설정했습니다.

만약 블럭마다 15개 페이지를 보여주고싶다면 15로 나누면 되겠지요.

공식은 전체글의 개수에서 전체페이지 구하는 공식과 같습니다.

 

전체페이지에서 10으로 나눴구여 만약 전체페이지가 24개라면 10으로 나누면

블록이 2개가 됩니다... 그런데 나머지 4개의 페이지도 보여줘야 겠지요

 

그래서 위에서 밑의 공식이 필요합니다.

if (전체페이지%10 != 0) block++;

 

위 공식은 만약에 전체페이지에서 10으로 나눈후 나머지가 0이 아니면 나머지가 있다는 이야기 이므로 나머지 페이지들을 보여주기 위한 블럭을 하나 더 만들어 줘야 합니다.

 

그래서 block++을 해줘서 블럭을 하나 더 만들어줍니다.

이렇게 하면 위 공식대로라면 전체페이지24개라면 3개의 블럭이 만들어지겠지요...

 

 

흠 지금까지 전체 페이지와 전체 블럭을 구하는 방법을 배웠습니다.

이제 거의다 한거 같네요 ^ ^

이제 전체페이지와 전체 블록을 이용하기만 하면 됩니다.

 

 

어려운 내용이나 애매모호한 내용이 있다면 댓글주세요. ㅎ

내용이 너무 길어졌네요 다음강좌로 넘어가겠습니다.

 

 

게시판 페이징 알고리즘1과 게시판 페이징 알고리즘2 에서

전체 게시글에서 전체페이지과 전체 블럭을 구하는 방법을 배웠습니다.

 

이제 전체페이지와 전체블럭을 구했으니 이걸 이용하면 됩니다.

 

 

보통 list.jsp에서 글 목록을 보여주지요... 글작성자, 글제목,글작성날짜

게시판 밑에는 위 그림처럼 페이지를 왔다갔다 할수 있는 링크들이 있구요...

 

list.jsp에서 전체페이지와 전체블록을 구하는 공식이 있어서 전체게시글이 100개든 1000개든 10000개든 총 몇개의 페이지가있고 몇개의 블럭이 있는지 계산이 됩니다.

 

잠깐 위 그림을 보시면

1부터 10까지를 블럭1이라 하고

11부터 20까지를 블럭2라 하고

21부터 24까지를 블럭3이라 하겠습니다.

이렇게 하는게 맞겠지요

 

보통 list.jsp를 주소창에 입력할때 파라미터도 같이 보내야 합니다.

list.jsp?block=1&page=3

 

위와 같이 파라미터와 같이 보냅니다. block과 page 파라미터입니다.

이 파라미터들을 list.jsp에서 받아서 사용하면 됩니다.

 

php의 경우

$currentBlock = $_GET["block"];

$currnetPage = $_GET["page"];

 

jsp의 경우

int currentBlock = Integer.parseInt( request.getParameter("block") );

int currentPage = Integer.parseInt( request.getParameter("page") );

 

위와 같이 파라미터를 받아서 해당 게시물을 DB에서 뽑아오면 되겠습니다.

 

 

출처 : http://blog.naver.com/leon1983?Redirect=Log&logNo=140066494563


Posted by hoonihoon