hTemplate – 7.8.NO파일 용법

후키템플릿 1.0.0 버전에서 제안되었던 no-file 용법에 대한 문법적인 내용이 1.2.0 버전부터는 아래와 같이 수정되어 정식으로 제공됩니다. 1.2.0 버전에 포함된 NO파일(no-file) 용법은 1.0.0 버전부터 1.1.1p3 버전까지 제안되었던 용법과는 상당히 다르므로 이 용법을 사용하여 홈페이지 문서를 작성하셨던 분은 주의하시기 바랍니다.

NO파일(no-file) 용법이란

때에 따라서는 define() 메소드의 두 번째 인수인 템플릿 파일 대신에 rFastTemplate의 define_raw()와 같이 템플릿 변수가 포함된 HTML 소스가 저장된 문자열을 지정할 경우도 있을 것입니다. 이와 같이 파일이 아닌 문자열로부터 템플릿 변수가 포함된 HTML 소스를 직접 전달받는 기능을 NO파일(no-file) 용법이라 합니다.

이하 ‘템플릿 변수가 포함된 HTML 소스’를 ‘템플릿 문자열(template string)’이라고 칭하겠습니다.

  • define(템플릿명, 템플릿 문자열, 환경설정);

NO파일 용법에서는 위와같이 두번째 인수로 지정되는 템플릿 문서가 파일이 아닌 문자열로 지정됩니다.

1.0.0 버전에서 제안되었던 아래와 같은 형식은 더 이상 정상적으로 동작하지 않습니다.

  • define(‘상수:템플릿명’, ‘템플릿 문자열’);
  • define(“$modified:템플릿명”, ‘템플릿 문자열’);

캐시 and 컴파일

NO파일 용법의 가장 큰 문제는 전달된 문자열의 내용이 변경되었는지 확인하기가 어렵다는 것입니다. 물론 문자열 전체를 검색하여 수정되었는지를 확인할 수도 있겠으나 이를 위해 문자열 전체를 캐시하기는 다소 어려움이 있습니다. 이와같이 NO파일 용법에서 문자열의 변경 여부를 확인하는 방법이 여의치 않아 1.0.0 버전에서는 지정된 캐시 갱신 여부를 사용자가 직접 지정하도록 하였으나 1.2.0 버전에서는 문자열이 변경되었을 때만 컴파일하도록 개선하였습니다.

NO파일 용법에서도 템플릿 파일의 경우와 마찬가지로 ‘템플릿 문자열’을 파싱한 내용이 캐시됩니다.

NO파일 용법에서 ‘템플릿 문자열’의 변경 여부를 확인하는데 문자열 전체를 비교하지는 않습니다. crc32 함수에 의한 checksum 기술에 의해 서로 비교합니다. 캐시에 기록된 checksum 값과 define 함수로 전달된 ‘템플릿 문자열’의 checksum 값을 비교하여 문자열의 변경여부를 판단합니다. 문자열이 변경되었다고 판단되면 변경된 문자열을 컴파일한 결과와 새로운 checksum 값이 캐시에 기록됩니다.

NO 캐시

만약 ‘템플릿 문자열’이 매번 변경되는 경우라면 ‘템플릿 문자열’에 대한 정보를 캐시할 필요가 없을 것입니다. 물론 캐시해도 문제가 발생하지는 않지만 매번 현페이지에 대한 캐시가 갱신되어야 하므로 약간의 시간을 손해보게 되겠지요. 그러므로 이 경우라면 아에 캐시를 하지 않도록 하는 것이 좋을 것입니다. 그러면 ‘템플릿 문자열’이 변경되더라도 현페이지에 대한 캐시를 갱신하지 않을 것입니다.

캐시하지 않기 위해서는 아래와 같이 define() 함수의 세번째 인자를 이용합니다.

define() 함수의 세번째 인자는 1.2.0 버전에서 새로 추가된 것으로 NO파일 용법뿐 아니라 기존의 file 용법에서도 사용할 수 있습니다.

이와 같이 ‘cache_type’에 상수 HW_TPL_CACHE_NO를 지정하면 ‘템플릿 문자열’의 컴파일 결과가 캐시되지 않으며 홈페이지 문서를 로딩할 때마다 매번 컴파일하게 됩니다.

기능적으로는 NO 캐시 용법을 제공합니다만 NO 캐시 용법은 다소 실행시간에 부담되는 용법이므로 가능하면 사용하지 않는 것이 좋습니다.

