zepinos
18k
2015-06-22 14:54:07
39
58842

페이징(Paging)에 대한 이해 - (1) 페이지 번호를 생성하자.



흔히 웹 개발을 처음 하는 개발자가 처음 겪게 되는 난관은 바로 게시판의 페이징(Paging)이 아닐까 합니다. 특히 DBMS 와 연동해서 개발하는 경우가 많은데, 각 DBMS 마다 페이징 방법도 많고 성능 등 신경써야 할 부분이 많이 때문에 어떤 자료를 보고 따라해야 문제가 없을지 판단하기 막막할 때가 있습니다.


그래서 페이징에 대한 원리를 파악해서 가장 기본적인 페이징 구현을 할 수 있는 방법을 알려드리고자 합니다.


이 글은 초보자를 위한 글이므로, 페이징 정도는 우습다는 분은 패스해주시길...^^;;;




먼저, 페이징에 대한 이해를 하기 위해서는 페이징을 하기 위해 각 DBMS 가 어떤 정보를 제공해줘야 하는지 알아야 합니다. DBMS 마다 페이징을 위한 방법이 다른데, 제공하는 정보가 다르기 때문입니다.


모든 DBMS 는 내가 원하는 정보의 총 갯수를 가져오는 기능을 제공합니다. 바로 select count(*) 을 이용하는 것입니다. 이것을 이용해서 게시판 아래 출력되는 페이지 번호를 생성할 수 있습니다.

그렇다면, 해당 페이지의 게시물만 가져오는 방법은 무엇일까요?

오라클은 전통적으로 ROWNUM 을 제공합니다. 출력되는 정보에 순차적인 번호를 부여함으로써 원하는 게시물만 가져오는 방식입니다.

MS SQL Server 는 예전에는 TOP 을 이용했습니다. 출력될 정보 중 상위 몇 개를 가져온 뒤, 그 중 원하는 시작점까지 프로그램 상에서 이동을 해서 그 뒤의 것들을 가져오는 방식입니다. 하지만, 최근에는 오라클과 마찬가지로 ROW_NUMBER() 을 제공함으로써 좀 더 편한 페이징이 가능해졌습니다.

MySQL 이나 PostgreSQL 은 전통적으로 LIMIT 를 이용한 페이징을 제공했습니다. 페이징 할 때 크게 고민할 것 없이 사용이 가능하므로 매우 개발자 친화적이긴 하지만, 두 DBMS 의 LIMIT 는 의미가 약간 다르므로 주의해서 사용해야 합니다.

참고로, 제가 주로 사용하는 NoSQL 제품인 Couchbase 에서는 limit 와 skip 을 통해서 페이징을 가능합니다. 사실 내부적인 동작 원리는 비슷하지만, 어떻게 페이징된 정보를 가져오냐의 차이인 것 같습니다.




이번에는 게시판 하단에 표시되는 페이지 번호에 대해서 알아보겠습니다.


예를 들어 25 개의 게시물이 등록된 게시판(board)이 있다고 하겠습니다. 그럼 다음과 같은 Query 을 통해 총 게시물의 수(totalCount)를 가져올 수 있을 겁니다.


select count(*) as totalCount from board


그럼 프로그램에선 몇 가지 정보를 이용해서 하단의 페이지 번호를 생성할 수 있습니다.


1. 한 페이지에 출력될 게시물 수 (countList)

2. 한 화면에 출력될 페이지 수 (countPage)

3. 현재 페이지 번호 (이하 page)


처음 해야할 것은 총 몇 페이지가 존재하는지 알아내는 것입니다(총 페이지, 이하 totalPage). 이 때 필요한 것은 countList 인데, 이해를 돕기 위해 countList = 10 혹은 countList = 5 라고 가정하고 계산해보겠습니다.


25 / countList

25 / 10 = 2 나머지 5

25 / 5 = 5 나머지 0


우리가 기대하는 수는? 바로 3 와 5 입니다. Java 와 같은 언어에서는 int 형으로 보통 계산을 하기 때문에 25 /10 을 해버리면 2 만 나오게 됩니다. 그렇다고 무조건 1 을 더하게 되면 아래의 countList = 5 와 같은 경우 때문에 정확한 총 페이지 수(totalPage)을 계산할 때 무조건 1 을 더해선 안됩니다(의외로 이렇게 계산해서 마지막 페이지에 게시물 안나오는 곳이 많더군요). 위에서 보듯이 가장 정확하면서 단순한 방법은 나머지가 있을 경우에만 1 을 더해줘야 합니다. Java 로 된 최종 코드는 아래와 같이 되겠죠.



