제목 | 메뉴를 sql 한 문장으로 한 번에 depth, order 순서대로 출력하는 방법.. | ||
---|---|---|---|
글쓴이 | 하늘치 | 작성시각 | 2021/09/07 11:12:24 |
|
|||
웹사이트를 많이 만들다 보면.. 메뉴 관리가 필요하다 싶을 때가 있잖아요?? DB 에서 가져오는 것보다는 html 로 처리하는 게 쪼끔이라도 빠르니까 라는 생각을 했었는데, 그것도 한 두번이지 사이트를 계속 만들다 보니 그냥 귀찮아지게 되네요.. 제가 예전에 어깨 너머로 배운(?) 메뉴는 보통 이렇게 구현되더군요.
$arr_nav_1 = result(); foreach($arr_nav_1 as $k1=>$nav1) { $arr_nav_2 = result(); foreach($arr_nav_2 as $k2=>$nav2) { $arr_nav_3 = result(); foreach($arr_nav_3 as $k3=>$nav3) { } } }
1차 메뉴 구현 중 하위에 2차가 있으면 그 때마다 다시 db 접속, 2차 메뉴 구현 중 하위에 3차가 있으면 그 때마다 다시 db 접속. ... 그런데, 이렇게 구현하면 메뉴가 많아질수록 디비 접속도 많아집니다. 사실 웹개발 처음 배울 때, 첫 직장 사장님 말씀이 이거였어요.
그래서 고민했습니다. 디비 접속 한 번에 메뉴를 원하는 순서대로 모두 가져오는 걸요.
디비의 메뉴 정렬을 위한 테이블 구조는 간단합니다. page_code / first_code / depth / order / nav_order
모든 메뉴는 고유의 page_code 를 가집니다. 그리고, 1뎁스는 자신의 코드를 first_code로 가지고, 나머지 2뎁스 이상은 1뎁스의 first_code 를 각각 자신의 first_code 로 가져갑니다. order 는 각 뎁스상에서의 순서를 의미합니다.
그래서, nav_order 를 [first_code]-[depth]-[order] 조합으로 저장시켜놓으면.. select * from nav where ... ORDER BY nav_order ASC 이렇게 한 번에 모든 메뉴가 depth와 order 순서대로 출력이 됩니다. 그 다음은.. 배열로 알아서 작업을 하시면 되겠죠? ^^;
저는 이렇게 했습니다..
// nav 데이터 가져오기 $arr = array('sql_select' => '*','sql_from' => 'nav','sql_where' => array('del_datetime' => NULL, 'use_yn'=>'Y'),'sql_order_by' => 'nav_ord ASC,depth ASC,order ASC'); $nav_result =$this->basic_model->arr_get_result($arr); $list_nav1 = array(); $list_nav2 = array(); $list_nav3 = array(); $list_nav4 = array(); foreach( $nav_result ['qry'] as $key => $nav ) { if($nav->depth == 1) { $list_nav1[$nav->page_code] = $nav; } if($nav->depth == 2) { $list_nav2[$nav->parent_code][$nav->page_code] = $nav; } if($nav->depth == 3) { $list_nav3[$nav->parent_code][$nav->page_code] = $nav; } if($nav->depth == 4) { $list_nav4[$nav->parent_code][$nav->page_code] = $nav; } }
아차.. parent_code 는 바로 상위의 page_code 입니다.
고수분들은 메뉴 관리를 어떻게 하시는 지 궁금합니다.
|
|||
다음글 | 자바스크립트 이미지 에디터 | ||
이전글 | 절판된 책 구하는법 (3) | ||
변종원(웅파)
/
2021/09/07 11:17:00 /
추천
0
|
하늘치
/
2021/09/07 11:21:52 /
추천
0
@변종원(웅파) 아, 그런 방법이 있군요! |
변종원(웅파)
/
2021/09/08 09:57:19 /
추천
0
하늘치/ 비용을 덜 들이고 부하를 분산하고자 했던 가난한(?) 시절의 노력이었죠. 포럼 메인의 경우 여러 개의 게시판에서 데이터를 조회해서 부하가 좀 있는데 그런 경우에도 등록, 수정, 삭제시에 html을 만들게 되면 부하를 줄이는 효과가 있지요. 수동 캐시 구현이랄까요. ^^ |
코드는 db에 저장하고 어드민 메뉴에서 코드가 변경되거나 삭제되는 순간 그 내용을 가져와서 html로 만들고
헤더에서 그 html을 불러서 사용하는 방법이 있습니다.
메뉴가 빈번히 바뀌지 않는 지라 저장은 db에 실제는 html을 만들어서 관리.