2011. 5. 25. 11:01

Google App Engine의 Template (MVC 패턴)

위키피디아에서 정의된 MVC는 다음과 같습니다.

모델-뷰-컨트롤러(Model–View–Controller, MVC)는 소프트웨어 공학에서 사용되는 아키텍처 패턴이다. 이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다. MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 뷰는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리한다.


최근의 많은 웹 애플리케이션 개발시 보편적으로 사용되는 논리입니다. Ruby on Rails나 Spring 같은 것도 포함됩니다.

  • 컨트롤러 (Controller)
    결정을 내리거나 고려하는 일을 하는 로직에 관한 부분
  • 뷰 (View)
    HTML, CSS 등 보여지는(Look and Feel) 것을 처리하는 부분
  • 모델 (Model)
    데이터 저장소에 저장된 영속성 데이터

Google App Engine의 index.py같은 handler등은 컨트롤러에 해당되며, Template의 HTML 코드는 뷰가 됩니다. 그리고, GQL을 이용한 DB는 모델에 해당됩니다.

우선,
hander에서,


와 같이 구성됩니다.

그리고, _templ.htm에서,
[html]
... 정형화된 부분
[body]
... 정형화된 부분
{% block data_list %}
Replace
{% endblock}
[/body]
[/html]

와 같이 구성합니다. (<>대신에 []로 표기했습니다.)

이러한 template html에서 보듯이, 일반적으로 웹 페이지는 극히 일부분을 제외하고는 거의 같다는 가정에서 출발한 것입니다. 즉, a.htm / b.htm을 diff 해봤을때 90%정도 일치한다면, 나머지 10%를 위해 서로 copy & paste하는 것은 문제가 있다는 것입니다. 그래서, 일치하는 90%를 따로 _templ.htm으로 이관하고, 각각 나머지 10%를 a.htm, b.htm으로 정의하면 보다 작업이 수월할 것입니다.

그럼 해당 부분을 사용하는 부분은 다름과 같습니다.
(어떻게 생각해 보면, C/C++에서 #include 하는 것과 비슷한 논리죠)

{% extends "_templ.htm" %}
{% block data_list %}
[ul]
[li]first[/li]
[li]second[/li]
[/ul]
{% endblock %}

와 같이 정의합니다. 그러면, _templ.htm의 data_list 부분이 replace되어 표현됩니다.

그리고 python에서 template.render(temp, { 'name' : 'val'})과 같이 전달하면, _templ.htm에서 값을 받아 볼 수 있습니다. 즉, {% ifequal name 'greenfish' %}와 같이 정의된다면, 해당 값이 'greenfish' 일때 replace됩니다.