CodeIgniter 프레임워크를 학습한 이력은 다음과 같다.


PoC 결과는 대체적으로 만족스럽다.


MVC 프레임워크이면서도 굉장히 가볍다. 그리고 설치랄 것도 없이 압축만 풀면 그만이다. 별도의 설정이 많이 필요하지도 않다. 가장 큰 이슈였던 스마티와의 연동도 크게 어렵지 않았다. 또한 View와 Controller 사이의 결합도도 거의 없다. 또한 문서화도 상당히 잘 되어 있는 편이고, 사용자 포럼도 활발히 진행되어 피드백을 받기가 쉽다.


약간 성가신 부분은 요청 매핑(Request Mapping) 부분이다. config/routes.php 파일에, 요청을 일일이 기술해야 하는데, 사이트가 커지면서 요청 매핑의 갯수가 많아지면 이러한 중앙집중식 설정은 관리가 다소 애매해진다. 논리적인 단위로 파일을 나눌 수 있는지 확인이 필요하다.


또 다른 문제는 Front Controller다. index.php 파일이 Front Controller 역할을 하는데, 요청 URL에 모두 포함되어야 한다. 예를 들어 다음과 같다.

http://localhost/~socurites/ci-test/index.php/smartytest/index


그렇긴 해도 아파치 웹서버의 .htaccess 설정을 통해 처리할 수 있으니 큰 문제는 아니다.


PoC가 끝났으니, 실제 적용하기 전에, 고려할 사항이나 보안 이슈와 같이 주요한 요소를 찾아봐야 할 것 같다. 이 참에 제대로 해보려고 "CodeIgniter 한국 사용자 포럼" 운영자가 쓴 "만들면서 배우는 CodeIgniter 프레임워크" 책을 구매했다.


책 학습 후에 주요 내용을 정리하고자 한다.



Posted by socurites

CodeIgniter 역시 Smarty와 연동하는 표준 문서가 없어서 약간 헤매기는 했지만, Using Smarty 3 in Codeigniter 2 (a really tiny CI library)의 도움을 얻어서 설치하는데 성공했다.


이 튜토리얼을 따라하려면 반드시 "CodeIginter 프레임워크 사용 이력 - 튜토리얼" 시리즈를 따라하기를 바란다.


먼저 Github의 Vheissu/Ci-Smarty에 가서 ZIP 파일을 다운로드 한다. 압축을 풀어서, application/ 하위에 모두 붙여 넣는다. 3버전대의 스마티가 포함되어 있으므로 별도로 스마티를 다운로드 하지 않아도 된다.


다운로드한 ZIP 파일에는 예제 코드가 포함되어 있다. 예제코드를 실행하기 위해서, routes.php 파일을 아래와 같이 수정한다.

$route['smartytest/index'] = 'smartytest/index';     <--- 추가한 부분

$route['news/create'] = 'news/create';

$route['news/(:any)'] = 'news/view/$1';

$route['news'] = 'news';

$route['(:any)'] = 'pages/view/$1';

$route['default_controller'] = 'pages/view';


{사이트}/index.php/smartytest/index 로 접속하면 smartytest.tpl 파일이 정상적으로 표시되는 것을 확인할 수 있다.


만약 아래와 같은 에러가 웹서버 에러 로그에 나타난다면,

unable to write file application/cache/smarty/compiled


application/cache/smarty 디렉토리의 cached/, complied/ 디렉토리에 웹서버가 쓸 수 있는 권한을 부여해야 한다.



[참고자료]


Posted by socurites

원문: http://www.coolphptools.com/codeigniter-smarty



절대로 최신버전의 CodeIgniter에서는 따라하지 마세요.

동작 안합니다!!!!!



역주) 따라서 다 하고 나서야, 동작이 안된다는 것을 알았을 뿐이고! 2~3년 전 글이었을 뿐이고! 시간을 낭비했을 뿐이고!


