TIP게시판

제목 쿼리 한번이라도 줄이기
글쓴이 변종원(웅파) 작성시각 2009/08/13 10:18:45
댓글 : 5 추천 : 2 스크랩 : 0 조회수 : 30552   RSS
구현방식은 꼭 ci라서 구현할 수 있는 것은 아닙니다. 일반 php코딩방식이라도 구현할 수 있습니다.

게시판을 예로 들면 게시판 설정프로그램에서 게시판이름, 스킨, 권한 등등 셋팅을 할겁니다.
설정완료 버튼을 누르면 db에 입력을 할거구요.
보통은 여기까지 작업을 하고 끝이 납니다.

게시판 리스트를 불러올때 db에 연결해서 해당 게시판의 정보(스킨, 권한 등등)를 가져옵니다.
그리고 리스트를 뿌려주고..

위의 상황을 CI에서 구현한다면..

1. 게시판설정에서 DB저장까지는 동일합니다. db저장후 그 설정값들을 xml로 생성합니다.
2. ci의 hook을 사용하여 컨트롤러가 로드된 직후에 1번에서 설정한 xml을 읽어옵니다.
    -> 게시판정보를 가져오는거죠.
3. 주소와 매칭된 xml의 정보를 상수로 선언합니다.
   예) aa.com/qna/list -> xml파일에서 qna에 해당하는 정보를 가져와서 상수로 선언

후킹파일입니다. apllication/hooks 에 위치할 파일.
<?
function read() {
	/**
	* url(segment(1), segment(2))과 매칭되는 menu 설정값 상수로 선언.
	*/
	$CI =& get_instance();
	
	if (!$CI->uri->segment(1)) {
		define('MENU_CONNECT_LAYOUT_TYPE', 'INDEX');
		define('MENU_CONNECT_LAYOUT', 'INDEX');
 
 	} else {

		$xmlfile = DATA_ROOT ."/".ADMIN_ID. "/menu_config.xml";
		$xml = @simplexml_load_file($xmlfile);
		if($xml) {
	
			foreach($xPath = $xml->xpath("//menu") as $item) {
				$row = simplexml_load_string($item->asXML());
				$query="//name_en[.='".$CI->uri->segment(2)."']/parent::*";
				$v = $row->xpath($query);
				if($v[0]){
					define('MENU_ID', $item->id);
					define('MENU_NAME', $item->name);
					define('MENU_NAME_EN', $item->name_en);
					define('MENU_DETAIL_XML', $item->detail_xml);
					define('MENU_PLUGIN_NO', $item->plugin_no);
					define('MENU_SKIN_NO', $item->skin_no);
					define('MENU_BOARD_NAME', $item->board_name);
					define('MENU_BOARD_NAME_EN', $item->board_name_en);
					define('MENU_BOARD_PERM', $item->board_perm);
					define('MENU_CATEGORY_WORD', $item->category_word);
					define('MENU_HEADER_HTML', $item->header_html);
					define('MENU_FOOTER_HTML', $item->footer_html);
					define('MENU_HEADER', $item->header);
					define('MENU_FOOTER', $item->footer);
					define('MENU_DETAIL_SETTING', $item->detail_setting);
					define('MENU_BOARD_DETAIL_SETTING', $item->board_detail_setting);
					define('MENU_LOAD_CONFIG', $item->load_config);
					define('MENU_CONNECT_TYPE', $item->connect_type);
					define('MENU_CONNECT_TYPE_CONTENTS', $item->connect_type_contents);
					define('MENU_CONNECT_HTML', $item->connect_html);
					define('MENU_CONNECT_LINK', $item->connect_link);
					define('MENU_CONNECT_PLUGIN_NO', $item->connect_plugin_no);
					define('MENU_CONNECT_BOARD_NO', $item->connect_board_no);
					define('MENU_CONNECT_LAYOUT_TYPE', $item->connect_layout_type);
					define('MENU_CONNECT_LAYOUT', $item->connect_layout);
					define('MENU_PERMISSION', $item->permission);
					define('MENU_MODULE_NAME', $item->module_name);
					define('MENU_MODULE_TYPE', $item->module_type);
					define('MENU_MODULE_DIRECTORY', $item->module_directory);
					define('MENU_DEFAULT_SKIN_NO', $item->default_skin_no);
					define('MENU_SKIN_DIRECTORY', $item->skin_directory);
					define('MENU_SKIN_OPTIONS', $item->skin_options);
					define('MENU_PARENT_NAME_EN', $item->parent_name_en);
				}
			}
		}
	}
}
?>


4. 이후 ci의 모든 페이지내에서는 상수를 가져다 쓰시면 됩니다.

이렇게 하면 쿼리를 1번 줄일 수 있습니다.
여기에 페이지캐싱, db캐싱까지 적용하면 속도는... 말 안해도... ^^

다음번에는 사이트메인에서 쿼리 한번도 없이 각종 리스트(최근 게시물)를 뿌려주는 방식을
설명해볼까 합니다. ^^
 다음글 Jquery 라이브러리 입니다. (2)
 이전글 firePHP를 사용해서 디버깅 하기. (6)

댓글

ci세상 / 2009/08/13 10:43:54 / 추천 0
CI 300% 활용하기 ~~ ㅎㅎ

운전을 하면서 미세한 핸들조작으로 차선이 확확 바뀌고 목숨이 왔다갔다 하듯이..

MVC 기반의 CI에서 컨트롤러 조작을 어떻게 할지에 따라서 CI 하수냐 고수냐로 구분이 되는것 같습니다.

대충대충 컨트롤러를 조작할바에는 안쓰는것이 좋다~~ 어떻게 조작하면 ~~ 최적화된 코딩을 했다고

자부심을 가질까? 웅파님의 이글을 보면서 많은 것을 느끼게 되었습니다. ^^

다음 팁에 나올 ~~ 쿼리 한번도 안하기 ~~ 정말로 기대됩니다. 화이팅입니다.!!
ci세상 / 2009/08/13 10:45:10 / 추천 0

아참~~ CI코드 자료실에 제가 만든 "CI 중복배제" 이 컨트롤러에 대한 고수님들의 조언좀 요청드립니다.^^

제가 난폭 운전을 하고 있는지 자문을 받고 싶어서 올려본 소스입니다. ㅎㅎ
마냐 / 2009/08/13 12:31:40 / 추천 0
xml... xml... xml... xml... 팁이군요. 음... 출력을 xml로...

회원정보는 워낙 유동적이라 DB가 어울리겠고...
속도야 둘째치고 트래픽, 부하면에서 상당한 이익이겠군요.
듬직이 / 2009/08/13 20:34:47 / 추천 0
오~ 이런 방법이 있었군요..
좋은 팁 감사드립니다.
emc / 2009/08/14 01:02:11 / 추천 0
좋은 팁이네요.
저도 이부분에 대해서 고민했는데, 귀차니즘으로 디비로 처리했는데, 비효율적이라고 생각했습니다.
xml이 좋을것 같았지만, 역시 귀차니즘으로 그냥 놔두었네요.