* ȸ¿ø°¡ÀÔ * ¾ÆÀ̵ð/ºñ¹Ð¹øÈ£ ã±â   ID PW
Last Modified : 2008.10.28

ÆäÀÌÁö ºÐÇÒ ±â´É

ÆäÀÌÁö ºÐÇÒ ±â´ÉÀ̶õ?

¸ñ·ÏÀ» º¸¿©ÁÖ´Â list.jsp ¸¦ ¿©·¯ ÆäÀÌÁö·Î ³ª´©¾î º¸¿©ÁÖ´Â ±â´ÉÀÔ´Ï´Ù.
°Ô½ÃÆÇÀÇ ·¹Äڵ尡 600 °³¶ó¸é ¸ñ·ÏÀ» º¸¿©ÁÖ´Â list.jsp ¾È¿¡¼­ while ¹®ÀÌ 600¹ø ½ÇÇàµÇ¾î¾ß ÇÕ´Ï´Ù.
·¹Äڵ尡 600 ÀÌ ¾Æ´Ï¶ó 60,000, 600,000 À̶ó¸é ¹®Á¦´Â ½É°¢ÇØÁý´Ï´Ù.
ÀÌ ¹®Á¦´Â ¸ñ·ÏÀ» ¿©·¯ ÆäÀÌÁö·Î ³ª´©¸é º¸¿©ÁÖ¸é ÇØ°áµË´Ï´Ù.
¿©±â¼­´Â À̰ÍÀ» "ÆäÀÌÁö ºÐÇÒ ±â´É" À̶ó°í À̸§À» ºÙÀ̰ڽÀ´Ï´Ù.
Å×½ºÆ®¸¦ À§ÇØ ±âÁ¸¿¡ Àμ­Æ®ÇÑ ·¹Äڵ带 ¸ðµÎ »èÁ¦ÇÑ ÈÄ, ´ÙÀ½ ÆÄÀϸ¦ ÀÌ¿ëÇØ¼­ board Å×ÀÌºí¿¡ Å×½ºÆ®¸¦ À§ÇÑ ·¹Äڵ带 »ðÀÔÇÕ´Ï´Ù. Å×½ºÆ®ÆÄÀÏ

·¹Äڵ带 ±×·ìÀ¸·Î ¹­±â À§ÇÑ SQL

´ÙÀ½ SQL¹®Àº ÆäÀÌÁö ºÐÇÒ ±â´ÉÀ» À§ÇÑ ÇÙ½ÉÀûÀÎ ¿ªÇÒÀ» ÇÏ´Â ¿À¶óŬ SELECT ¹®À¸·Î, Á¤·ÄµÈ ·¹Äڵ带 Â÷·Ê·Î 10°³¾¿ ¹­¾î ±×·ìÈ­ ÇÒ ¶§ ù¹øÂ° ±×·ìÀ» º¸¿©ÁÖ±â À§ÇÑ SQL¹®ÀÔ´Ï´Ù.

·¹ÄÚµå ±×·ì 1 ¿¡ ÇØ´çÇÏ´Â ·¹Äڵ带 fetch ÇÏ´Â SQL¹®

SELECT boardno,title,wdate FROM (
	SELECT ROWNUM R, A.* FROM (select boardno, title, wdate
		FROM board ORDER BY boardno DESC) A)
WHERE R BETWEEN 1 and 10;

·¹ÄÚµå ±×·ì 2 ¿¡ ÇØ´çÇÏ´Â ·¹Äڵ带 fetch ÇÏ´Â SQL¹®

SELECT boardno,title,wdate FROM (
	SELECT ROWNUM R, A.* FROM (select boardno, title, wdate
		FROM board ORDER BY boardno DESC) A)
WHERE R BETWEEN 11 and 20;

·¹ÄÚµå ±×·ì 3 ¿¡ ÇØ´çÇÏ´Â ·¹Äڵ带 fetch ÇÏ´Â SQL¹®

SELECT boardno,title,wdate FROM (
	SELECT ROWNUM R, A.* FROM (select boardno, title, wdate
		FROM board ORDER BY boardno DESC) A)
WHERE R BETWEEN 21 and 30;