int totalCount = 25; // 물론 실제론 여긴 DBMS 에서 조회해서 들어가야 합니다.

int countList = 10;


int totalPage = totalCount / countList;


if (totalCount % countList > 0) {

    totalPage++;

}



혹은 아래와 같이 처리할 수도 있겠죠.


int totalCount = 25;

int countList = 10;


int totalPage = totalCount / countList;


if (totalCount > countList * totalPage) {

    totalPage++;

}


이렇게 하면 총 페이지 수를 알 수 있습니다. 이 값을 통해서 한 화면에 출력될 페이지 수가 10 개라고 해도, 3 페이지까지만 존재할 경우 1 에서 3 페이지까지만 하단에 출력해줄 수 있습니다(이런 처리 안해서 없는 페이지를 출력하는 곳도 많더군요).

또한, 잘못된 현재 페이지에 대한 보정도 가능합니다.

현재 페이지 번호가 총 페이지 번호보다 크다면 어떻게 해야 할까요? 현재 페이지를 강제로 총 페이지 번호로 치환하는 것도 방법이 될 것입니다.



int page = 2;


int totalCount = 25;

int countList = 10;


int totalPage = totalCount / countList;


if (totalCount % countList > 0) {

    totalPage++;

}



if (totalPage < page) {

    page = totalPage;

}





이번에는, 하단에 표시될 페이지 번호들을 어떻게 알아낼 수 있는지 알아보겠습니다. 이번 예제에는 totalCount = 255, countList = 10, countPage = 10 으로 하겠습니다. 그리고 현재 페이지인 page 는 5 와 22 의 두 가지 경우를 생각해보겠습니다. 또한, 페이지 표시 방식은 대한민국에서 가장 많이 쓰는 방식인 10 개의 페이지를 보이는 방식으로 하겠습니다. 이 방식은 현재 페이지 기준으로 앞 뒤 몇 개의 페이지를 보여주는 외국의 방식보다 대한민국에서 더 많이 쓰는 방식입니다.


먼저 page = 5 일 경우입니다. 이 경우 우리가 예상하는 결과는 하단에 1 ~ 10 까지의 페이지 번호가 표시되는 것입니다(countPage = 10 이니까요).


이런 페이지 번호 계산을 하는 방법은 몇 가지가 있습니다만, 가장 간단하고 쉬운 방법은 바로 시작 페이지 번호를 계산해내는 것입니다. page = 5 일 경우 시작 페이지(startPage)는 1, 마지막 페이지(endPage)는 시작 페이지에서 10 페이지(countPage 가 10 이니까요)까지라는 건 금방 이해하시리라 생각합니다. 그럼 page = 5 에서 어떻게 1 페이지를 찾아낼 수 있을까요? 아주 쉽습니다. 그냥 countPage 로 나눠버리면 됩니다(그리고 1 을 더해줘야 해요!). 그럼 마지막 페이지는요? countPage 을 더하면 됩니다. 단, 더한 뒤 1 을 빼주는 작업은 잊으시면 안됩니다. 왜 그런지는 생각해보시면 금방 깨닫게 되실꺼구요.


int page = 5;

int countPage = 10;


int startPage = ((page - 1) / 10) * 10 + 1;  // 왜 1 을 더할까요?

int endPage = startPage + countPage - 1;  // 왜 1 을 뺄까요?


실제 보이는 페이지는 1 ~ 10 까지이지만, 실제 페이지 번호는 0 ~9 까지로 처리하는 경우도 있습니다. 그게 Java 와 같은 언어에선 처리가 더 간단하기 때문인데요...저 역시 시작 페이지는 0 으로 해서 처리한 클래스를 만들어서 씁니다만, 이해를 돕기 위해 여기서는 1 페이지는 1 의 page 번호를 가지도록 하겠습니다.


어쨌든, 저렇게 계산을 하면 startPage = 1, endPage = 10 이라는 결과가 나옵니다.