CodeIgniter가 생소할 수도 있겠지만, CodeIgniter는 가벼운 Model-VIew-Controller(MVC) 프레임워크로, PHP를 기반으로 한다. CodeIgniter는 EllisLabs에서 만드는 오픈소스 프로젝트다. CodeIgniter는 템플릿 시스템을 내장하고 있지만, 내가 마지막으로 내장 템플릿 시스템을 보았을 떄, 별 기능이 없었다. 또한 내장 템플릿 시스템은 preg_match()와 문자열 치환을 기반으로 페이지를 필터링하는 방식이었다. 만약 트랙피 사이즈가 크지 않고 변수 치환을 많이 사용하지 않는 사이트라면, 이러한 방법도 효과적일 수는 있다. 하지만 트래픽 사이즈가 크게 증가하고, 페이지수가 많은 사이트라면, 이러한 방식은 웹 사이트의 응답시간에 큰 영향을 미친다.


스마티(Smarty)는 또 다른 오픈소스 프로젝트로 템플릿을 처리하며 마찬가지로 PHP로 작성되었다. 스마티는 오랫동안 사용되었고, CodeIgniter에 내장된 단순한 템플릿 엔진에 비해 막강한 기능을 가지고 있다. 스마티는 또한 템플릿을순수한 PHP 파일로 컴파일하기 때문에, 실행할 때 더 빠르다.


템플릿 생성은 개발자들 사이에서 논쟁거리가 되어 왔는데, PHP를 HTML 안에서 직접 사용하는 편이 더 쉽고, 새로운 템플릿 언어를 배워서 똑같은 일을 하는 일이 좀더 어렵다고 느꼈기 때문이다. 개인적으로 나는 코드(PHP)와 뷰(스마티를 사용한 템플릿)을 서로 명확히 분리하는 편을 선호한다. 나는 개발자가 게을러져서 HTML에 로직, 심지어 데이터베이스 호출 로직까지도 추가하는 일을 자주 목격했다. 하지만 이렇게 개발하면, 유지보수하는 일이 쉽게 악몽이 되어버리고 만다. 또한 나는 스마티가 HTML의 <>와는 달리 {}를 구분자로 사용하는 방식이 마음에 든다. 이처럼 구분자가 다르기 때문에, 스마티 태그를 식별하기가 수월해진다. 이러한 사실은 아래의 코드에서 잘 드러난다.


스마티를 사용하는 경우:

<title>{$title}</title>


PHP를 사용하는 경우:

<title><?php echo $title;?></title>


한가지 성가신 점은 HTML에 꺽쇠가 있는 경우다. 예를 들어 인라인 자바스크립트나 인라인 스타일시트를 사용하는 경우다. 이때는 이들 꺽쇠를 반드시 이스케이프 처리를 해야만 스마티 태그로 해석되지 않는다. 또는 스마티로 해석되지 않도록 꺼두고 싶은 영역이 있다면, {literal}과 {/literal}을 사용하면 된다. 예를 들어 다음과 같다.


<script type="text/javascript">

  {literal}

  function a(b, c) {

      alert('function a('+b+', '+c+') called!');

  }

  {/literal}

</script>


{literal}과 {/literal}은 원하는 어디에서도 사용할 수 있는데, 심지어 단일 문자를 감쌀 수도 있다. 하지만 이처럼 이스케이프 처리를 하기 보다는, 외부 자바스크립트 파일 또는 스타일시트 파일을 사용하기를 바란다. 


지금쯤이면 "스마티를 CodeIgniter와 어떻게 같이 사용하죠?"라는 질문이 떠오를 것이다. 이제 내가 어떻게 했는지 약간 시간을 내서 정리하려고 하며, 여러분도 시작할 수 있도록 몇가지 코드와 함께 예제를 보여주고자 한다.



1단계: CodeIgniter 설치하기


만약 아직 CodeIgniter를 설치하지 않았다면, 여기에서 다운로드해서 설치한다.



2단계: 스마티 설치하기


