====== 캐시 개요 ====== ===== CodeIgniter에서 제공하는 Cache ===== * **View Cache** : view 노출 영역을 cache함 * **DB Cache** : DB resultset을 cache함 * **일반 Cache** : 캐시 라이브러리를 제공 사용자가 원하는 형태의 cache를 구현 할 수 있도록 함 ===== Cache 사용 제약 ===== * **View Cache** : 사용자의 권한에 따라 result값이 다른 경우가 많이 있음. View Cache의 경우에는 URI의 정보를 cache 구분 key로 삼기 때문에 POST / GET 방식의 데이터 구분은 적용되지 않음(URI Segment 사용 시에는 적용 가능) * **DB Cache** : 일반 query 실행 시에는 사용상에 문제 없음. 다만 [[php:codeigniter:sp_호출관련_이슈|복수의 SP 호출 시 주의사항]]패치가 적용된 경우에는 사용 불가. (CodeIgniter는 기본적으로 SP사용을 지원하지 않으며 더더욱 한 queryexecute에 여러 resultset이 반환 될 경우 구조적으로 CodeIgniter에서 제공하는 DB Cache를 사용 할 수 없음.) ===== 대안 제시 (Custom Cache) ===== * 이에 SP를 주로 사용할 경우 Custom Cache를 만들어 Cache Helper에 등록 필요. * **URI와 상관 없이 호출 method 및 파라미터 데이터를 통해 캐시를 구분 method 호출 후의 리턴 값을 저장**하기 때문에 대부분의 상황에서 DB Cache 대용으로 사용 가능함. * 아래 가이드를 참조하여 상황에 맞는 cache를 사용 할 것을 추천함 ====== 캐시 사용 가이드 ====== ===== 캐시 사용 시 고려사항(공통) ===== * 일반적으로 Cache는 자주 변경되지 않으며 서버 혹은 DB에 부하가 예상되는 경우에 사용됨. * 만약 자주 변경되는 내용을 캐시 할 경우 캐시 만료기간 동안 해당 변경내용이 적용되지 않는 다는 사실을 염두에 두어야 함 * 또한, Call by reference 호출 구조의 경우(&$param1 의 형태)에는 cache사용에 따른 side effect가 있을 수 있으며 * 호출 시 시용되는 URI / 파라미터 이외의 환경에 결과 값이 종속되는 경우(예, 캐쉬 대상 내부 모듈에서 자체적으로 userSession 혹은 cookie 값, 시스템 시간을 참조하는 경우) 원하지 않는 결과 값을 받을 수 있게 됨을 주의해야 함. ===== Custom Cache ===== * **적합한 사용 예** - Controller에서 Model 호출 시 결과 값을 캐싱 * **적합하지 않은 사용 예** - CodeIgniter 환경의 class->method 호출이 아닌 일반 function 호출 결과를 cache에 저장하고자 할때(사용 불가) * **Definition** mixed _cache( array $callPath, array $parameters [, int $timeout=3600] ) * **Parameters** * callPath : 호출Method 경로 (첫번 째 index값은 object type이어야 함, 주로 $this) * parameters : Method 호출 시 파라미터 * timeout : 캐시 타임아웃 기간, 초 단위 (기본 값 1시간) * **Return Values** * Return : 해당 Method 호출 결과 (캐시 존재 시 저장된 캐시 값) * **사용 예시** * 아래 예시와 같이 Controller에서 Model 호출 시 캐시로 전환 할 수 있음 ((해당 cache 모듈은 helper 모듈로 등록되어 있으며, autoload를 통해 자동 로드가 되기 때문에 해당 cache사용을 위해 controller에서 별도 load혹은 초기화 선언을 할 필요 없음. 모듈 위치 : ./application/helpers/cache_helper.php 참조)) * Controller->Method 호출이 아니더라도, CodeIgniter환경에서 Class->Method 호출 시 모두 사용 가능 (예 : Controller->Controller 호출, Model->Model 호출 등, 다만 해당 호출 구조는 권장하지 않음) $data['result'] = $this->erp_test_model->get_price_change_history($param1, $param2 ); $data['result'] = _cache( array($this,"erp_test_model", "get_price_change_history") , array($param1, $param2) ); $data['result'] = _cache( array($this,"erp_test_model", "get_price_change_history") , array($param1, $param2) , 30*60 // timeout을 30분으로 조정 ); ===== View Cache ===== * **적합한 사용 예** (아래 내용에 모두 해당되는 경우) - 사용자의 계정에 상관 없이 동일한 결과값 도출 - 페이지 조회 시 별도 파라미터가 필요하지 않음 (ex. 검색 기능 / 페이징 부재) - 혹은 모든 파라미터가 URI Segment로 구현되어 있음 (ex. /user/list/3 ) * **적합하지 않은 사용 예** (아래 내용 중 하나라도 해당되는 경우) - 사용자 계정의 권한에 따라 결과 값이 다름 - 페이지 호출 시 POST / GET 방식의 파라미터를 사용하는 경우 * **사용 가이드** : http://www.ciboard.co.kr/user_guide/kr/general/caching.html ===== DB Cache ===== * **중요 : application/config/database.php 에 캐시 경로가 지정되어 있지 않으면 사용 불가** * **적합한 사용 예** - SP를 사용하지 않는 호출 건 - 혹은 SP를 사용하는 경우더라도 SP의 결과 값이 하나이고, 대상 method 안에서[[php:codeigniter:sp_호출관련_이슈|복수의 SP 호출 시 주의사항]]에 명시된 아래의 명령어를 하나도 사용하지 않은 경우 $query->close_result(); $query->next_result(); $query->next_result_array(); * **적합하지 않은 사용 예** (아래 내용 중 하나라도 해당되는 경우) - SP를 호출하고 있으며 결과 result set이 둘 이상인 경우 - 대상 method에서 위에 명시한 명령어 중 하나라도 사용했을 경우 * **사용 가이드** : http://www.ciboard.co.kr/user_guide/kr/database/caching.html