그럼 화면에 출력할 때에는요?


int page = 5;

int countPage = 10;


int startPage = ((page - 1) / 10) * 10 + 1;

int endPage = startPage + countPage - 1;


for (int iCount = startPage; iCount <= endPage; iCount++) {

    System.out.print(" " + iCount + " ");

}


이런 식으로 출력하면 페이지 번호가 연달아서 출력이 되겠죠.


그렇다면 page 가 22 인 경우에는요?


먼저 단순히 산수 계산을 해보면 255 개의 게시물이 있을 경우 총 26 페이지가 존재할 것이고, 22 페이지가 있는 곳에는 21 에서 30 페이지 영역일 것입니다. 하지만, 26 페이지까지이기 때문에 단순히 21 페이지에서 countPage 을 더하면 안된다는 것을 대번에 눈치 채셨을 겁니다. 그래서 이 경우에도 마지막 페이지는 총 페이지 수로 대체를 해줘야 합니다.


int page = 22;

int countList = 10;

int countPage = 10;


int totalCount = 255;


int totalPage = totalCount / countList;


if (totalCount % countList > 0) {

    totalPage++;

}



if (totalPage < page) {

    page = totalPage;

}



int startPage = ((page - 1) / 10) * 10 + 1;

int endPage = startPage + countPage - 1;



//  여기서 마지막 페이지를 보정해줍니다.

if (endPage > totalPage) {

    endPage = totalPage;

}



// [paging]

// 이 부분은 아래에서 추가로 설명합니다.

for (int iCount = startPage; iCount <= endPage; iCount++) {

    System.out.print(" " + iCount + " ");

}


대충 끝이 보이네요. 위에서 [paging] 이라고 표시된 부분에서 페이지 번호를 출력하는데, 출력을 할 때 css 코드를 넣거나 <a> 태그를 이용해서 연결을 하면 페이지 이동이 가능합니다. 이 때 현재 페이지는 굵은 글씨체로 표시하고 <a> 태그를 빼기 위해 아래와 같이 처리도 가능하겠죠.


// [paging]

// 이렇게 개선됩니다.

for (int iCount = startPage; iCount <= endPage; iCount++) {
 
    if (iCount == page) {

        System.out.print(" <b>" + iCount + "</b>");

    } else {

        System.out.print(" " + iCount + " ");

    }

}


보통 첫페이지 이동이나 이전 페이지, 다음페이지, 끝페이지 이동 버튼도 추가로 달아줍니다. 그래야 해당 페이지 리스트에 없는 곳으로도 이동이 될테니까요.

첫 페이지는 현재 페이지가 1 페이지가 아닐 때 표시되게 하는 경우도 있고, 시작 페이지가 1페이지가 아닐 때 표시하는 경우도 있습니다. 취향 문제죠. 어쨌든 이동하는 페이지는 항상 page = 1 이 되겠죠. 이전 페이지도 마찬가지입니다. 1 페이지가 아닐 경우 현재 페이지보다 1 페이지 앞으로 이동하도록 page - 1 값을 가지고 이동하게 하면 되죠. 다음페이지는 totalPage 와 비교해서 마찬가지로 표시해주면 됩니다.



int page = 22;

int countList = 10;

int countPage = 10;


int totalCount = 255;


int totalPage = totalCount / countList;


if (totalCount % countList > 0) {

    totalPage++;

}



if (totalPage < page) {

    page = totalPage;

}



int startPage = ((page - 1) / 10) * 10 + 1;

int endPage = startPage + countPage - 1;



if (endPage > totalPage) {

    endPage = totalPage;

}



if (startPage > 1) {

    System.out.print("<a href=\"?page=1\">처음</a>");

}



if (page > 1) {

    System.out.println("<a href=\"?page=" + (page - 1)  + "\">이전</a>");

}



for (int iCount = startPage; iCount <= endPage; iCount++) {

    if (iCount == page) {

        System.out.print(" <b>" + iCount + "</b>");

    } else {

        System.out.print(" " + iCount + " ");

    }

}


if (page < totalPage) {
    
    System.out.println("<a href=\"?page=" + (page + 1)  + "\">다음</a>");

}



if (endPage < totalPage) {

    System.out.print("<a href=\"?page=" + totalPage + "\">끝</a>");

}



