TIP게시판

제목 메뉴를 sql 한 문장으로 한 번에 depth, order 순서대로 출력하는 방법..
글쓴이 하늘치 작성시각 2021/09/07 11:12:24
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 193   RSS

웹사이트를 많이 만들다 보면..

메뉴 관리가 필요하다 싶을 때가 있잖아요??

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 접속.

...

그런데, 이렇게 구현하면 메뉴가 많아질수록 디비 접속도 많아집니다.

사실 웹개발 처음 배울 때, 첫 직장 사장님 말씀이 이거였어요.

 

디비 접속 한 번으로 원하는 구조를 만들어 가져와서 php, asp, jsp 로 처리해라.

 

그래서 고민했습니다.

디비 접속 한 번에 메뉴를 원하는 순서대로 모두 가져오는 걸요.

 

디비의 메뉴 정렬을 위한 테이블 구조는 간단합니다.

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 입니다. 

 

고수분들은 메뉴 관리를 어떻게 하시는 지 궁금합니다. 

 

 

 이전글 절판된 책 구하는법 (1)

댓글

변종원(웅파) / 2021/09/07 11:17:00 / 추천 0

코드는 db에 저장하고 어드민 메뉴에서 코드가 변경되거나 삭제되는 순간 그 내용을 가져와서 html로 만들고

헤더에서 그 html을 불러서 사용하는 방법이 있습니다.

메뉴가 빈번히 바뀌지 않는 지라 저장은 db에 실제는 html을 만들어서 관리.

하늘치 / 2021/09/07 11:21:52 / 추천 0

@변종원(웅파) 

아, 그런 방법이 있군요!

변종원(웅파) / 2021/09/08 09:57:19 / 추천 0

하늘치/ 비용을 덜 들이고 부하를 분산하고자 했던 가난한(?) 시절의 노력이었죠.

포럼 메인의 경우 여러 개의 게시판에서 데이터를 조회해서 부하가 좀 있는데 그런 경우에도 등록, 수정, 삭제시에 html을 만들게 되면 부하를 줄이는 효과가 있지요. 수동 캐시 구현이랄까요. ^^