가장 최근의 스마티를 여기에서 다운로드할 수 있다. 나는 /system/libs 디렉토리를 CodeIgniter에 생성해서, smarty 디렉토리를 복사해서 넣었다. 스마티를 다른 위치에 설치하려고 한다면, Smarty.php 라이브러리 모듈에서 해당 스마티 설치 위치를 가리키도록 수정해야 한다. 가리키려는 디렉토리는 반드시 Smarty.class.php 클래스 파일을 포함하고 있어야 한다.



3단계: 템플릿 디렉토리 생성하기

나는 templates 디렉토리(스마티의 루트 템플릿 디렉토리)와 templates_c 디렉토리(스마티 템플릿이 컴파일된 버전이 저장되는 위치)를 /system/application/views에 만들었다. 이번에도 마찬가지로, 템플릿을 다른 위치에 저장하고 싶다면, Smarty.php 파일을 열어서 해당 디렉토리를 가리키도록 수정해야 한다. 이때 templates_c 디렉토리가 어플리케이션에 쓰기 권한을 가지도록 해야 한다.



4단계: 이 사이트에서 제공하는 코드 설치하기

이 사이트의 코드는 스마티와 CodeIgniter를 연동하는 Smarty 라이브러리 클래스와, CodeIgniter 기능에 접근할 수 있도록 돕는 스마티 플러그인 몇가지, 그리고 "example"이라고 불리는 작은 데모를 포함한다.


메인 클래스(물론 나는 클래스 접두어로 MY_ 가 아니라, CI를 사용하고 있다. 하지만 CodeIgniter에는 Smarty라는 이름의 클래스가 없으므로 상관없다)는 CI_Smarty이며, autoload 설정 배열에 "smaty"라는 이름으로 추가할 수 있다. 이는 다른 라이브러리 모듈을 사용하는 방식과 다를게 없다. 메인 Smarty 클래스를 상속받아서 CodeIgniter용 라이브러리로 만들었기 때문에, 기존의 Smarty API 호출을 모두 사용할 수 있다. 나는 여기에 smarty->view()라는 이름의 함수를 추가하였는데, 이 함수는 CodeIgniter의 템플릿 시스템의 parser->parse() 함수처럼 동작하는 유틸리티 함수다. 또한 스마티와 CodeIgniter 라이브러리 사이의 차이를 메울 수 있는 몇가지 플러그인을 추가하여, 템플릿에서 접근할 수 있도록 하였다. 물론 이렇게 하면서도 MVC 패러다임을 부수지 않도록 하였으며, 또한 템플릿을 호출하기 전에 $data 배열에 잡다한 정보를 꾸겨 넣는 대신에, language 파일 데이터, 검증 에러 등과 같은 요소를 더욱 쉽게 사용하도록 했다.


아래는 메인이 되는 Smarty 라이브러리 클래스다.

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');


/**

 * Smarty Class

 *

 * @package CodeIgniter

 * @subpackage Libraries

 * @category Smarty

 * @author Kepler Gelotte

 * @link http://www.coolphptools.com/codeigniter-smarty

 */

require_once( BASEPATH.'libs/smarty/libs/Smarty.class.php' );


class CI_Smarty extends Smarty {


    function CI_Smarty()

    {

        parent::Smarty();


        $this->compile_dir = APPPATH . "views/templates_c";

        $this->template_dir = APPPATH . "views/templates";

        $this->assign( 'APPPATH', APPPATH );

        $this->assign( 'BASEPATH', BASEPATH );


        log_message('debug', "Smarty Class Initialized");

    }


    function __construct()

    {

        parent::__construct();


        $this->compile_dir = APPPATH . "views/templates_c";

        $this->template_dir = APPPATH . "views/templates";

        $this->assign( 'APPPATH', APPPATH );

        $this->assign( 'BASEPATH', BASEPATH );


        // Assign CodeIgniter object by reference to CI

        if ( method_exists( $this, 'assignByRef') )

        {

            $ci =& get_instance();

            $this->assignByRef("ci", $ci);

        }


        log_message('debug', "Smarty Class Initialized");

    }