이렇게 처리하면 페이징 표시를 할 수 있게 됩니다. 참 쉽죠~~~잉? (고 밥 로스 아저씨 따라하기)




다음에는 실제 각 DBMS 에서 페이지에 해당하는 글을 읽어오는 방법에 대해서 알아보겠습니다.

그리고, 이 글을 읽으시는 분 중에, DBMS 에서 조회할 때 총 페이지 번호와 게시물을 같이 읽어오면 되지, 왜 두 번에 나눠서 요청을 하느냐...그건 비효율적이다...라고 생각하시는 분은 곧 작성해서 올릴 다음 글을 꼭 읽어주세요. 왜냐하면 잘못된 습관이기 때문입니다.




이 글은 제 개인 블로그(http://zepinos.blogspot.kr)와 okky(http://okky.kr)에만 공개되는 글입니다. 퍼 가는 것은 금해주시고, 링크로 대신해주시기 바랍니다. 당연히 상업적 용도로 이용하시면...저랑 경찰서에서 정모하셔야 합니다. ^^;;;


위에 작성한 코드 등은 실제 컴파일한 것이 아니라 제가 글을 적으면서 키보드 코딩(?...손 코딩의 친구) 한 것이므로, 오류가 있다면 저에게 알려주시면 고맙겠습니다.

40
50
  • 댓글 39

  • boojongmin
    681
    2015-06-22 16:11:11

    신기술이 우후죽순 늘어나고

    그안에서 우왕좌왕하고있었는데

    기술이라는게 사실 새로운게 아니고 가만히 들여다보면 기본에서 파생되는것들인데

    원리에 입각해서 기술을 보면 그놈이 그놈인데

    그걸 구분 못하겠더군요...

    매번 막바지에 눈이 떠지는...;;

    뭘 배워야겠다는 급급함에 기본이라는것 등한시하게 되는것같습니다

    기본에 충실해야지하는 생각이 많이 드는 요즘 이런 글을 보게되어 반갑네요

    0
  • 100m8cho
    389
    2015-06-22 18:01:21

    잘 읽고 가요~ ^^

    매번 감사해요~ 

    0
  • 참새짹짹
    1k
    2015-06-22 22:41:42

    와우~ 저 맨날 페이징 못했었는데 ㅎㅎ

    정말 좋은자료 감사합니다!!

    0
  • rudnine
    25
    2015-06-23 09:04:35

    좋은 글에 댓글 달고 싶어서 로그인했습니다. 

    감사합니다.~


    0
  • LichKing
    13k
    2015-06-24 14:50:42
    키보드코딩 오류하나 잡아드리면 tatalPage가 있네요~ 좋은글잘봤습니다.
    0
  • zepinos
    18k
    2015-06-24 14:52:23

    LichKing 님 // 고맙습니다. 무려 3개나 있었네요. 수정했습니다.

    0
  • 에시칼로
    2k
    2015-06-25 16:26:55
    감사히 여러번 읽겠습니다.
    0
  • 허허
    1k
    2015-06-25 17:12:12
    감사합니다~~
    0
  • simyjae
    -37
    2015-07-01 16:26:51

    감사합니다~ 덕분에 이해를 확실히 할수있었어요!!

    근데 궁금한점이 있는데

    if (totalPage > page) 

    이 비교부분이 현재 페이지보다 총페이지 수가 클경우면 현재페이지가 마지막페이지일 경우 빼면 다 해당되는것 아닌가 싶은데..

    0
  • zepinos
    18k
    2015-07-01 16:32:19

    simyjae 님 // 앗! 고맙습니다. 부등호가 반대로 되어 있네요. 수정하겠습니다.

    0
  • react-native
    1k
    2015-07-02 08:32:57
    좋은정보 ! 추천!
    0
  • 하마
    6k
    2015-08-09 11:04:25

    int startPage = page / 10 + 1;  

    × 10  빠진듯
    0
  • zepinos
    18k
    2015-08-09 22:00:28

    하마 님// 어...그러네요...수정하겠습니다.

    0
  • trowa88
    44
    2015-08-12 17:56:28
    (page / 10 + 1) * 10; 여기서 page값이 5이면 startPage 값은 10 아닌가요??;;
    0
  • zepinos
    18k
    2015-08-12 18:20:58 작성 2017-11-22 15:29:38 수정됨

    trowa88님 // 윗 댓글에서 오류 문제가 있어서 글 수정을 하면서 엉뚱하게 고쳤네요.


    (page / 10) * 10 + 1 이 맞습니다. 좀 더 직관적으로 이야기하면


    ((int) (page / 10)) * 10 + 1 이구요.


    본문은 지금 수정하겠습니다.



    0
  • 마르티엘
    182
    2016-03-21 18:06:31

    정말 완벽한 글 인것 같습니다. 페이징 해야지 해야지 하고 말로만 하고 있었지만 무서워서 시도도 못하고 있었는데 이 글을 보니까 은근히 쉽게 했네요!! 정말 감사합니다.


    근데요 선배님 이거 따라 하다가 약간 이상한 점을 발견했습니다.

    int startPage = (page / 10) * 10 + 1;
    
    int endPage = startPage + countPage - 1;

    바로 여긴데요.. 


    만약 page가 30이라고 하면 startPage에 31이라고 찍혀 버립니다.


    예를 들면 이런거죠 21 ~ 30 페이지까지 페이징 처리가 돼있는데 제가 30번째 페이지를 보고 싶어서 누르면


    31페이지로 가버립니다. 이거 좀 잘못된게 아닌가 생각이 듭니다.


    int startPage = (page / 11) * 10 + 1; 이 돼야 맞지 싶은데 어떻게 생각하시는지요....

    0
  • zepinos
    18k
    2016-03-21 18:11:17

    마르티엘 님 // 그...그러게요...


    int startPage = ((page - 1) / 10) * 10 + 1;


    이 맞겠습니다. 그냥 머리로 코딩한거라...오류가 많네요. 본문은 수정했습니다.

    0
  • 큭큭푸푸
    12
    2016-07-07 05:01:51

    zepinos  님//

    좋은 글 감사합니다.

    학원 선생님은 '페이징처리는 어렵다'며 2번, 3번 설명을 해줘도,

    이해를 돕기위해서 자세한 설명을 해주는 것이 아니었어요.

    콩클리쉬로 페이징처리 관련 변수이름들만 계속 연발했었죠.

    '스따트페이지, 스따트페이지랑 안드페이지, 안드페이지를 이렇게.. ' (뭐 이런 식으로)


    금주 정보 공유시간에 zepinos님 페이징처리 관련 3개의 게시글을 나누려고 합니다.

    좋은 강의 감사합니다!

    0
  • 리제네아
    2016-11-08 10:46:31

    좋은 글 감사합니다.
    북마크 하고 자주 찾아뵙겠(?)습니다.

    0
  • dali high
    2017-03-24 14:43:23 작성 2017-03-24 14:46:58 수정됨

    좀 더 직관적인 방법은,

    총 페이지 수를 1씩 줄여가면서 페이지네이션을 하나씩 찍어준다고 생각하면 됩니다.

    그렇게하면 페이지네이션이 10일 때(1,2,3,4,..10 형태) 그냥 10번씩 반복문 돌되 중간에 totalPage가 0보다 크지 않으면(남은 페이지가 없는거니) break로 빠져나오면 됩니다. 반복문 빠져나왔을때 그 반복문 카운트가 10번을 다 안돌았으면(즉 break로 빠져나왔으면) 다음버튼을 안그리면 되겠죠. 이전버튼도 반복문들어가기 전에 앞에다 비슷한 방법으로 하고요.

    0
  • 천천히열심히
    24
    2017-08-22 14:23:21 작성 2017-08-22 14:23:50 수정됨

    안녕하세요.!

    아무리해봐도 궁금증을 해결하지 못하는 부분이 있습니다..

    if 문 안에 System.out.print() 이부분은 view단에서 어떻게 가져다 쓸수 있는것인가요??


    0
  • 리제네아
    2017-08-22 14:27:49

    천천히열심히

    간단합니다. String 변수에 누적누적 하신 후에

    addAttribute("str", str);

    등으로 보내주시고 jsp에서 받으시면 됩니다.

    0
  • zepinos
    18k
    2017-08-22 14:49:58

    천천히열심히 님 // 리제네아 님께서 말씀해 주신 것 처럼...response attribute 에 결과값들을 모아서 전송하면 됩니다. 요즘은 Bean 하나 만들어서 페이징에 필요한 totalCount, totalPage, page, listSize, ... 와 같은 값들을 한 번에 다 입력해서 보내주는 방법을 많이 쓰지만, 예전에는 아예 HTML 로 만들어서 toString() 만 호출하면 HTML 이 결과값으로 나오게도 해줬습니다. 요즘 안쓰는 이유는...부트스트랩 포함 많은 css 프레임워크나 html template 들이 다른 형식으로 깔끔하게 지원하는 경우가 많아서입니다.

    1
  • 천천히열심히
    24
    2017-08-22 15:21:40
    0
  • 파파퐈
    222
    2017-11-22 02:31:50

    정말 감사합니다!

    0
  • 마크쓰리
    799
    2017-11-24 15:42:37

    음..제가 이해를 못하는건지 모르겠습니다만..

    startpage를 구하는 공식에서 현재 페이지가 5 (page = 5) 한 화면에 보여질 페이지수가 10 (countpage=10)

    일때 ((page-1) / countpage) * countpage +1 을 하면 (4/10)*10 +1 의 계산결과로 5가 떨어지는데...

    1이라는 시작페이지를 어떻게 구한다는건지 모르겠습니다.

    0
  • zepinos
    18k
    2017-11-24 16:50:15

    마크쓰리 님 // 수학계산이 아니라 컴퓨터계산을 하셔야 합니다.


    https://okky.kr/article/282819?note=969385


    위 링크에도 언급했지만 엄밀히 말하면 저 공식은 "((int) (page / 10)) * 10 + 1" 와 동일합니다.

    수학에서는

    (4/10)*10+1 = 0.4*10+1 = 4+1 = 5

    가 되겠지만, 컴퓨터는

    (int)(4/10)*10+1 = 0*10+1 = 0+1 = 1

    이 됩니다. int 와 int 가 연산하면 int, 즉 정수로 계산되고 소수점은 버려집니다.

    0
  • 마크쓰리
    799
    2017-11-24 17:40:37 작성 2017-11-24 17:41:46 수정됨

    zepinos

    아..어쩐지 이클립스에서 하면 1이 나오고 계산기로 하면 5가 나와서..어리둥절해 하고 있었습니다. 그런 이유였군요!

    그렇다면 같은 조건에서 현재 페이지가 7일때도 같은 공식으로,

    (int)(7/10)*10+1 하게되면 시작 페이지는 1이되는데, 이것도 제가 잘못이해하고 있는것인지요??

    현재 페이지 7 보여질 페이지 수 10 이라면 시작3 끝 12가 되어야 할텐데요..

    끝페이지 구하는것은 확실하게 이해가 됬지만 시작페이지를 구하는게 제대로 들어오지 못하고 있네요 ㅠ


    0
  • zepinos
    18k
    2017-11-24 18:13:27
    저 공식에서 사용하는 방법은 한국에서 많이 사용하는 페이징 방식인데...10개씩 묶음으로 보여주는 방식입니다. 현재 페이지 기준으로 앞뒤로 몇 개씩 보여주는 서양에서 주로 쓰는 방식과는 다릅니다.

    즉, 1~10 페이지를 보고 있을 때에는 하단에 무조건 1~10 페이지의 정보만 보이고, 이전은 1, 다음은 11페이지입니다. 마지막은 총 수로 계산을 하지만 처음은 무조건 1페이지가 되는거죠.
    이 기준에 의해서 만약 13페이지를 조회한다면, 11~20 페이지가 무조건 노출되는 방식입니다. 다만, 총 페이지가 15 페이지까지만 있다면 11~15 로 조정하는 것이 필요하고, 그것도 설명되어 있습니다.


    0
  • 마크쓰리
    799
    2017-11-24 18:30:07

    zepinos

    아!

    말씀하신대로 13페이지를 조회하고 있다면 처음은 11, 마지막은 20이 고정이 된다는게 우리나라에서 많이 사용하는 방식이라는 말씀이시죠??

    이제야 왜 헷갈렸는지 알 듯 합니다. 좋은 글과 답변감사합니다.!


    0
  • 코드17
    112
    2017-12-17 19:04:35

    아직 초짜인 제게는 몇번봐도 정말 도움되는 글이라고 생각합니다. 정말 감사합니다. ( _ _)

    0
  • 오포야
    14
    2017-12-25 13:05:28

    너무 좋은 글 감사합니다!

    좋은 공부하고 okky사이트 가입하고 갑니다 __)

    0
  • 팡팡이와아이들
    422
    2018-05-10 17:38:12

    많이보고배웁니다 감사합니다..페이징이 어려워요..ㅠㅠ..

    0
  • 곧미남
    2
    2018-07-12 17:41:39

    공부하다 이 게시물을 보고 공부 하는데 참 설명이 잘되어 있어서 좋은글입니다. 열심히 공부하겠습니다.

    1
  • 벨제부브
    1k
    2018-08-06 10:18:45

    페이징공부하느거 지금 3일차인데 소스를 짰는데 이해가안가는게 있는데요

    start 페이지와 end페이지를 통해서 뒤에 sql문에서 구하게되는데

    1페이지에서는 1~10 2페이지에서는 11~20 이런식으로 들어가는데

    2페이지에서는 11~20이 숫자가 들어가야되는데

    int endPage = startPage + countPage - 1; 공식에 대입하면

    1 + 10(10개씩보여줌) -1 인데 10이되버립니다

    그래서 계속 1~10까지 로우넘이 붙은 페이지만 보여주게됩니다

    어떻게해야되는건가요

    몇번씩읽어봤는데 저는 이해를잘못하겠습니다.ㅠㅠ

    앞에 몇개와 DB는 읽고 잘짜서 그냥 디비 스크립트띄워놓고 치면 값은 잘나옵니다

    근데 이글을보고 알고리즘을짜서 값을 보내면 매번 1~10번까지나오고 잘안되네요 ㅠ


    0
  • zepinos
    18k
    2018-08-06 10:24:22

    countPage 는 한 번에 보여줄 페이지의 수를 의미합니다.


    즉, 내가 1~10 페이지 내에 있다면 10 개의 countPage 을 가지고 있다면 항상 1~10 페이지만 노출되고(1, 2,3, ... 이런 식으로) endPage 는 결국 현재 보여줄 페이지의 목록 중 마지막 페이지의 번호를 의미합니다. 이 목록 다음의 페이지에 대한 것은 별도로 계산해야 합니다. 더 아래 쪽에 "다음" 과 "끝" 으로 표시되는 계산 방법을 보시고, 다음의 경우 현재 페이지의 다음인데, 사람에 따라서는 다음 페이지를 현재 보여주는 페이지의 끝의 다음(endPage 다음 페이지)을 원하는 경우가 있습니다. 여기에 endPage + 1 로 링크걸면 됩니다.

    0
  • tokomon
    212
    2018-12-05 16:11:33

    안녕하세요

    페이징 생전 처음 해보는 신입 개발자 입니다 ! 

    글 잘 봤습니다 ㅠㅠ 덕분에 이해가 잘 되었습니다 

    막상 짜보려니 개념은 이해가 가는데 구조를 잘 모르겠어서 질문 드립니다 ㅠㅠ 

    System.out.print("<a href=\"?page=1\">처음</a>");

    이거 자체가 controller에서 page라고 매핑을 하는거죠?

    0
  • zepinos
    18k
    2018-12-05 16:15:22

    tokomon 님 // 해당 부분은 view 에 html 코드를 삽입하는 부분인데, 실제로는 아래와 같이 나올 겁니다.


    <a href="?page=1">처음</a>


    이렇게 할 경우 기존 URL, 예를 들면


    https://okky.kr/article/282819?note=1575650


    위와 같은 주소일 경우 ? 이전의 값(URI 라고 합니다)까지만 그대로 하고, ? 뒤의 내용은 새로 쓰는 형태가 됩니다. 그래서 위 주소로 접근했는데 위와 같이 ?page=1 로 적혀있는 링크가 있다면


    https://okky.kr/article/282819?page=1


    와 같은 경로로 이동하는 링크가 생기게 됩니다. 그래서 링크 눌러서 이동할 때에는 기존 매개변수 중 항상 가지고 다녀야할 것이 있다면 너 print() 안에 추가시켜주셔야 합니다.

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.