------------------------------------------------------------------

지난 시간에는 게시판 테이블에 레코드가 삽입되는 로직에 대해서 알아 보았습니다.
이번 시간에는 list 페이지에 필요한 asp 코드들을 대략 살펴보겠습니다.

---------------------------------------------------------------------

지난 강좌를 보셔서 아시겠지만 현재 테이블은 ref의 역순이 그 글이 보여지는 순서가 됩니다.

페이징은 간단하게 처리할 수 있겠습니다.

우리가 원하는 글의 ref 만을 불러오면 되는 거죠!

(사실 이 방법을 쓰기 전까지
select top * ... 과 rs.move 를 이용한 게시판이 그나마 젤 나은 성능을 보였습니다.)

원하는 글의 ref 불러오는 방법은..

SELECT [컬럼1], [컬럼2], ....  FROM [테이블] ref BETWEEN [가장아래에보여줄글번호의ref] AND [가장위에보여줄글번호의ref]
ORDER BY ref DESC

가 되겠습니다.
간단하지 않습니까?
"ORDER BY ref DESC"에 의한 속도 저하는 없다고 보시면 됩니다.
제가 알기로는 ref에 걸린 index로 인해 쿼리최적화기기가 무시하게 되는듯 합니다.
(즉 ORDER BY 이하를 생략하더라도 글 순서는 변하지 않습니다. index를 DESC로 만들어준 이유가 거기에 있는거죠..)

이 방법으로 인해 우리는 페이지 값에 상관없이 언제나 동일한 페이징 속도를 낼 수가 있게 되는 거심니다!

그럼 우리가 해야 할 일은
시작ref와 끝ref 만 구해주면 되겠습니다.

자, 답은 다음과 같습니다.

start_num = record_count - (page - 1) * record_size
end_num = start_num - record_size + 1

start_num : 시작번호
end_num : 끝번호
record_count : 레코드 수이면서 가장 최상위글의 ref 입니다.
record_size : 한 페이지에 보여줄 게시물의 수
page : 현재 페이지 번호

record_count 는 지난번에도 말씀드렸듯이

SELECT TOP 1 ref FROM t3

으로 구하시면 되겠지만, 중간에 레코드를 삭제하여 이빨이 빠져있으면 안됩니다.
그러면 최상위 ref = 레코드 수 라는 법칙이 깨져버리기 때문입니다.

굳이 레코드를 삭제하고 싶으시면 ref를 적절히 변경해 주셔야 하겠죠?
- 지우고자 하는 글의 ref를 기억한다음
- 일단 레코드를 지우고
- 지운 글의 ref 보다 큰 ref를 가지는 레코드들의 ref를 1씩 빼주시면 됩니다.

하지만 답변형 게시판에서의 삭제 로직은 레코드 삭제를 대부분 비추하는 형태이죠..
답변글의 부모글이 지워지는 경우 화면 구성이 이상하게 될 수도 있겠죠..


record_size 는 원하는 값으로 아무 값이나 주시면 되겠죠..

시작ref와 끝ref 를 다 구했으면
위에 설명한대로 원하는 레코드만 샤악~ 불러오면 됩니다!

sql = "SELECT seq, title, name, writeday, readnum, depth FROM t3 WHERE ref BETWEEN " & end_num & " AND " & start_num & " ORDER BY ref DESC"
rs.Open sql, dbcon, adOpenForwardOnly, adLockReadOnly, adCmdText

보다 나은 속도를 위해 CURSORTYPE, LOCKTYPE, OPTION을 명시해 주시면 되겠습니다.
주의할 점은 start_num 과 end_num 의 위치입니다.!! 꼭 순서에 주의해 주시기 바랍니다.
순서 바꾸고 제대로 안나온다고 저한테 돌던지지 마세요 ^^*

참고로 총 페이지 수(page_count)는

page_count = int(record_count / record_size)
if (page_count * record_size) <> record_count then page_count = page_count + 1

와 같이 구하시면 되겠습니다.




다음시간에는 write, reply 에 대해서 알아보겠습니다.
감사합니다.





===============================
이성근 (rainn@rainn.pe.kr)
Soongsil Univ. Computer Science '95
(주)산그림닷컴
===============================

+ Recent posts