    /**

    *  Parse a template using the Smarty engine

    *

    * This is a convenience method that combines assign() and

    * display() into one step.     

    *

    * Values to assign are passed in an associative array of

    * name => value pairs.

    *

    * If the output is to be returned as a string to the caller

    * instead of being output, pass true as the third parameter.

    *

    * @access public

    * @param string

    * @param array

    * @param bool

    * @return string

    */

    function view($template, $data = array(), $return = FALSE)

    {

        foreach ($data as $key => $val)

        {

            $this->assign($key, $val);

        }

        if ($return == FALSE)

        {

            $CI =& get_instance();

            if (method_exists( $CI->output, 'set_output' ))

            {

                $CI->output->set_output( $this->fetch($template) );

            }

            else

            {

                $CI->output->final_output = $this->fetch($template);

            }

            return;

        }

        else

        {

            return $this->fetch($template);

        }

    }

}

// END Smarty Class


아래는 다운로드에 포함된 모든 파일들이다:


스마티와 연결하기 위해 사용하는 CodeIgniter 라이브러리:

/system/application/libraries/Smarty.php


CodeIgniter 클래스와 연결하기 위한 스마티 플러그인 함수:

/system/libs/smarty/libs/plugins/function.ci_config.php

/system/libs/smarty/libs/plugins/function.ci_db_session.php

/system/libs/smarty/libs/plugins/function.ci_form_validation.php

/system/libs/smarty/libs/plugins/function.ci_language.php

/system/libs/smarty/libs/plugins/function.ci_validation.php


예제 코드:

/system/application/controllers/example.php

/system/application/language/english/label_lang.php

/system/application/views/templates/example.tpl

/system/application/views/templates/header.tpl

/system/application/views/templates/footer.tpl



5단계: CodeIgniter config 수정하기


/system/application/config 디렉토리에 보면, autoload.php 파일이 있다. 파일을 열어서 'smarty'를 자동으로 로드할 라이브러리 클래스 배열에 추가하자.

/*

| -------------------------------------------------------------------

|  Auto-load Libraries

| -------------------------------------------------------------------

| These are the classes located in the system/libraries folder

| or in your application/libraries folder.

|

| Prototype:

|

| $autoload['libraries'] = array('database', 'session', 'xmlrpc');

*/


$autoload['libraries'] = array('smarty');



6단계: 예제 실행하기


모든 단계를 정확하게 설치했다면, http://yourdomain/example에 접속하면, 아래와 같은 화면을 볼 수 있다








Posted by socurites

난관에 봉착했다.

최신 버전인 2버전대의 CakePHP와 Smarty를 연동하는 자료가 전무하다.

아래는 찾아낸 문서이지만, 거의 1버전대의 문서로 2버전대에서는 아예 연동을 고려하지 않은 것인지 의심스럽다.


The CakePHP Blog Tutorial with SMARTY

http://bakery.cakephp.org/articles/HyperCas/2008/06/11/the-cakephp-blog-tutorial-with-smarty


1버전의 CakePHP와 스마티를 연동하는 튜토리얼이다. 2008년에 작성되었으며, 현재로서는 도움이 되지 않는다.



CakePHP 2.0.0 Beta && Smarty 3

http://bakery.cakephp.org/articles/skler/2011/08/05/cakephp_2_0_0_beta_smarty_3


2버전대의 CakePHP와 스마티를 연동하는 문서다. 너무 간단해서 얻을 수 있는게 거의 없다.



How to use Smarty with Cake (SmartyView)

http://bakery.cakephp.org/articles/tclineks/2006/10/27/how-to-use-smarty-with-cake-smartyview

How to use SmartyHelpers with SmartyView

http://bakery.cakephp.org/articles/tclineks/2006/11/05/how-to-use-smartyhelpers-with-smartyview