¿©±â¼­ ROWNUM Àº SELECT ¹®Àå¿¡ ´ëÇØ¼­ ¿À¶óŬÀÇ °¡»ó Ä÷³À¸·Î 1ºÎÅÍ ¼øÂ÷ÀûÀ¸·Î ºÙ¿©Áý´Ï´Ù.
WHERE Àý¿¡¼­ ROWNUM À» ÀÌ¿ëÇÏ¿© º¸¿©ÁÙ ·¹Äڵ带 ±×·ìº°·Î ÃßÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.
list.jsp ¸¦ ¿äûÇÒ ¶§ µ¿½Ã¿¡ ±×·ì¹øÈ£¸¦ ÆÄ¶ó¹ÌÅÍ·Î ³Ñ°ÜÁØ´Ù¸é ±×·ì¿¡ ÇØ´çÇÏ´Â ½ÃÀÛ ·¹ÄÚµå¹øÈ£¿Í ¸¶Áö¸· ·¹ÄÚµå ¹øÈ£¸¦ ±¸ÇÒ ¼ö ÀÖ½À´Ï´Ù.
list.jsp ¿¡ Àü´ÞÇÒ ·¹ÄÚµå ±×·ì¹øÈ£¿¡ ÇØ´çÇÏ´Â ÆÄ¶ó¹ÌÅ͸¦ curPage,
list.jsp ¼Ò½º Äڵ峻¿¡¼­ ·¹ÄÚµå ±×·ì¹øÈ£¸¦ ÀúÀåÇÏ´Â º¯¼ö ¿ª½Ã curPage ·Î ÇÑ´Ù¸é ÆäÀÌÁö ºÐÇÒ ±â´ÉÀ» ¾Æ·¡Ã³·³ ±¸Çö ÇÒ ¼ö ÀÖ½À´Ï´Ù.

list.jsp

int curPage = (request.getParameter("curPage") == null) ? 1 : 
Integer.parseInt(request.getParameter("curPage"));

// ½ÃÀÛ ·¹ÄÚµå °è»ê  
int start = (curPage - 1) * 10 + 1;

// ¸¶Áö¸· ·¹ÄÚµå °è»ê
int end = start + 10 -1;

// ÇØ´ç ÆäÀÌÁöÀÇ ·¹ÄÚµå ¼ÂÀ» ±¸ÇÑ ÈÄ Ãâ·ÂÇÕ´Ï´Ù.
...
sql = "SELECT boardno,title,wdate FROM( " + 
          "SELECT ROWNUM R, A.* FROM( select boardno, title, wdate " +
          "FROM board ORDER BY boardno DESC) A) " + 
      "WHERE R BETWEEN " + start + " and " + end;
...

ÀÌÁ¦ ¿ì¸®´Â list.jsp?curPage=1 °ú °°ÀÌ ¹æ¹®Çϸé 10°³¾¿ ·¹Äڵ带 º¼ ¼ö ÀÖ°Ô µÇ¾ú½À´Ï´Ù.
ÇÏÁö¸¸ ÀÌ·¸°Ô »ç¿ëÀÚ°¡ ÁÖ¼Òâ¿¡ ÀÏÀÏÈ÷ Ãİ¡¸ç ¹æ¹®ÇÏ´Â °Ô½ÃÆÇÀº ¾ø½À´Ï´Ù.
ÀϹÝÀûÀÎ °Ô½ÃÆÇÀº °Ô½Ã±Û ¾Æ·¡ ÆäÀÌÁö¸¦ Á÷Á¢ À̵¿ÇÒ ¼ö ÀÖ´Â ¸µÅ©¸¦ Á¦°øÇÕ´Ï´Ù.
<a href="list.jsp?curPage=1">[1]</a>
±×·±µ¥ ÆäÀÌÁö°¡ ¾ó¸¶³ª »ý±æ °ÍÀÎÁö¸¦ °è»êÇÏ´Â ·ÎÁ÷ÀÌ ÀÖ¾î¾ß ÇÒ °Í °°½À´Ï´Ù.
À§¿¡¼­ "·¹ÄÚµå ±×·ì" °ú ¿©±â¼­ ¾ð±ÞÇÏ´Â ÆäÀÌÁö´Â °°Àº ÀǹÌÀÔ´Ï´Ù.
ÃÑ ÆäÀÌÁö¸¦ ¾È´Ù¸é ÃÑ ÆäÀÌÁö¸¸Å­ ·çÇÁ ¹®À» µ¹·Á <a href="list.jsp?curPage=1">[1]</a> °ú °°Àº ÆäÀÌÁö Á÷Á¢ À̵¿ ¸µÅ©¸¦ ¸¶Áö¸· ÆäÀÌÁö±îÁö ¸¸µé¾î Á¦°øÇØ ÁÙ ¼ö ÀÖ½À´Ï´Ù.
ÃÑ ÆäÀÌÁö¸¦ ±¸ÇÏ´Â ¹æ¹ýÀº ÃÑ ·¹ÄÚµå ¼ö¸¦ ÅëÇØ¼­ ±¸ÇÒ ¼ö ÀÖ½À´Ï´Ù.

totalRecord

int totalRecord = 0;
String sql = "select count(*) cnt from board";
...

