0
 19   2   1
  View Articles

Name  
   손병목  (2003-08-16 15:33:27, Hit : 20087, Vote : 1610)
Homepage  
   http://www.itmembers.net
Subject  
   답변형 게시판 구현 원리 (1/2) TYPE 1
게시판을 통해 메일을 통해 답변형 게시판의 원리와 구현 방법에 대한 설명을 부탁하신 분들이 꽤 있습니다. 저 역시 답변형 게시판의 구현을 2차 PHP 게시판 프로젝트의 주요한 목표로 설정해 놓고도 시간이 없어 진행하지 못했는데요, 이번 연휴를 맞아 드디어 시작하게 되었습니다.
짝~짝~짝~~~~~~ (자축의 박수부터 치고…)



대개의 프로그래밍이 그러하듯이 원하는 기능을 구현하기 위한 방법은 다양합니다.
답변형 게시판도 예외는 아닙니다. 답변 기능을 구현하는 로직은 여러 가지가 있습니다. 나름대로의 장단점이 있구요.
두 시간에 걸쳐 답변 기능을 구현하는 두 가지 원리를 소개해 드리는데, 이번 시간에 그 중 하나를 설명하겠습니다.
원리를 설명하고 난 다음에 구체적인 실습을 하겠습니다.

답변 기능을 구현하기 위해 가장 먼저 어떤 게 필요할까요?
답변 글과 원 글과의 관계에 대한 규정이 필요합니다. 다시 말해, '이 글은 어느 글(= 원 글)의 답변 글이다'라는 걸 답변 글 어딘가에 기록해 둬야 한다는 겁니다.
그리고 또 하나, 이 글은 몇 단계(깊이)의 답변 글이냐 하는 것도 중요합니다. 원 글의 답변이 1단계라면, 그 답변의 답변은 2단계라고 할 수 있고, 이렇게 계속해서 '답변의 답변의 답변의 답변의 답변…'과 같은 식으로 확대될 수 있는 겁니다.
마지막으로 글 정렬 순서인데요, 이렇게 복잡하게 얽힌 글 목록을 원 글과 답변 글의 관계를 고려하여 보기 좋게 나열해야 하는 겁니다.

기본적인 원리는 위와 같지만 실제 구현하기 위한 방법에는 약간의 차이가 있습니다.
그 중 하나를 지금부터 설명드리죠.

새로 글을 작성할 때 그 글을 구분하는 유일한 식별자가 무엇이죠?
지금까지 우리는 number 라는 필드에 고유한 값을 자동으로 입력되도록 했습니다. 가장 기본이 되는 식별자입니다.
거기에 답변 기능을 구현하기 위해 3개의 필드를 추가합니다.
list_numberdepth, parent 등 세 개의 필드가 필요합니다.(항상 이런 건 아니구요, 다음 시간에 사용할 방법은 두 개의 필드만 필요합니다.)


이제 글을 하나씩 등록해 볼까요?

  1. 첫 번째 글을 등록할 경우



    모든 번호가 다 1입니다.
    이것만 봐서는 도저히 알 수가 없습니다.

  2. 두 번째 글을 등록할 경우



    number는 순서대로 늘어나기 때문에 2가 됩니다.
    list_number는 화면에서 보여주는 순서이기 때문에 나중에 등록된 글을 먼저 보여주기 위해 두 번째 등록한 글이 1이 되고, 첫 번째 글은 2가 됩니다.
    답변 글이 아니기 때문에 depth는 1이 됩니다.
    마찬가지로 답변 글이 아니기 때문에 parent는 원 글의 number와 동일한 2가 됩니다.

    이 정도만으로도 아하~ 하고 깨닫는 분이 분명 있을 겁니다.

  3. 두 번째 글에 답변 글을 작성할 경우



    number는 순서대로 늘어나기 때문에 3이 됩니다.
    list_number는 화면에서 보여주는 순서라고 했죠? 가장 위쪽에 두 번째 글을 보여주고, 그 아래에 두 번째 글의 답변 글, 가장 아래에 첫 번째 글이 보이겠죠?
    정리하면, 두 번째 글의 답변 글은, 두 번째 글의 list_number보다 큰 첫 번째 글의 list_number값을 1 증가시키고(=3), 자신은 원 글의 list_number에 1을 더합니다(=2). 원 글(두 번째 글)의 list_number값은 그대로 둡니다(=1).
    depth는 답변 글이기 때문에 2가 되고,
    parent에는 원 글의 번호(number)인 2가 저장됩니다.

  4. 세 번째 글을 등록할 경우



    number는 순서대로 늘어나기 때문에 4가 됩니다. 고유 번호이죠.
    list_number는 화면에서 보여주는 순서라고 했죠? 지금 쓴 글이 가장 위쪽에 배치되어야 하므로, 자신의 글은 1이 되고, 나머지 글의 list_number의 값은 모두 1씩 증가시킵니다.
    depth는 답변 글이 아니므로 1이 되고,
    parent에는 원 글의 번호, 즉 자신의 번호(number)인 4가 저장됩니다.

    마지막으로 하나의 예만 더 들어 볼까요?

  5. 첫 번째 글의 답변 글을 작성할 경우



    number는 순서대로 5.
    list_number는 첫 번째 글의 list_number(=4)보다 큰 list_number가 없으므로 나머지는 모두 그대로 두고, 자신만 첫 번째 글의 list_number에 1을 더하게 됩니다(=5).
    depth는 답변 글이므로 2가 되고, (만약 답변의 답변일 경우에는 depth가 3이 되겠죠.)
    parent에는 원 글의 번호 (number)인 1이 저장됩니다.

    자~ 다 되었습니다.
    이제 list_number를 기준으로 다시 정렬해 볼까요?



    이해가 되시나요?

그런데, 이렇게 게시판을 구현하려고 하면,
게시판을 처음 만들 때부터 이를 고려해서, 글이 저장될 때마다 자신 뿐만 아니라 다른 게시물의 list_number의 값도 수정해야 합니다. 게시물의 수가 엄청나게 많다면 이것도 보통 일은 아니겠죠? 또한 이곳 게시판 강좌를 꾸준히 따라하셔서 나름대로 게시판을 만들어 운영하고 있는 분이라면 매우 난감한 일이 아닐 수 없습니다.

답변 기능까지 구현된 게시판을 처음부터 새로 설계한다면 고려해 볼만한 방식입니다만, 저를 믿고 이 프로젝트를 순서대로 따라하신 분이라면 다음 시간에 설명드릴 방법으로 한번 해보시는 게 어떨까 생각합니다. (물론 각각의 장단점은 모두 있어 어느 것이 월등히 좋다고 말씀드릴 수는 없겠네요…)



가을 정취가 물씬 풍기는 주말 오후네요.
이상, 동주아빠 손병목이었습니다.

Prev
   [참고] 뽀~너스! 댓글(코멘트) 달기 구현 원리

손병목
Next
   게시판에 여러 개의 파일 첨부하기(2/2)

손병목


Copyright 1999-2021 Zeroboard / skin by Zetyx