스마티를 연동하기 위해 필요한 SmartyView와, 헬퍼인 SmartyHelper를 설치하고 사용하는 문서다. 마찬가지로 1버전의 CakePHP를 기준으로 2006년에 작성되었다. 관련된 소스 코드를 다운로드할 수 있는 cakeforge.org는 접속이 되지 않는다. 구글링 결과 cakeforge의 코드는 모두 github로 이전되었다고 하지만, 활동이 이루어지지 않는 듯 보인다.


cakePHP 2.0 + Smarty 3.1.4

http://yesyaa.egloos.com/3273582


한글로 작성된 문서로, 간단한 적용방법을 설명하고 있다.


답답하다.

Posted by socurites

아래는 스마티 사이트의 "About Smarty"의 번역본이다.



철학

스마티는 아래의 목표를 만족시키기 위해 설계되었다.

  • 프레젠테이션 코드와 어플리케이션 코드의 명확한 분리
  • 백엔드에서는 PHP를, 프론트엔드에서는 스마티 템플릿을
  • PHP를 보완하지, 대체하지는 않는다
  • 프로그래머와 디자이너가 빠르게 개발해서 배포해야 한다
  • 유지보수를 쉽고 빠르게 할 수 있어야 한다.
  • PHP 지식이 없더라도 구문은 이해하기 쉬워야 한다.
  • 쉽게 확장할 수 있는 유연성
  • 보안 : PHP로부터 분리
  • 무료, 오픈소스


스마티란?

스마티는 PHP를 위한 템플릿 엔진으로, 스마티를 사용하면 프레젠테이션 로직(HTML/CSS)와 어플리케이션 로직을 분리할 수 있다. 다시 말해 PHP 코드는 어플리케이션 로직을 위해서만 사용하며, 프레젠테이션으로부터는 분리할 수 있다. 



템플릿에 대한 두 진영간의 의견 대립

PHP에서 템플릿을 사용한다고 할 때, 여기에는 서로 상반대는 두 진영이 있다. 한 진영에서는 "PHP 그 자체가 템플릿 엔진"이라고 주장한다. 이 진영에서는 PHP 코드와 HTML을 단순히 섞어서 사용한다. 순전히 스크립트를 실행한다는 관점에서 보면 이 방식은 빠르긴 하다. 하지만 대다수의 사람들은 PHP 코드가 프레젠테이션 코드와 섞어서 사용하게 되면 구문이 지저분해지며, 결국 유지보수 하기귀 십자 않다고 반대한다. PHP는 프로그래밍에는 적합하지만, 템플릿으로 사용하기엔느 적합하지 않기 때문이다.


반대 진영에서는 프리젠테이션에는 어떤 프로그래밍 코드가 있어서는 안되며, 어플리케이션 컨텐츠가 필요한 위치에는 단순한 태그를 사용해야 한다고 주장한다. 이러한 사상은 대다수의 템플릿 엔진(또한 프로그래밍 언어)이 지닌 철학과 일맥상통하며, 스마티에서 이와 동일한 입장을 취한다. 즉 별도의 노력을 들이지 않고도 템플릿에서는 프레젠테이션에만 집중하며, 어플리케이션 로직은 사용하지 않자는 것이다.



PHP와 템플릿을 분리하는 일이 왜 중요한가?

