공부/알고리즘(Algorithm)

게시판 - 페이징 구현

도도-도윤 2017. 10. 31. 18:41

게시판 - 페이징 구현


먼저 용어가 혼선될 수 있는데, 운영체제 개론에서도 "페이징"이라는 이야기가 나옵니다.

다른 이야기입니다.

지금 다루는 알고리즘은 게시판 등에 사용되는 페이징 알고리즘에 대해서 소개합니다.

게시판에 보면, 하단에 페이지를 선택하는 영역이 있습니다.



 게시판의 큰 구조


171031 - 게시판 디자인.pptx


Pager 영역이라고 불리는 페이징 알고리즘을 구현하는 로직에 대해서 소개합니다.



1. 구현을 위한 아이디어 작성하기


스프레드시트 등의 프로그램을 통해서 게시판 로직을 실험해볼 수 있습니다.




 페이징 구현






2. 실험하기

종이에 그려볼 수도 있으며 이처럼 실험을 해볼 수도 있습니다.




 실험의 예


페이징설계.xlsx




 스프레드시트 - 실험의 예


171031_board_pager.zip




3. 코드 

페이저 구현 소스코드입니다.


Pager - jsp(JAVA).zip


 package web.pager;

 import java.util.ArrayList;
 import java.util.List;

 

 public class Pager {

          private int page;
          private int countList;
          private int countPage;
          private int totalCount;
          private int totalPage;
 
          private int startPage;
          private int endPage;
 
          public Pager(int page, int totalCount, int countList, int countPage) {
  
                    this.page = page;
                    this.totalCount = totalCount;
                    this.countList = countList;
                    this.countPage = countPage;
  
                    make();
          }
 
          public int getPage() {
                    return page;
          }

          public void setPage(int page) {
                    this.page = page;
          }

          public int getCountList() {
                    return countList;
          }

          public void setCountList(int countList) {
                    this.countList = countList;
          }

          public int getCountPage() {
                    return countPage;
          }

          public void setCountPage(int countPage) {
                    this.countPage = countPage;
          }

          public int getTotalCount() {
                    return totalCount;
          }

          public void setTotalCount(int totalCount) {
                    this.totalCount = totalCount;
          }

        // 핵심 로직

          private void make() {
  
                    totalPage = totalCount / countList;

                    

                    // % 표기 -> 스프레드시트 MOD함수로 사용됨.

                    if (totalCount % countList > 0) {
                          totalPage++;
                    }

                    if (totalPage < page) {
                          page = totalPage;
                    }

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

                   // 소수점이 0으로 처리됨. (자료형의 <Cast>형 변환) -> 스프레드시트 참조
                   endPage = startPage + countPage - 1;

                

                   if (endPage > totalPage) {
                          endPage = totalPage;
                   }
  
         
 
         public String first() {

                   if (startPage > 1) {
                       System.out.println( "처음" );
                       return "<a href=\"?page=1\">처음</a>";
                   }
                   else
                       return "";
         }
 
         public String prev() {
  
                  if (page > 1) {
                          return "<a href=\"?page=" + (page - 1)  + "\">이전</a>";
                  }else
                          return "";
          }
 
          public List<String> getPager() {
  
                   List<String> list = new ArrayList<String>();
  
                   for (int iCount = startPage; iCount <= endPage; iCount++) {
   
                          if (iCount == page) {
                          // System.out.print(" <b>" + iCount + "</b>");
                                     list.add( new String( " <b>" + iCount + "</b>" ) );
                          } else {
                                     list.add( new String( " " + iCount + " " ) );
                                     //System.out.print(" " + iCount + " ");
                          }
      
                  }
  
                  return list;
           }
 
           public String next() {

                  if (page < totalPage) {
                       return "<a href=\"?page=" + (page + 1)  + "\">다음</a>";
                       //System.out.println("<a href=\"?page=" + (page + 1)  + "\">다음</a>");
                 }else
                       return "";
           }
 
           public String last() {
                 if (endPage < totalPage) {
                       return "<a href=\"?page=" + totalPage + "\">끝</a>";
                       //System.out.print("<a href=\"?page=" + totalPage + "\">끝</a>");
                 }else
                       return "";
            }
 }

 소스코드 - Pager.java


  


 Java - Pager 영상


171031_javaPager.zip / 영상



  using System;

 namespace ConsoleApp1
 {
         class Program
         {
                   static void Main(string[] args)
                   {

                        int page = 1;
                        int countList = 15;
                        int countPage = 15;

                        int totalCount = 449;


                        int totalPage = totalCount / countList;


                   if (totalCount % countList > 0)
                   {
                        totalPage++;
                   }

                   if (totalPage < page)
                   {
                        page = totalPage;
                   }

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

                   // 실험을 해본 결과로는 / 10으로 해도 되고, ((page - 1) / countList ) * countPage + 1

                   // 이렇게 해도 무방함. - 숫자 10이 표현하는 것에 대해서 보충.


                   int endPage = startPage + countPage - 1;

            
                   if (endPage > totalPage)
                   {
                        endPage = totalPage;
                   }


                        if (startPage > 1)
                        {

                            Console.Write("<a href=\"?page=1\">처음</a>");
                        }

                        if (page > 1)
                        {
                            Console.WriteLine("<a href=\"?page=" + (page - 1) + "\">이전</a>");
                        }

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

                            if (iCount == page)
                            {
                                Console.Write(" <b>" + iCount + "</b>");
                            }
                            else
                            {
                                Console.Write(" " + iCount + " ");
                            }
                        }

                        if (page < totalPage)
                        {
                            Console.WriteLine("<a href=\"?page=" + (page + 1) + "\">다음</a>");
                        }

                        //System.out.println(endPage + "야" + totalPage);


                        if (endPage < totalPage)
                        {
                            Console.Write("<a href=\"?page=" + totalPage + "\">끝</a>");
                        }

    

                    }
          }
 }

 c# - Program.cs


Pager-C#.zip




 c# - Pager 영상


171031_csharpPager.zip / 영상




4. 참고 자료

1. "페이징(Paging)에 대한 이해 - (1) 페이지 번호를 생성하자.", https://okky.kr/article/282819, zepinos님


Pager - jsp(JAVA).zip
0.0MB
페이징설계.xlsx
0.01MB
171031_board_pager.zip
0.4MB
171031_csharpPager.zip
4.96MB
171031 - 게시판 디자인.pptx
0.07MB
171031_javaPager.zip
1.13MB
Pager-C#.zip
0.0MB

'공부 > 알고리즘(Algorithm)' 카테고리의 다른 글

알고리즘 - 정렬(Sorting)  (0) 2017.10.01