ÃÑ ·¹ÄÚµå ¼ö¸¦ ±¸Çß´Ù¸é, ¾Æ·¡ ÄÚµåÁ¶°¢À» ÀÌ¿ëÇØ¼­ ÃÑ ÆäÀÌÁö ¼ö¸¦ ±¸ÇÒ ¼ö ÀÖ½À´Ï´Ù.

totalPage

int totalPage = 0;
if ( totalRecord != 0 ) {
  if (( totalRecord % 10 ) == 0 ) {
    totalPage = ( totalRecord / 10 );
  } else {
    totalPage = ( totalRecord / 10 + 1);
  }	
}

ÀÌÁ¦´Â ÃÑ ÆäÀÌÁö ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÆäÀÌÁö Á÷Á¢ À̵¿ ¸µÅ©¸¦ Á¦°øÇÒ ¼ö ÀÖ´Â Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.

page direct link

<%
for ( int i = 1; i<=totalPage; i++ ) {
%>
   <a href="list.jsp?curPage=<%=i%>">[<%=i%>]</a>
<%
} // for statment end
%>

ÆäÀÌÁö´ç º¸ÀÏ ·¹ÄÚµå ¼ö¸¦ ÀúÀåÇÒ º¯¼ö¸¦ numPerPage ¶ó°í ÇÏ°í °¢ ÆäÀÌÁöÀÇ ½ÃÀÛ ·¹ÄÚµå ¹øÈ£¿Í ¸¶Áö¸· ·¹ÄÚµå ¹øÈ£¸¦ ±¸ÇÏ´Â ÄÚµå´Â ¾Æ·¡¿Í °°ÀÌ ¼öÁ¤ÇÕ´Ï´Ù.

int numPerPage = 10;

// ½ÃÀÛ ·¹ÄÚµå °è»ê  
int start = ( curPage - 1 ) * numPerPage + 1;

// ¸¶Áö¸· ·¹ÄÚµå °è»ê
int end = start + numPerPage - 1;

ÃÑ ÆäÀÌÁö ±¸ÇÏ´Â ÄÚµå ¿ª½Ã ¾Æ·¡¿Í °°ÀÌ º¯°æµÇ¾î¾ß ÇÕ´Ï´Ù.

totalPage

int totalPage = 0;
if ( totalRecord != 0 ) {
  if ( ( totalRecord % numPerPage ) == 0 ) {
    totalPage = ( totalRecord / numPerPage );
  } else {
    totalPage = ( totalRecord / numPerPage + 1 );
  }	
}

´ÙÀ½Àº ÀÌÁ¦±îÁö ±¸ÇöÇÑ ÆäÀÌÁö ºÐÇÒ ±â´É ¾Ë°í¸®ÁòÀ» Á¤¸®ÇÑ °ÍÀÔ´Ï´Ù.

ÆäÀÌÁö ºÐÇÒ ¾Ë°í¸®Áò

  1. ÃÑ ·¹ÄÚµå ¼ö¸¦ ±¸ÇÑ´Ù.
  2. ÇÑ ÆäÀÌÁö´ç º¸ÀÏ ·¹ÄÚµå ¼ö¸¦ °áÁ¤Çϰí, ÃÑÆäÀÌÁö ¼ö¸¦ ±¸ÇÑ´Ù.
  3. ù¹øÂ° ·¹ÄÚµå ¹øÈ£¿Í ¸¶Áö¸· ·¹ÄÚµå ¹øÈ£¸¦ ±¸ÇÏ¿© Ãâ·ÂÇÑ´Ù.
  4. °¢ ÆäÀÌÁö¿¡ ´ëÇÑ Á÷Á¢ À̵¿ ¸µÅ©¸¦ ¸¸µç´Ù.

À§ ¾Ë°í¸®ÁòÀ» ±âÁ¸ÀÇ list.jsp ÆÄÀÏ¿¡ Àû¿ëÇÏ¿© °»½ÅÇÕ´Ï´Ù.