PHP 코드와 템플릿을 분리하게 되면 많은 장점이 있다. 예를 들어 다음과 같다.

  • 구문(Syntax)
    템플릿은 주로 HTML과 같은 의미적인 마크업(semantic markup)으로 구성된다. PHP 구문은 어플리케이션에는 적합하지만, HTML과 섞어 쓰게 되면 문제가 되기 쉽상이다. {tag}와 같은 간단한 스마티 구문은 다른 무엇보다도 프레젠테이션을 표현하기 위해 만들어졌다. 스마티를 사용하면 프레젠테이션에만 집중할 수 있으며, "코드"에는 신경을 쓰지 않아도 된다. 이를 통해 템플릿을 십게 배포할 수 있으며, 유지보수 또한 쉬워진다. 스마티 구문을 사용하기 위해서 PHP에 대한 별도의 지식을 필요료하지 않는다. 또한 스마티 구문은 프로그래머뿐만 아니라 프로그래머가 아닌 사람들도 이해하기 쉽다.
  • 기능(Feature)
    템플릿 엔진을 사용하면 다양한 프레젠테이션 기능을 사용할 수 있다. 만약 템플릿을 엔진을 사용하지 않았더라면, 여러분이 직접 개발하고 테스트해야 하며, 유지보수 해야했을 것이다. 뿐만 아니라 태그를 사용하면, PHP 문장의 복잡성을 숨길 수 있게 된다. 예를 들어 아래의 PHP 코드를

    PHP

    <?php echo strtolower(htmlspecialchars($title,ENT_QUOTES,UTF-8)); ?>
    스마티에서는 아래와 같이 작성할 수 있다.

    Smarty

    {$title|escape|lower}

    좀더 쉽게 개발을 하기 위해서 PHP가 C 레이어 위에서 추상화를 제공한 것과 마찬가지로, 템플릿 유지를 쉽게 하기위해 스마티는 PHP 레이어 위에서 추상화를 제공한다.

  • 샌드박스(Sandbox)
    PHP를 템플릿과 섞어 쓰게 되면, 템플릿에 포함될 수 있는 로직에 대한 제약을 할 수 없게 된다. 스마티는 템플릿을 PHP로부터 분리하므로, 프레젠테이션과 비즈니스 로직의 분리를 제어할 수 있게 된다. 또한 스마티는 보안 측면에서 템플릿을 점진적으로 제한할 수 있는 기능을 제공한다.

PHP 구문과 스마티 구문을 비교가 궁금하다면, 구문 비교를 참고하라.



웹 디자이너와 PHP

"어쨋든 웹 디자이너는 구문을 배워야만 하는데, PHP는 왜 배우면 안되는가"라고 흔히들 묻는다. 물론 웹 디자이너도 PHP를 배울 수 있고, 심지어는 이미 익숙할 수도 있다. 중요한 점은 웹 디자이너가 PHP를 배울 능력이 되느냐가 아니라, PHP와 HTML을 섞어 썼을 떄 과연 유지보수가 쉬우냐다. {tags}는 간단하며, 이해하기 쉽고, PHP 구문에 비해 실수할 가능성도 적다. 또한 템플릿은 템플릿에 포함될 수 있는 코드에 제약을 가할 수 있다. PHP를 사용하게 되면 템플릿에 포함하지 말아야 할 코드를 템플릿에 포함하게 되는 우를 범하게 될 가능성이 높다. 물론 어플리케이션 설계 규칙에 대해 디자이너에게 설명해줄 수는 있지만, 사실 이러한 과정을 불필요한 작업이다(만약 디자이너가 어플리케이션 설계 규칙을 배운다면 이미 디자이너는 디자이너가 아니라 개발자인 셈이다!). PHP 매뉴얼은 개발자를 위한 것이다. 디자이너는 매뉴얼의 일부만 알고 있으면 되며, 디자이너가 매뉴얼에서 자신이 필요한 요소를 찾기란 쉽지 않다. 이러한 상황에서 스마티는 디자이너가 필요로 하는 최적의 툴이다. 또한 개발자는 스마티를 완전히 제어할 수 있다. 템플릿 상속과 같은 프레젠테이션을 위한 여러 기능도 제공되므로, 템플릿 재사용할 수 있을 뿐만 아니라 능률적으로 구조화할 수 있게 된다.



구현이 중요하다

스마티가 프레젠테이션과 어플리케이션 코드를 명확히 분리할 수 있는 도구를 제공하지만, 분리 규칙을 어기게 되는 상황도 충분히 많이 존재한다. 예를 들어 구현을 잘못한 경우(PHP를 템플릿에 포함하는 것과 같은), 프레젠테이션 분리를 통해 해결하고자 했던 문제보다 더 큰 문제를 야기할 수 있다. 스마티 문서에서는 유의해야할 항목들에 대해 잘 설명하고 있다. 또한 베스트 프랙티스를 살펴보라.



