← 개발일지

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

트리 구조 데이터를 다룰 때는 항상 이 질문을 해야 합니다:

"나는 정렬을 하고 있는가, 아니면 구조를 만들어야 하는가?"

이 구분이 되면 잘못된 접근을 피할 수 있습니다.