Clean Code that Works.


MSSQL이나 MYSQL은 자체 페이징 쿼리가 있어서
페이징이 쉽다.

오라클의 경우에는 보통 rownum을 사용하여 페이징을 처리 한다.
iBatis는 queryForList를 사용하여 리스트형태로 값을 가져 오는데.
여기서 시작값과 끝 값을 지정하여 페이징을 할 수도 있다.
하지만 이런 경우에는 일단 글을 다 긁어 온 다음에
메모리에서 해당 페이지 범위의 글을 가져온다.

이 방법의 경우 글이 작으면 상관이 없지만
글이 늘어 나면서 서버에 부하가 많이 걸린다.
하여튼 queryForList를 사용하여 페이징을 하지 않도록 주의 하고..(난 이걸로 해놨는데.. ㅠ_ㅠ.. 언제 바꿔)

오라클 쿼리를 사용해서 페이징을 처리 하도록 하자.
SELECT num, title, userid, writeday FROM (
   SELECT rownum AS rnum, num, title, userid, writeday
   FROM request
   WHERE userid = #userid#
  ) WHERE rnum BETWEEN #startNum# AND #endNum#
   ORDER BY num DESC

파라미터로 startNum 과 endNum을 넘겨 주면 해당 범위 안의 글을 가지고 온다.
<select id="getList" resultMap="articleListMap" parameterClass="java.util.HashMap" />
- iBatis 설정 파일.

이렇게 하여 지정 범위 안의 글을 가지고 온다.

이렇게 하여 가져온 파일을 게시판 리스트 밑에 페이징 하는 부분이 또 문제.
여기는 잘 생각하여 로직만 정리 하면된다.


if ( pageNum <= 5)
  {
   for ( int i = 0, end = pageModel.getTotalPage(); i < end; i++)
   {
    if ( i >= 10) break;
    pageList.add( i, i + 1 );
   }
  } else {
   for ( int i = pageNum - 5, j = 0; i < pageNum + 6; i++, j++)
   {
    if ( i == pageModel.getTotalPage()) break;
    pageList.add( j, i + 1);
   }
  }

난 위의 방법을 사용하여 처리하였다. 최대 10개씩 보여줄 수 있도록 티스토리 스타일 처럼
이것을 jsp에서 알맞게 보여 주도록 또 가공을 해야 한다.


<c:forEach var="list" items="${ pageModel.pageList }" varStatus="count">
     <c:if test="${ list == pageModel.pageNum }" >
      [<b><span id="movePage" onclick="movePage( this)">${ list }</span></b>]
     </c:if>
     <c:if test="${ list != pageModel.pageNum }" >
      <span id="movePage" onclick="movePage( this)">${ list }</span>
     </c:if>
    </c:forEach>

보통 내가 쓰는 방법.
페이지 로직을 정리 해놓지 않아서.
그때그때 머리를 쥐어 짜서 만드니..
어떤때는 코드가 늘었다가 줄었다가..
-_-;;
로직을 잘 정리하도록 하자.

아이구 머리야.

http://theeye.pe.kr/archive/20071111 님 블로그 펌글.
아..스트럿츠2 + 아이바티스 개발중..아니 공부중 =ㅁ=

==============================================================================================

iBatis를 사용하다 보니 또하나의 문제에 봉착했다.. LIKE 검색의 %기호를 인식하지 못하는 것이었다.

구글신에게 검색해 보고 다음과 같은 해결책을 얻을 수 있었다.

MySQL :
SELECT * FROM tbl_name WHERE column_name LIKE "%$username$%"


ORACLE :
SELECT * FROM tbl_name WHERE column_name LIKE  '%' || #username# || '%'


SYBASE/SQL SERVER
SELECT * from tbl_name WHERE column_name LIKE  '%' + #username# + '%'


여기서 변수명을 #로 둘러싸는 것과 $로 둘러싸는것의 차이점을 알 필요가 있다.

#의 경우에는 Prepare Statement로 등록이 된다. 디버그를 찍어봐도 ?로 치환된 이후 값이 대입된다.

하지만 $의 경우 바로 값이 치환된다. 특정 변수가 바로 DB에 입력되므로 보안에 좀더 신경을 써야 할것으로 생각된다.