게시판에 작성된 게시글을 클릭해서 상세한 내용을 볼 때 하단에 다음글과 이전글에 대한 정보가 있는 케이스를 접하기 쉽다.
테이블 자체에 시퀀스에 대한 컬럼으로 제어하는 것이 좋지만 게시글이 삭제되면 시퀀스로 제어가 어려워진다.
그래서 찾게 된 방법에는 아래의 두 가지 방법이 있었다.
- ROWNUM 활용
- LAG, LEAD 함수 활용
ROWNUM은 게시판의 리스트 정보를 프론트 단에 넘겨줄 때 부터 ROWNUM에 대한 정보를 전달하고 상세 보기를 진행할 때 해당 ROWNUM 값을 전달 받아서 처리하는 방법이다.
SELECT
ROWNUM AS rnum,
BOARD_ID,
TITLE,
CRE_TIME,
CRE_ID
FROM EXAMPLE_TABLE
ORDER BY BOARD_ID
이런 식으로 조회를 진행하고 rnum에 대한 정보를 수신한 후에 실행하는 쿼리에는
SELECT * FROM (
SELECT
ROWNUM AS rnum,
BOARD_ID,
TITLE,
CRE_TIME,
CRE_ID
FROM EXAMPLE_TABLE
) A
WHERE A.rnum BETWEEN (ROWNUM - 1) AND (ROWNUM + 1)
SELECT
*
FROM
(SELECT
LAG(BOARD_SEQ, 1) OVER(ORDER BY BOARD_SEQ) AS BF_SEQ,
LAG(SUBJECT, 1) OVER(ORDER BY BOARD_SEQ) AS BF_SUBJECT,
LAG(CRE_DTM, 1) OVER(ORDER BY BOARD_SEQ) AS BF_CRE_DTM,
BOARD_SEQ,
LEAD(BOARD_SEQ, 1) OVER(ORDER BY BOARD_SEQ) AS AFT_SEQ,
LEAD(SUBJECT, 1) OVER(ORDER BY BOARD_SEQ) AS AFT_SUBJECT,
LEAD(CRE_DTM, 1) OVER(ORDER BY BOARD_SEQ) AS AFT_CRE_DTM
FROM TBC_BOARD_I
WHERE 1 = 1
AND USE_YN = 'Y'
AND DEL_YN = 'N'
AND BOARD_LVL = 0
AND BOARD_ID = #{보드ID}) A
WHERE
A.BOARD_SEQ = #{시퀀스값}
위와 같이 LAG, LEAD 함수를 사용해 쿼리를 구성하면 가변적인 ROWNUM 값을 받아 처리하지 않고 값을 전달 받아 처리가 가능하다
LAG(컬럼[, 오프셋]) : 이전 값 OVER(ORDER BY 기준이 될 컬럼)
LEAD(컬럼[, 오프셋]) : 다음 값 OVER(ORDER BY 기준이 될 컬럼)
OVER 함수 안에는 PARTITION BY 키워드를 활용할 수도 있다.