본문 바로가기
DataBase/ORACLE

계층형 메뉴 트리 정렬하기

by ojava 2012. 12. 31.
반응형


엄청나게 오랜만에 포스팅을 작성하니 감회가 새롭네요 ㅠ_ㅠ 그것도 2012년을 하루 남기고!


오늘은 계층형 메뉴 트리를 정렬하는 쿼리에 대해 소개합니다.

이에 앞서 메뉴 트리 테이블의 구조를 보여드리면 다음과 같습니다.



 컬럼명

설명 

MENU_CODE 

  메뉴가 가지는 고유의 일련번호 (PK)

MENU_TITLE 

  메뉴 이름

MENU_URL

  메뉴를 눌렀을 때 연결되는 URL 주소값 

MENU_PARENT

  ★ 메뉴의 부모 값 (계층 구조를 이루게 하는 요소) ★

MENU_SEQ

  메뉴 정렬 순서

 MENU_LEVEL

  메뉴 계층구조의 깊이 (값이 클수록 하위 메뉴) 

 MENU_VISIBLE

  메뉴 사용여부 (이 컬럼은 없어도 무관합니다) 



위의 컬럼을 가지고 있다는 전제하에 어떤 식으로 계층형 메뉴 트리를 정렬하는 지 설명드리겠습니다.



1. 각각의 MENU_CODE는 MENU_PARENT라는 부모값을 가지고 있다.

    단, ROOT 값이 되는 최상위 메뉴는 PARENT를 가지지 않을 수 있다.


2. ROOT값이 되는 최상위 메뉴부터 순차적으로 나열한다.


3. MENU_CODE 순으로 나열하는 것을 기본으로 하되, 각각의 MENU_CODE에 딸려있는 자식 MENU를 하위로 두고

   각각의 자식 MENU들은 MENU_SEQ의 순서로 나열되어진다.



간단한 예를 들어보겠습니다.



 MENU_CODE

 MENU_TITLE

MENU_URL 

MENU_PARENT

MENU_SEQ 

MENU_LEVEL 

MENU_VISIBLE 

 1

OJAVA


 

 1

 1

 Y

 2

JAVA

 

  1

 1

 2

 Y

 3

DATABASE

 

  1

 2

 2

 Y

 4

ORACLE

 /oajva/db/oracle.ora

  3

 1

 3

 Y

 5

FRAMEWORK

 

  2

 1

 3

 Y

 6

STRUTS2

 /oajva/struts2.xml

  5

 1

 4

 Y

 7

 MY-SQL /oajva/db/mysql.sql

  3

 2

 3

 Y


* MENU_LEVEL도 물론 정렬에 크게 필요한 컬럼은 아니지만, DEPTH 구성에서 들여쓰기 등에 사용할 수 있습니다.

* MENU 구성에서 임시로 보여지지 않는 MENU가 필요없다면 MENU_VISIBLE도 만들지 않아도 괜찮습니다.



해당 구성을 위의 조건에 맞춰서 정렬시키면 다음과 같은 구조를 생각할 수 있습니다.



 MENU_CODE

MENU_TITLE 

MENU_URL 

MENU_PARENT 

MENU_SEQ 

 1

 OJAVA  

 

 1

 2

      JAVA


 1

 1

 5

            FRAMEWORK

 

 2

 1

 6

                   STRUTS2

 /oajva/struts2.xml

 5

 1

 3

      DATABASE

 

 1

 2

 4

           ORACLE

 /oajva/db/oracle.ora

 3

 1

 7

           MY-SQL  /oajva/db/mysql.sql

 3

 2




위와같이 정렬하기 위한 쿼리문을 살펴보겠습니다. (MENU_TITLE의 DEPTH에 따른 들여쓰기는 생략합니당)




SELECT A.MENU_CODE, 

       A.MENU_TITLE, 

       A.MENU_URL, 

       A.MENU_PARENT,

 A.MENU_SEQ

   FROM TBL_MENU A

 WHERE A.MENU_CODE IN 

(1,2,3,4,5,6,7)  -- 여기에는 사용자별로 메뉴에 대한 VIEW 권한을 가지는 경우, 사용자별 볼 수 있는 MENU_CODE가 들어가면 됩니다.

CONNECT BY PRIOR A.MENU_CODE = DECODE(A.MENU_CODE, A.MENU_PARENT, NULL, A.MENU_PARENT)

     START WITH A.MENU_CODE = '1'   -- 시작하는 MENU_CODE의 번호

ORDER SIBLINGS BY A.MENU_SEQ ASC, A.MENU_CODE ASC;





음~ 계층별 정렬 어렵지 않아여 ㅋ_ㅋ 

2012년 안녕! 2013년에 또 포스팅 올릴 수 있기를 ㅠㅠ



2012.12 오혜영


반응형