[Oracle] DB로 게시판 표현하기(답글 게시판)
- 카테고리 없음
- 2020. 10. 28.
게시판 정렬할 때 가장 유심히 봐야 하는 컬럼은 BID(Primary Key) 입니다.
제가 만든 MVC_BOARD에서 유일하게 UNIQUE 속성을 지니고 있습니다.
게시판은 단순한 표 형태로 표시되어서 테이블로 표현하지만,
답글 기능이 있는 테이블은 계층형 구조 (트리 구조)에 가깝습니다.
MVC_BOARD 테이블의 컬럼 역할
CREATE TABLE MVC_BOARD(
BID NUMBER(4) PRIMARY KEY, -- 게시판 Primary Key
BNAME VARCHAR2(20), -- 작성자
BTITLE VARCHAR2(100), -- 글제목
BCONTENT VARCHAR2(300), -- 글 내용
BDATE DATE DEFAULT SYSDATE, -- 등록일자
BHIT NUMBER(4) DEFAULT 0, -- 조회수
BGROUP NUMBER(4), -- 트리구조 최상위(Root)
BSTEP NUMBER(4), -- 트리구조에서 자신의 상위 노드(Parent Node)
BINDENT NUMBER(4) -- 트리구조 노드의 레벨
);
BGROUP는 트리구조의 최상위 노드(ROOT)를 뜻합니다.
BSTEP는 트리구조의 자신의 부모 노드를 뜻 합니다.(Parent Node)
BIDENT는 트리구조의 레벨을 뜻 합니다.(Level)
각 노드는 Primary Key(bId) 로 지정이 되어 있습니다.
만약 위의 구조로 게시판을 만들고, 답변 달기 기능을 만든다면 이런 형태의 구조도가 됩니다.
게시판의 구조가 테이블 형태라서 일반 쿼리로 생각되지만
사실은 계층형 쿼리(트리 구조) 형태를 지녔습니다.
그리고 위의 MVC_BOARD TABLE은 계층형 쿼리 기준으로 만들어진 테이블입니다.
public void reply 메소드
위의 기준은 답변 달기를 눌렀을 때 작동하는 메소드 입니다.
그리고 request 값을 받는다면 이와 같은 구조가 됩니다.
Group는 일반 글쓰기 했을 때 bId = bGroup로 지정이 되어있습니다.
즉, 부모의 값이 저장이 된 컬럼입니다.
bStep는 부모로부터 클릭해서 받아온 bId가 있으므로, BSTEP 컬럼에게 값을 양도합니다.
bIndent는 답변의 기호이며, 계층형 구조에서는 레벨을 뜻합니다. 따라서 기존의 bIndent를 +1을 해줍니다.
List 출력 SQL (중요)
SELECT * FROM MVC_BOARD
START WITH BINDENT=0
CONNECT BY PRIOR BID = BSTEP
ORDER SIBLINGS BY BGROUP DESC;
그리고 게시판 List를 전체 출력을 할 때는 이와 같이 SQL을 작성하면 됩니다.
육안으로는 일반 쿼리이지만, 결국 계층형 쿼리이기 때문에 그에 맞게 SQL을 작성해야 합니다.
그러면 List 게시판을 정렬할 때,
BGROUP와 BSTEP, BINDENT가 원하는 형태로 규칙적으로 정렬되는 것을 확인할 수 있습니다.