Oracle 메뉴 트리 정렬: ORDER BY가 아닌 CONNECT BY
문제: 메뉴 정렬이 깨지는 이유
메뉴 데이터를 정렬할 때 다음과 같은 쿼리를 흔히 사용합니다.
ORDER BY MENU_DPTH, DISP_PRIR_SEQ
하지만 이 방식은 트리 구조를 보장하지 못합니다.
부모와 자식 관계가 있는 데이터에서 단순 정렬은 구조를 무시하기 때문입니다.
환경
- Oracle DB
- 메뉴 테이블 (부모: HGRK_MENU_NO, 자식: MENU_NO)
- 최상위 메뉴: HGRK_MENU_NO = 0
근본 원인
ORDER BY는 데이터 간 관계를 이해하지 못합니다.
예를 들어:
10 (부모)
20 (부모)
11 (10의 자식)
21 (20의 자식)
정렬 결과:
10
20
11 ❌
21
자식이 부모 아래로 붙지 않습니다.
해결 방법: CONNECT BY
Oracle에서는 계층 구조를 위해 CONNECT BY를 사용합니다.
SELECT
M.MENU_NO
, M.MENU_NM
, M.HGRK_MENU_NO
, LEVEL
FROM TCOMM_MENU_INF M
START WITH M.HGRK_MENU_NO = 0
CONNECT BY PRIOR M.MENU_NO = M.HGRK_MENU_NO
ORDER SIBLINGS BY M.DISP_PRIR_SEQ;
-- English comment
-- Build hierarchy and keep sibling order
왜 CONNECT BY가 필요한가
CONNECT BY는 단순 정렬이 아니라:
- 부모 → 자식 관계를 따라감
- 트리 구조를 그대로 생성
- 재귀적으로 데이터를 탐색
즉, "정렬"이 아니라 "구조 생성"입니다.
ORDER SIBLINGS BY의 역할
ORDER SIBLINGS BY DISP_PRIR_SEQ
- 같은 부모를 가진 노드끼리만 정렬
- 트리 구조 유지
이것이 핵심입니다.
결과 비교
잘못된 방식
10
20
11
21
올바른 방식
10
11
20
21
핵심 정리
- ORDER BY는 트리를 표현할 수 없다
- 계층 데이터는 CONNECT BY 필수
- 정렬은 ORDER SIBLINGS BY로 처리
- depth 기반 정렬은 항상 깨진다
Takeaway
트리 구조 데이터를 다룰 때는 항상 이 질문을 해야 합니다:
"나는 정렬을 하고 있는가, 아니면 구조를 만들어야 하는가?"
이 구분이 되면 잘못된 접근을 피할 수 있습니다.