스마티는 무엇이며, 어떻게 사용해야 하는가?

크래쉬 코스에서 PHP 어플리케이션에서 스마티를 사용하여 전형적으로 구현하는 방식에 대한 개요를 잘 설명하고 있다.



어떻게 동작하나?

스마티는 내부적으로 템플릿과 PHP 스크립트 복사본을 컴파일한다. 이를 통해 템플릿 태그 구문 뿐만 아니라 PHP 처리 속도 향상이라는 장점을 얻는다. 각 템플릿이 처음 호출될 때 컴파일이 이루어지며, 이후로는 컴파일된 버전이 사용된다. 이 모든 작업을 스마티에서 처리하므로, 템플릿 디자이너는 그저 스마티 템플릿을 수정하면 될 뿐, 컴파일된 버전을 관리할 필요가 없어진다. 따라서 템플릿을 유지보수하기가 쉬워질뿐만 아니라, 처리 속도 또한 상당히 빨라진다. 컴파일된 버전 또한 PHP 코드이므로 APC나 ZendCache와 같은 op-code 가속기는 컴파일된 스크립트에도 여전히 적용할 수 있다.



템플릿 상속

스마티 버전 3에서는 템플릿 상속 기능이 추가되었는데, 이는 스마티의 강력한 기능 중 하나이다. 템플릿 상속이 없었을 때에는 헤더(header) 템플릿, 푸터(footer) 템플릿과 같은 단위로 템플릿을 관리했다. 이러한 구조화는 그 자체로 많은 문제점을 낳았으며, 페이지 단위로 헤더/푸터에 컨텐츠를 관리하는 마구잡이 방식이 나타났다. 템플릿 상속을 사용하면 다른 템플릿을 포함하는 대신에, 템플릿을 하나의 페이지로 관리할 수 있다. 그리고 템플릿을 상속받고, 상속받은 템플릿 내에서 컨텐츠 블록을 조작할 수 있다. 이를 통해 템플릿을 더 쉽게 이해할 수 있게 되었고, 쉽고 효율적으로 관리할 수 있다. 더 자세한 내용은 템플릿 상속을 살펴보라.



XML/XSLT 구문을 사용하지 않는 이유는?

여기에는 몇가지 근거가 있다. 먼저, 스마티는 XML/HTML 기반 템플릿이 제공하지 못하는 일들을 할 수 있다. 예를 들어 이메일, 자바스크립트, CSV, PDF 문서 등을 생성할 수 있다. 둘째, XML/XSLT 구문은 PHP 코드보다도 장황하며, 실수하기도 쉽다. XML/XSLT 구문은 컴퓨터가 보기에는 완벽하지만, 사람이 보기에는 끔찍한 구문이다. 스마티는 사람이 쉽게 읽을 수 있고, 이해할 수 있으며 관리하기 위해 만들어졌다.



템플릿 보안

스마티는 PHP 코드를 분리할 수 있지만, 여러분이 원하는 방식으로 사용할 수 있다. 템플릿 보안은 PHP에 제한을 가한다. 이는 써드 파티 편집 템플릿을 사용하고 있고, PHP와 스마티의 완전한 기능을 모두 허락하고 싶지 않은 경우에 유용하다.



또다른 템플릿 엔진들..

스마티는 "프로그래밍코드와 프레젠테이션의 분리" 철학을 따르는 유일한 템플릿 엔진은 아니다. 예를 들어 파이썬에서는 장고(Django) 템플릿, 치타(Cheetah) 템플릿과 같이 동일한 원칙을 따르는 템플릿 엔진이 만들어졌다.

주석: 파이썬과 같은 언어는 태생적으로 HTML과 섞어 쓰지는 않으므로, 프로그래밍 코드와 외부 코드를 적절히 분리해서 사용할 수 있는 장점이 있다. 하지만 파이썬과 HTML을 섞어서 쓸 수 있는 라이브러리가 존재한다. 하지만 이러한 방식은 피해야 한다.