list.jsp

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.sql.*,net.java_school.util.*,net.java_school.db.dbpool.*" %>
<jsp:useBean id="dbmgr" scope="application"
class="net.java_school.db.dbpool.OracleConnectionManager" />
<html>
<body>
<%
  Log log = new Log();
  Connection con = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  String sql = null;

  //1. ÃÑ ·¹ÄÚµå ¼ö¸¦ ±¸ÇÑ´Ù.
  int totalRecord = 0; //ÃÑ µ¥ÀÌÅÍ °³¼ö¸¦ ÀúÀåÇÒ º¯¼ö
  
  try {
    con = dbmgr.getConnection();
    sql = "select count(*) cnt from board";
    pstmt = conn.prepareStatement( sql );
    rs = pstmt.executeQuery();
    rs.next();
    totalRecord = rs.getInt(1);
  } catch ( SQLException e ) {
  } finally {
    try {
      rs.close();
      pstmt.close();
      dbmgr.freeConnection( con );
      //log.close();·Î±×ÆÄÀÏÀÇ ÆÄÀÏ Ãâ·Â ½ºÆ®¸²À» ¹ÝȯÇÏÁö ¾Ê´Â´Ù.
    } catch ( SQLException e ) {}
  }

  //2. ÇÑ ÆäÀÌÁö´ç º¸ÀÏ ·¹ÄÚµå ¼ö¸¦ °áÁ¤Çϰí, ÃÑ ÆäÀÌÁö ¼ö¸¦ ±¸ÇÑ´Ù.
  int numPerPage = 10; // ÇÑ ÆäÀÌÁö´ç º¸ÀÏ ·¹ÄÚµå ¼ö °áÁ¤
  int totalPage = 0;  //ÃÑ ÆäÀÌÁö¼ö¸¦ ÀúÀåÇÒ º¯¼ö
  if ( totalRecord != 0 ) {
    if ( ( totalRecord % numPerPage ) == 0 ) {
      totalPage = ( totalRecord / numPerPage );
    } else {
      totalPage = (totalRecord / numPerPage + 1 );
    }
  }
  
  //3. ù¹øÂ° ·¹ÄÚµå ¹øÈ£¿Í ¸¶Áö¸· ·¹ÄÚµå ¹øÈ£¸¦ ±¸Çϰí Ãâ·ÂÇÑ´Ù.
  int curPage = (request.getParameter("curPage") == null) ? 1 :
  Integer.parseInt(request.getParameter("curPage"));

  // ½ÃÀÛ ·¹ÄÚµå °è»ê .....
  int start = ( curPage - 1 ) * numPerPage + 1;

  // ¸¶Áö¸· ·¹ÄÚµå °è»ê .....
  int end = start + numPerPage - 1;

  // ÇØ´ç ÆäÀÌÁöÀÇ ·¹ÄÚµå ¼ÂÀ» ±¸ÇÑ ÈÄ Ãâ·ÂÇÕ´Ï´Ù.
  try {
    con = dbmgr.getConnection();
    sql = "SELECT boardno,title,wdate FROM(" +
              "SELECT ROWNUM R, A.* FROM(" + 
                "SELECT boardno, title, wdate FROM board ORDER BY boardno DESC) A) " + 
            "WHERE R BETWEEN ? and ?";
            
    pstmt = con.prepareStatement( sql );
    pstmt.setInt(1, start);
    pstmt.setInt(2, end);
    rs = pstmt.executeQuery();
    
    while ( rs.next() ) {
      int boardno = rs.getInt( "boardno" );
      String title = rs.getString( "title" );
      Date wdate = rs.getDate( "wdate" );
%>
  <a href="view.jsp?boardno=<%=boardno%>&curPage=<%=curPage%>"><%=title%></a>
    <%= wdate.toString() %><br>
<%
    } //while ¹® ³¡
  } catch ( SQLException e ) {
    log.debug( "Error Source:list.jsp : SQLException" );
    log.debug( "SQLState : " + e.getSQLState() );
    log.debug( "Message : " + e.getMessage() );
    log.debug( "Oracle Error Code : " + e.getErrorCode() );
    log.debug( "sql : " + sql );
  } finally {
    try {
      rs.close();
      pstmt.close();
      dbmgr.freeConnection( con );
      log.close();
    } catch ( SQLException e ) {}
  }
%>
<br>
<%

// 4. °¢ ÆäÀÌÁö¿¡ ´ëÇÑ Á÷Á¢ À̵¿ ¸µÅ©¸¦ ¸¸µç´Ù.
for ( int i = 1;i <= totalPage;i++ ) {
%>
    <a href="list.jsp?curPage=<%= i %>"><%= i %></a>
<%
}
%>
<br>
<p>
<a href="write_form.jsp?curPage=<%=curPage%>">»õ±Û ¾²±â</a>
</body>
</html>

JSP ÆäÀÌÁö¿¡¼­´Â ¿Ö page ¶õ º¯¼ö¸¦ ¸¸µéÁö ¸øÇϴ°¡?

JSP ¿¡¼­´Â page ¶ó´Â ·¹ÆÛ·±½º°¡ ÀÌ¹Ì ¼±¾ðµÇ¾î ÀÖ½À´Ï´Ù.
Object page = this;
µû¶ó¼­ page ¶õ À̸§À¸·Î º¯¼ö¸¦ ¸¸µéÁö ¸øÇÕ´Ï´Ù.