정적캐시(Static Cache) & 동적캐시(Dynamic Cache) ?

이전 버전에서는 하나의 홈페이지 문서에 하나의 캐시만 존재하도록 작성되어 있습니다. 하나의 문서를 생성하는데 여러 개의 템플릿 파일이 이용되더라도 하나의 캐시로 통합됩니다. 하나의 문서에 하나의 캐시를 생성하는 것이 관리상 편리할 수도 있겠으나 때에 따라서는 템플릿 파일별로 캐시가 작성되는 것도 유용할 것입니다.

이를 위하여 1.2.0 버전에서는 특정 홈페이지 문서에 고정적으로 따라다니는 정적캐시(Static Cache)와 홈페이지 문서와 관계없이 템플릿 파일별로 작성되어 홈페이지 문서에서 필요에 따라 동적으로 불러들일 수 있도록 작성된 동적캐시(Dynamic Cache)로 구분되어 동작합니다.

define() 함수의 세번째 인자인 배열의 첨자 ‘cache_type’을 지정하지 않거나 상수 HW_TPL_CACHE_STATIC를 지정하면 정적캐시(Static Cache)로 저장되며, 상수 HW_TPL_CACHE_DYNAMIC를 지정하면 동적캐시(Dynamic Cache)로 저장됩니다.

캐시디렉토리에 저장된 캐시파일명을 보면 이전 버전에서는 아래와 같았습니다. 웹루트에서 시작되는 파일명 ‘blog/index.php’에서 ‘/’ 를 ‘@’로 치환한 후 ‘(캐시id).hcache.php’를 붙인 형태입니다.

  • blog@index.php(site_index).hcache.php

1.2.0 버전에서는아래와 같이 캐시파일명 형식이 변경되었습니다.

  • sn@site_index@blog@index.php.hcache.php

첫번째 문자 ‘s’는 정적캐시(Static Cache)를 의미하고, 두번째 문자 ‘n’는 압축안함(no compressed cache)를 의미하고, ‘site_index’은 캐시id를 의미하고, blog@index.php는 파일명 ‘blog/index.php’을 의미하고 ‘hcache.php’는 후키캐시 클래스에서 사용하는 첨자입니다.

동적캐시(Dynamic Cache)의 경우에는 첫문자가 ‘d’로 기록됩니다.

URL 리디렉션(URL redirection)

  • $tpl->define(템플릿명, 템플릿 문자열);

위와같은 문장에서 ‘템플릿 문자열’에 포함된 상대경로는 생성자에서 지정한 템플릿 기본 디렉토리을 기준으로 자동 변경됩니다. 기본 디렉토리가 여러 개 있을 때는 처음 지정된 디렉토리를 기준으로 변경됩니다.

1.1.1 버전부터는 아래와 같이 define 함수에서 기본 디렉토리를 직접 지정할 수 있었습니다. 예를 들어, ‘./templates/abc’를 기본 디렉토리로 지정하려면 아래와 같이 작성할 수 있습니다.

  • $tpl->define(‘:템플릿명:./templates/abc’, ‘템플릿 문자열’);
  • $tpl->define(‘:템플릿명:./templates/abc’, ‘템플릿 문자열’);

즉, 템플릿명 뒤에 콜론(:)을 찍고 그 뒤에 기본 디렉토리를 지정하면 됩니다.

1.2.0 버전에서도 define() 함수에서 기본 디렉토리를 지정할 수 있으나 1.1.1 버전과는 다른 형식을 가지고 있습니다.

즉, cache_type을 지정할 때와 같이 define() 함수의 세번째 인자를 이용하며 배열인자의 첨자는 ‘template_dir’입니다. 존재하지 않는 디렉토리이거나 디렉토리 내에 있는 파일명까지 지정하면 에러가 발생합니다.

예제(example)

아래와 같이 작성된 소스를 살펴보지요.

위 소스를 실행하게 되면 아래와 같은 결과를 얻게 됩니다.

템플릿 문자열 $nofile_test1는 캐시되지 않으며, 템플릿 문자열 $nofile_test2는 정적캐시에 포함되어 저장될 것이며, 템플릿 문자열 $nofile_test3는 현재 실행 스크립트가 ‘/blog/index.php’라면 아래와 같이 동적캐시가 작성될 것입니다.

  • dn@nofile_test3@blog@templates@abc.hcache.php

답글 남기기