스마티가 지원하지 못하는 것들

스마티는 어플리케이션 개발 프레임워크는 아니다. 스마티는 MVC가 아니다. 스마티는 Zend 프레임워크, CodeIgniter, CakgePHP와 같이 PHP 개발을 위한 어플리케이션 프레임워크가 아니다.


스마티는 템플릿 엔진이며, 어플리케이션 내에서 V(iew) 컴포넌트로만 동작한다. 스마티는 위에서 언급한 모든 프레임워크가 쉽게 결합하여, 뷰 컴포턴트로 사용할 수 있다. 물론 다른 소프트웨어와 마찬가지로, 스마티를 배우기 위해선 노력이 든다. 스마티 자체가 좋은 어플리케이션 설계 또는 적절한 프레젠테이션 분리를 보장하는 것은 아니다. 이는 컴포넌트 개발자와 웹 디자이너가 여전히 고민해야할 요소다.



내게 정말 스마티가 필요한가?

스마티를 모든 경우에 사용할 수 있는 것은 아니다. 따라서 스마티가 당신에게 정말로 적합한지 확인하는 과정이 매우 중요하다. 아래와 같은 질문을 스스로에게 물어보라.

  • 템플릿 구문(Template Syntax)
    PHP와 HTML 태그를 섞어서 쓰더라도 만족하는가? 웹 디자이너가 PHP에 익숙한가? 웹 디자이너가 프레젠테이션에 특화된 태그 기반의 구문을 더 선호하는가? 얼마간 스마티와 PHP를 함께 사용해 보면, 정답을 찾을 수 있을 것이다.
  • 비즈니스 상황(Business Case)
    템플릿을 PHP로부터 분리해야 하는 요구사항이 있는가? 믿을만하지 않은 써드 파티에서 만든 편집 텝플릿을 사용하고 있고, PHP 코드의 완전한 기능을 해당 편집 템플릿에 허락하고 싶지 않은가? 템플릿에서 사용할 수 있는 것과 사용할 수 없는 것을 프로그래밍적으로 제어할 필요가 있는가? 스마티는 이러한 기능을 제공하기 위해 만들어졌다.
  • 기능 집합(Function Set)
    캐싱, 템플릿 상속, 플러그인 아키텍처와 같은 스마티 기능을 사용하면 해당 코드를 직접 개발하지 않아도 되므로 개발 사이클을 단축시킬 수 있는가? 사용하려는 코드베이스 또는 프레임워크에서 프레젠테이션 컴포넌트를 제공하는가?

또한 스마티 웹사이트에서 유스케이스와 워크플로우를 살펴보라.



스마티를 사용하는 사이트들

스마티 웹 사이트에는 매일 유니크한 수만명의 사용자가 방문하며, 그들 중 대다수는 문서를 읽으려는 개발자들이다. 잘 알려진 PHP 프로젝트 중 많은 수가 스마티를 활용한다. 예를 들어 XOOPS CMS, CMS Made SImple, Tiki CMS/Groupware 등이 있다.



요약

스마티를 간단한 웹사이트를 위해서 사용하든지 아니면 대규모의 기업 솔루션을 개발하기 위해 사용하든지 관계없이 여러분이 필요한 것들을 만족시켜줄 것이다. 스마티를 선택해야만 하는 이유에는 여러가지가 있다.

  • PHP와 HTML/CSS는 반드시 분리해야 한다.
  • 쉽게 구조화하고 관리가 편리하다.
  • 서드 파티 템플릿 접근에 대한 보안
  • 완전한 기능을 제공하며, 필요에 따라 쉽게 확장 가능하다.
  • 대규모 사용자를 기반으로 한다.
  • 상용의 경우 LGPL 라이선스
  • 100% 무료로 사용할 수 있는 오픈 소스 프로젝트


[참고자료]



Posted by socurites