phpsource/템플릿2000. 8. 6. 16:15
유닛테이블에서는 데이터뿐만 아니라 레이아웃까지도 템플릿 요소로 구성되어 있고, 또한 템플릿 파일의 해석 결과를 가지고 그대로 HTML 태그를 생성하는 것이 아니라, 중간단계의 코드를 생성하며 이를 데이터베이스를 통해 중계하고 있어서 상당히 복잡한 편입니다. 그러나 설계 개념이 명확하기 때문에 이해하고 나면 아주 논리적이며, 덤으로 상당히 유연하게 프로그램을 개발할 수 있다는 것을 알게 될 것입니다.
이러한 설계 개념을 명확히 이해하여야 다음 장에서 설명하는 유닛테이블에서 사용하는 템플릿상수 및 템플릿 변수를 제대로 이해할 수 있습니다. 앞장 "유닛테이블의 동작"을 다시 한번 살펴보시고 아래를 보시기 바랍니다. "유닛테이블의 동작"에서 언급된 유닛테이블의 동작 메커니즘은 기능성을 중심으로 설명하였고, 여기서는 이를 데이터형식을 중심으로 나타내 보겠습니다.
< 각 엔진의 데이터형식 >
데이터형식 UTIS(UnitTable Input String), UTOS(UnitTable Output String)
UTIS 형식은 템플릿 파일에서 사용되는 문자열 표현방법으로 템플릿 파일에 대하여는 앞장 "템플릿 파일의 구성", "모드 및 속성지정자"와 "레이아웃을 위한 자료구조"에서 설명하였고, UTOS 형식은 우리가 알고 있는 HTML 태그로 구성된 HTML 파일에서 사용되는 형식으로 parseprint() 함수로 생성되는 HTML 파일의 내용이 그대로 메모리에 저장되어 있는 것과 같습니다.
데이터형식 UTEA(UnitTable Element Array)
유닛테이블에서 가장 중요한 데이터형식이 바로 UTEA 형식입니다. "유닛테이블의 동작 메커니즘"에서도 살펴보았듯이 템플릿 파일이 변경되었을 때와 변경되지 않았을 때의 parse() 메소드가 동작하는 것이 다릅니다. 우선 템플릿 파일이 변경되었을 때, parse() 메소드를 실행하면 UTIS 데이터(템플릿 파일)를 입력받아 UTEA 형식의 배열 데이터를 생성한 후 데이터베이스 엔진으로 UTEA 데이터를 보내어 데이터베이스 엔진에서 배열을 직렬화(serializing)한 후 데이터베이스에 저장하여 줍니다. 두 번째의 경우로 템플릿 파일이 변경되지 않았을 때, parse() 메소드를 실행하면 데이터베이스로부터 직렬화된 데이터를 읽어들여 배열화(unserializing)하여 UTEA 형식의 데이터로 바꾼 후 메모리에 올립니다.
htmlprint() 메소드에서는 메모리에 있는 UTEA 형식의 중간코드를 해석하여, UTOS 형식의 HTML 태그를 생성한 후 웹브라우저의 화면으로 데이터를 전송합니다.

Posted by 방글24
phpsource/템플릿2000. 8. 6. 16:10
현재 홈페이지에서 사용되는 레이아웃을 위한 기술이 거의 TABLE 태그를 이용한다는 것은 대부분 알고 있을 것입니다. 이러한 TABLE 태그가 보통 여러 층으로 중첩하여 사용하게 되는데, 이렇게 다층으로 구성된 페이지에서 시작 태그와 종료태그 짝을 실수하지 않고 맞추기가 쉽지 않고 전체의 구조를 한 눈에 파악하기도 쉽지 않죠.
유닛테이블에서는 이러한 문제를 해결하기 위해 자료구조론에서 언급하고 있는 트리구조(tree structure)를 템플릿 파일의 데이터를 표현하는데 도입했습니다. 프로그래머라면 전산학의 자료구조론에 대하여는 기본적으로 이해하고 있을 것으로 판단되어 자료구조론에서 사용되는 용어를 아무런 설명 없이 유닛테이블의 자료구조를 설명하는데 사용하겠습니다.
< 연결리스트로 표현한 트리구조 >
트리의 각 마디(node)는 한 짝의 "<TABLE>...</TABLE>"을 표현하며, TABLE 태그를 절대로 중첩시키지 않습니다. 즉, 하나의 단일 TABLE(Unit Table) 만 나타나게 됩니다. 만일 현재 마디에 해당하는 TABLE 태그에 포함된 자식 TABLE이 있다면 현재 마디에서 포인터를 이용하여 한 단계 하위 레벨에 해당하는 마디를 연결하게 됩니다. 즉, 유닛테이블의 자료구조는 단일연결리스트(singly linked list)로 표현한 방향성을 지닌 트리구조입니다. 최대날차수(outdegree)는 제한되지 않으므로 각 마디는 하위 레벨의 마디 수만큼의 포인터를 가지게 됩니다.
이와 같이 상위마디와 하위마디, 즉 부모 TABLE과 자식 TABLE을 연결해주는 포인터 역할을 하는 것이 모드지정자 value 내에 지정된 속성지정자 table입니다. 템플릿을 아래와 같이 정의하였다면 이에 해당되는 레이아웃 구조는 하나의 부모 테이블 밑에 자식 테이블이 3개 중첩되어 있는 것입니다.
;table:main
; group:
; td: value=table:top
; td: value=table:middle
; td: value=table:bottom
[code html;gutter:false] <TABLE> <!-- 부모테이블 "main"--> <TR> <TD> <TABLE> <!-- 자식테이블 "top" --> </TABLE> </TD> <TD> <TABLE> <!-- 자식테이블 "middle" --> </TABLE> </TD> <TD> <TABLE> <!-- 자식테이블 "bottom" --> </TABLE> </TD> </TR> </TABLE> [/code]
이와 같은 트리구조를 이용하여 무한대로 테이블을 중첩시킬 수 있으며 각 테이블의 부모자식관계를 쉽게(?) 인식할 수 있게 됩니다.
이젠 여러분이 제가 왜 저의 페이지툴의 핵심엔진을 유닛테이블이라고 명명했는지 이해하실 것입니다. 또 하나의 이름 페이지웍스 엔진은 유닛테이블 엔진에 몇 가지 정보(주로 HEAD 정보)를 추가하여 페이지 전체에 대한 HTML 태그를 다루는, 즉 페이지를 다룬다는 의미이지만 사실 기술적으로 보면 유닛테이블에 약간의 포장을 가한 포장술에 불과합니다.

Posted by 방글24
phpsource/템플릿2000. 8. 6. 16:05
지정자는 뒤에 따라오는 값이 사용되어야 하는 사용 처를 알려주는 역할을 합니다. 앞장에서 설명한 바와 같이 지정자에는 등호(=)의 좌측에 올 수 있는 모드지정자와 콜론(:)의 좌측에 올 수 있는 속성지정자가 있습니다.
;table:top ctrl=cols:3 attrib=border:0;width:96%
;   group:
;        td: value=desc:$v1  attrib=colspan:3;height:20
;        td: value=gfunc:$v8 attrib=align:center;colspan:3
;        td: value=gvar:$v9  attrib=height:19;colspan:3
;        td:                 attrib=colspan:3;height:19
모드지정자명(이하 모드명)과 속성지정자명(이하 속성명)은 미리 지정된 키워드이며, table, group, td를 제외한 모든 속성지정자는 반드시 모드지정자를 가지고 있으며, 각 모드지정자에 속한 속성지정자도 정하여져 있습니다. 지정된 모드지정자명과 각 모드지정자 별로 포함할 수 있는 속성지정자는 아래와 같습니다.
모드명 -> value, attrib, style, ctrl, (id)
속성명
    (id)   모드 -> table, group, td
    value  모드 -> desc, gfunc, gvar, mfunc, mvar, file, table
    attrib 모드 -> border, width, colspan, height, align 와 같이
                   HTML 태그 내에 포함될 수 있는 모든 속성명
    style  모드 -> background-color, text-align 와 같이 스타일
                   내에 포함될 수 있는 모든 스타일명
    ctrl   모드 -> cols, repeats
모드지정자 id
다른 모드지정자는 속성지정자 좌측에 반드시 표시하여야 하지만 id 모드지정자는 생략할 수 있으며 따라서 속성지정자 table, group, td로만 나타낼 수 있습니다. 지정위치는 다른 모드지정자보다 먼저 나타나야 합니다.
id 모드지정자를 생략한 경우

;table:top ctrl=cols:3 attrib=border:0;width:96%
;    group:
;        td: value=desc:데이터 attrib=colspan:3;height:20

id 모드지정자를 지정한 경우

;id=table:top ctrl=cols:3 attrib=border:0;width:96%
;    id=group:
;        id=td: value=desc:데이터 attrib=colspan:3;height:20
하나의 속성지정자 "table" 이 "<TABLE>...</TABLE>" 한 짝, 하나의 속성지정자 "group" 이 하나 이상의 "<TR>...</TR>" 짝, 하나의 속성지정자 "td" 가 "<TD>...</TD>" 한 짝을 나타냅니다.
속성지정자 "table"에 지정해야 하는 속성 값을 table identification이라고 하며, 약자로 tid 라고 합니다. 또한 속성지정자 "group"의 속성 값을 group identification(gid), 속성지정자 "td"의 속성 값을 field identification(fid) 라고 합니다.
tid는 반드시 지정하여야 하고 현재 페이지에서 사용되는 하나 이상의 템플릿 파일에서 유일한 값이어야 합니다. 또한 최상위 유닛테이블의 tid는 아래와 같이 "main"으로 지정하여야 합니다. c언어에서 제일 먼저 접근하는 함수명이 main()함수인 것처럼 가장 밖에 위치하는 테이블 태그를 생성하는 유닛테이블의 tid 값도 "main"으로 지정되어 있습니다.
;table:main attrib=width:740px;border:0;cellpadding:0;/
                   cellspacing:0
;  group: attrib=bgcolor:white;align:center
;    td: value=table:top  attrib=valign:bottom
;    td: value=table:middle attrib=valign:top
;    td: value=table:bottom attrib=valign:top
gid, fid는 특별한 이유가 없으면 지정할 필요가 없습니다. 지정해도 실행에는 전혀 문제가 없지만, 그래도 지정하지 않는 것이 편하겠지요. 지정하지 않으면 유닛테이블 엔진이 알아서 gid, fid를 지정해 줍니다. 유닛테이블에서 지정되는 gid는 g01, g02, ..., fid는 f01, f02, ... 같이 순차적으로 이루어지지요. 해당 gid, fid의 모드지정자 value, attrib, style, ctrl의 속성 값들을 다이내믹(?)하게 조작할 필요가 있을 때 gid, fid 값을 사용자가 임의로 정하면 됩니다. 이런 경우의 예제는 뒷장의 "고급 메소드"를 설명할 때 보여주려고 하지만 고급 메소드 부분은 당분간 언급할 생각이 없습니다. 고급 메소드에 대한 인터페이스를 아직 확정하지 못하고 있어서 그렇거든요. 내부적으로는 이미 세부적인 것까지 다룰 수 있도록 되어 있지만, 인터페이스 설계를 잘못하면 향후 업그레이드할 때 상당히 애를 먹거든요. 그래서 여러분의 반응을 보아가면서 인터페이스를 결정하려고 합니다.
모드지정자 value
레이아웃 내에 들어갈 데이터를 지정해 주는 곳으로, 지정할 수 있는 데이터는 아래와 같이 다양한 방법으로 제공받을 수 있습니다.
  1. 디스크립션
  2. PHP의 전역변수
  3. PHP의 전역함수
  4. PHP 클래스의 프로퍼티
  5. PHP 클래스의 메소드
  6. 별도의 텍스트 파일
위에서 나열한 디스크립션, 전역변수, 전역함수, 프로퍼티, 메소드 및 텍스트파일은 모두 템플릿 변수로 사용됩니다. 따라서 유닛테이블에서 수식어 없이 템플릿 변수라고 호칭할 때는 이 모두와, 여기에 템플릿 파일의 지역변수까지 포함한 것을 의미합니다. 각각의 요소를 사용하는 방법은 아래와 같습니다.
td: value=desc:{어제는 비가 내리고}
td: value=gvar:g_msg
td: value=gfunc:g_func()
td: value=mvar:m_msg
td: value=mfunc:m_func()
td: value=file:filename
desc:{어제는 비가 내리고}는 속성 값을 디스크립션으로 해석하여 "어제는 비가 내리고"를 TD 태그 내에 삽입되어 "<TD>어제는 비가 내리고</TD>"가 되며, gvar:g_msg은 속성 값 g_msg를 전역변수로 해석하여 PHP 코드의 전역변수 $GLOBALS[g_msg]의 값을 TD 태그 내에 삽입하고, gfunc:g_func()은 PHP 코드의 전역함수 g_func()의 return 값을 되돌려 받아 TD 태그 내에 삽입하고, mvar:m_msg와 mfunc:m_func()은 반드시 클래스 내에서만 사용되며, 각각 클래스 m_msg 프로퍼티 값과 m_func() 메소드의 리턴 값을 가지고 TD 태그에 삽입하여 HTML을 생성합니다. 마지막으로 file:filename은 TD 태그 내에 특정 텍스트파일을 포함시키고자 할 때 사용하는 방법으로 속성 값에는 TD 태그 내에 삽입하려는 파일명을 지정하여야 합니다.
모드지정자 value에 지정할 수 있는 속성지정자 중에 위에서 언급하지 않은 것이 또 하나 있는데 그것은 "table"입니다. 이 속성지정자는 레이아웃을 표현하기 위한 지정자로 이 지정자에 대하여는 뒷장 "레이아웃을 위한 자료구조"에서 자세히 살펴보겠습니다.
모드지정자 ctrl
ctrl 지정자에는 cols와 repeats 속성지정자가 있습니다. 이중 cols 지정자는 id가 table인 줄에만 포함할 수 있으며, repeats 지정자는 id가 tabel 또는 group인 줄에만 포함할 수 있습니다. 각각의 용도를 보면, cols 지정자는 현재 테이블의 최대 컬럼 수를 지정할 때 사용하고, repeats 지정자는 현재 요소를 반복 재생할 때 사용합니다. id=table에서 repeats를 사용하면 현재 "<TABLE>...</TABLE>"가 repeats에서 지정된 속성 값만큼 반복해서 나타나고, id=group에서 repeats를 사용하면 현재 grouping된 하나 이상의 "<TR>...</TR>" 짝이 repeats에서 지정된 속성 값만큼 반복해서 나타납니다.
모드지정자 attrib, style
attrib와 style 지정자는 태그의 속성과 스타일을 지정할 때 사용되는 것으로 HTML 태그 사용법을 알고 있다면 더 이상 설명이 필요 없을 것 같습니다.

Posted by 방글24
phpsource/템플릿2000. 8. 6. 16:02
구성 영역
템플릿 파일에 포함된 내용을 기능에 따라 구분하면 주석을 달아주는 "설명부분", 변수를 정의하는 "변수정의영역"과 템플릿 자체를 나타내는 "템플릿영역"으로 나눌 수 있습니다.
[code php;gutter:false] //
// 상단을 구성하는 유닛 테이블
//

$v1 = { [/code]
"설명 부분"은 "//"로 시작되는 한 줄 짜리 주석이 모여서 구성됩니다.
"변수정의영역"은 "템플릿영역" 또는 "변수정의영역"에서 사용된 변수를 정의해 주는 영역으로 PHP의 변수라고 생각하시면 됩니다. 정의된 이후부터 그 값이 유효하게 됩니다. 정의될 변수명은 PHP 변수명을 정의하는 방법과 동일합니다.
"템플릿영역"은 실제 홈페이지의 레이아웃과 데이터를 나타내는 부분으로 이 곳에 존재하는 데이터에는 값이 변하지 않는 데이터와 값이 변할 수 있는 데이터가 있습니다. 전자를 템플릿상수이라 하고, 후자를 템플릿 변수라고 합니다. 이 외에도 데이터의 용도를 나타내는 지정자가 있으며, 마지막으로는 지정자, 템플릿 변수, 템플릿상수를 구분해주는 구분자가 있습니다.
템플릿 영역
"템플릿 영역"은 아래와 같이 세미콜론(;)으로 시작됩니다.
;table:top ctrl=cols:3 attrib=border:0;width:96%
;    group:
;        td: value=desc:$v1  attrib=colspan:3;height:20
;        td: value=gfunc:$v8 attrib=align:center;colspan:3
;        td: value=gvar:$v9  attrib=height:19;colspan:3
;        td:                attrib=colspan:3;height:19
이 예에서 템플릿 변수, 템플릿상수, 구분자, 지정자를 구분해 보면 아래와 같습니다.
  템플릿 변수 -> $v1, $v8, $v9
  구분자    -> 스페이스, 등호(=), 세미콜론(;), 콜론(:), 콤마(,)
  지정자    -> table, group, td, ctrl, cols, attrib,
                value, desc, gfunc, gvar, border, width,
                colspan, height, align, colspan, height
  템플릿상수 -> top, 3, 0, 96%, 20, 19
지정자는 다시 2가지로 세분될 수 있습니다. 등호(=)의 좌측에 올 수 있는 모드(mode) 지정자와 콜론(:)의 좌측에 올 수 있는 속성(property) 지정자가 있습니다.
  모드지정자 -> ctrl, attrib, value,
  속성지정자 -> table, group, td, cols, desc, gfunc, gvar,
                border, width, colspan, height, align,
                colspan, height
템플릿상수는 "속성지정자:" 우측에 위치한 속성 값으로만 사용됩니다. 반면에 템플릿 변수는 템플릿영역(세미콜론으로 시작되는 영역)의 어느 곳이라도 놓여질 수 있습니다. 단, 템플릿영역을 의미하는 세미콜론(;), 변수정의영역의 $, 주석을 나타내는 //은 변수로 지정할 수 없습니다.

Posted by 방글24
phpsource/템플릿2000. 8. 6. 15:56
유닛테이블의 동작 메커니즘
데이터뿐만 아니라 레이아웃까지 해석해서 HTML을 생성한다는 것은 역시 오버헤드가 클 수밖에 없었습니다. 편하기는 한데(?) 템플릿을 해석해서 화면에 뿌려주는 시간이 좀 길더라고요. 저도 이것 때문에 고민을 많이 했죠. 그러다가 우연히 컴퓨터 잡지책을 보다보니 JSP와 서블릿 동작 메커니즘을 설명하는 기사가 있었어요. JSP는 한번도 사용해 본 일이 없기 때문에 코드야 다 이해할 수는 없었지만 그 기사에서 설명하는 동작 메커니즘에 대한 개념은 저에게 오버헤드를 해결할 수 있는 단서를 제공해 주었어요. 오! 이 기쁨....
추측하건대 JSP도 자바의 모든 것을 끌어안다 보니 자연히 그 실행속도에 문제가 되지 않았나 하는 생각이 들더군요.(물론 아닐지도 모르지만) 그래서 자연히 매번 실행할 때마다 해석하기보다는 JSP 스크립트 파일이 변경되었을 때만 다시 해석하여 서블릿 코드로 만들어 놓은 후 그 다음에 실행할 때는 JSP를 해석하는 것이 아니라 컴파일 된 서블릿 코드를 실행하는 것이지요.
그래서 유닛테이블 엔진에서도 템플릿을 PHP 스크립트가 실행될 때마다 해석하는 것이 아니라 템플릿 파일이 변경될 때만 실행할 수 있도록 했습니다. 그리고 처음 해석된 데이터는 데이터베이스에 저장시켜 놓았습니다. 해당 페이지에 2번째 접속할 때부터는 이미 해석된 데이터를 데이터베이스에서 읽어들여 이 데이터를 가공하여 HTML 태그를 생성시켰습니다. 그러고 나니 레이아웃 해석으로 인한 오버헤드는 거의 해결되었지요.
< 유닛테이블의 동작 메커니즘 >
유닛테이블의 구성 요소
그림에서 UT 엔진(Unit Table Engine)은 유닛테이블을 종합적으로 관리해주는 엔진이고, UTIS 엔진(Unit Table Input String Engine)은 템플릿 파일을 해석하여 해석 결과를 데이터베이스에 저장하는 엔진이고, UTOS 엔진(Unit Table Output String Engine)는 데이터베이스에 저장된 해석 데이터를 읽어와 HTML 태그를 생성해주는 엔진입니다. 이 모든 엔진은 클래스를 이용하여 작성되었으며 관련된 클래스들은 모두 차례대로 상속되어 하나의 객체로 생성되도록 하였습니다.
데이터베이스 테이블 생성(MySQL의 경우)
중간코드인 UTEA 데이터를 저장하게 되는 데이터베이스 테이블에 대한 스키마는 아래와 같습니다.
[code sql;gutter:false] CREATE TABLE 테이블명 ( id varchar(80) not null, value text not null, PRIMARY KEY (id) ); [/code]
id 필드는 페이지를 구별해주는 인식자이며, 데이터는 value 필드에 저장됩니다. 중간코드인 UTEA 데이터는 다차원배열 구조이므로 value 필드에 저장하기 전에 serialize() 함수를 이용하여 직렬화(serializing)시킵니다. 데이터베이스에서 데이터를 읽을 때는 unserialize() 함수를 이용하여 배열화(unserializing) 작업을 한 후 메모리로 데이터를 보냅니다.

Posted by 방글24
phpsource/템플릿2000. 8. 6. 14:29
홈페이지의 구성요소
홈페이지는 서로 독립적인 여러 개의 요소로 구성되어 있는데, 이를 분류하면 PREFIX, HEAD, BODY, SUFFIX 부분으로 나눌 수 있습니다. PREFIX부분은 HTML 태그 이전에 나타나는 부분으로 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>와 같이 문서 종류를 지정해 줍니다. HEAD 부분은 TITLE, META, CSS(Cascading Style Sheet), SCRIPT 부분으로 세분될 수 있고, CSS와 SCRIPT를 더 세분하면 현재 문서에 내장하는 스타일과 외부파일을 이용하는 스타일로 나눌 수 있습니다. 마지막에 나타나는 SUFFIX는 아직 홈페이지를 작성할 때 사용된 적은 없지만 개념상 포함시켰습니다.
방문객이 홈페이지에서 접할 수 있는 거의 모든 데이터는 BODY 부분에 저장되며, 따라서 가장 중요한 부분입니다. BODY 부분을 분석해 보면 레이아웃을 나타내는 HTML 태그(주로 TABLE, TR, TD 태그)와 그 안에 표시할 데이터로 나눌 수 있습니다.
  PREFIX

  HEAD -+- TITLE
            +- META
            +- CSS
            +- SCRIPT

  BODY -+- BODY 태그 속성
            +- 레이아웃
            +- 데이터

  SUFFIX
[code html;gutter:false] <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'> PREFIX 부분 <HTML> <HEAD>   HEAD 부분 </HEAD> <BODY>   BODY 부분 </BODY> </HTML>   SUFFIX 부분 [/code]
유닛테이블 엔진의 구성
홈페이지를 작성할 때 가장 어려움을 많이 느끼게 되는 BODY 부분의 레이아웃과 데이터는 유닛테이블 엔진에서 담당하고, 나머지 부분은 클래스 clsHtmltag로 작성된 Htmltag 엔진에서 담당합니다. 페이지웍스 엔진은 이 두 부분을 종합 관리해주는 엔진입니다. 각 클래스 엔진의 상속관계를 보면 아래의 그림과 같습니다.
< 유닛테이블 엔진의 상속관계(설계) >
위 그림으로 보면 많은 클래스가 다중 상속받고 있는데 PHP에서 이것이 가능하냐고요? 불가능하죠. PHP는 다중상속을 지원하지 않습니다. 따라서 PHP에서는 각 클래스를 독립적으로(객체 지향적으로) 작성하는 것이 무척 어렵지요. 위 그림은 클래스 설계를 이렇게 했다는 것을 보여줄 뿐입니다. 유닛테이블을 PHP 스크립트로 구현하다보니 다중상속이 불가능하여 할 수 없이(울며 겨자 먹기) 치졸한 단일상속으로 작성하였습니다. PHP 스크립트 코드로 작성된 실제 클래스 코드의 상속관계는 아래 그림과 같습니다.
< 유닛테이블 엔진의 상속관계(구현) >
참고로 제 웹사이트에서는 후키라이브러리를 이용하여 다중상속하고 있으며, 따라서 설계대로 각 클래스를 서로 독립적으로 작성, 관리하고 있습니다. 그러나 여기서 소개되는 공개용 버전은 PHP 스크립트가 지원하는 기능만을 사용하도록 원본의 내용을 대폭 수정하게 되었습니다. 또한 파일 크기를 줄이기 위해 페이지툴에서 사용하지 않는 메소드 또는 프로퍼티는 모두 삭제하였고, 특히 이 과정에서 데이터베이스 엔진은 완전히 다시 작성하게 되었습니다. 그러나 이러한 과정은 공개하기 위한 작업일 뿐이며, 페이지툴 자체의 기능이 축소되거나 삭제되지는 않았습니다.

Posted by 방글24
phpsource/템플릿2000. 8. 6. 14:15
유닛테이블은 템플릿 기능과 레이아웃 기능을 모두 가지고 있는 페이지툴!!!
  • FastTemplate와 같은 템플릿 기능
  • VH layout과 같은 페이지 레이아웃 기능
ut-0.1.3의 사용 환경
  • PHP(3 또는 4) + DB Layer(MiniDB, PHPLIB)
  • DB Layer에 따른 지원 데이터베이스
    - MiniDB : MySQL, 오라클(ORA), 오라클(OCI), PostgreSQL, SyBASE, MSQL, MSSQL
    - PHPLIB : MySQL, 오라클(ORA), 오라클(OCI), PostgreSQL, SyBASE, MSQL, MSSQL, ODBC
데이터베이스 PHPLIB 7.2 Mini DB 0.1.1
MSQL O O
MSSQL O O
MySQL O O
Oracle(OCI) O O
Oracle(ORA) O O
ODBC O X
PostgreSQL O O
SyBASE O O
PHPLIB의 라이브러리를 사용하면서 발생하는 문제는 해당 웹사이트의 게시판을 통해 문제점을 해결하세요. phpCLASS 홈페이지에서는 MiniDB에 대한 질문만 받습니다.
템플릿 파일 구성
홈페이지를 구성하는 레이아웃과 기본 데이터는 별도의 템플릿 파일로 처리합니다. 구성된 레이아웃 내에 채워질 데이터는 아래와 같이 다양한 방법으로 제공될 수 있습니다.
  1. 템플릿 파일 내의 지역변수를 이용하는 방법
  2. PHP의 전역변수를 이용하는 방법
  3. PHP의 전역함수를 이용하는 방법
  4. PHP 클래스의 프로퍼티를 이용하는 방법
  5. PHP 클래스의 메소드를 이용하는 방법
  6. 별도의 텍스트 파일을 이용하는 방법
아래는 임의의 템플릿 파일을 예로 나타내었습니다.
// 기본 패널을 구성하는 유닛 테이블

;table:main attrib=width:740px;border:0
;    group: attrib=bgcolor:white;align:center
;        td: value=table:top    attrib=valign:bottom
;        td: value=table:middle attrib=valign:top
;        td: value=table:bottom attrib=valign:top
;table:middle ctrl=cols:3 attrib=border:0;width:96%
;    group:
;        td: value=table:left  attrib=width:150px
;        td: value=table:center
;        td: value=table:right  attrib=width:140px
 
// 상단을 구성하는 유닛 테이블

$v1 = {
템플릿 파일은 PHP와 전혀 관계없는 일반 텍스트 파일이며, 파일 내용은 아래와 같이 세 부분으로 구분됩니다.
"//"로 시작되는 것은 한 줄 짜리 주석을 나타냅니다.
"$"로 시작되는 것은 템플릿 파일 내에서만 사용되는 지역변수를 나타냅니다.
마지막으로 ";"로 시작되는 부분이 실제 사용되는 템플릿 영역입니다. 하나의 "table:"이 "<TABLE>...</TABLE>"를 나타냅니다. "table:" 바로 아래에 있는 "group:"이 하나 이상의 "<TR>...</TR>" 짝을 나타냅니다. 그 밑에 있는 여러 개의 "td:" 각각이 "<TD>...</TD>"를 나타냅니다.
PHP 코드의 구성
아래는 PHP 코드 부분을 나타낸 것으로 서버사이드 스크립트에서 처리할 내용이 가장 먼저 나타나고, 페이지웍스(유닛테이블 내포) 클래스에 대한 객체를 생성하고, 유닛테이블에 들어갈 데이터를 할당하고, 마지막으로 할당된 데이터와 템플릿에 설정한 레이아웃 구조를 해석하여 필요한 HTML 태그를 생성하고 출력해주는 parseprint() 메소드를 실행합니다.
[code php;gutter:false] <?php //====================================== // 서버사이드 스크립트에서 처리할 내용 //====================================== //====================================== // 객체 생성 부분 //====================================== require("./minidb-0.1.1/class.mysql.php"); // 변경된 부분 require("./class.pageworks.php"); // 변경된 부분 $argv = array("host"=>"localhost", "user"=>"", "passowrd"=>"", "database"=>"", "table"=>"admin_page", "pagestatic"=>"test"); $pw = new clsPageworks($argv); //=============================== // 유닛테이블 템플릿 변수 //=============================== function center_news($tid, $gid, $fid) { return "2000.7.13 PHP4부터 ..." . "2000.7.12 PHP에서 공식적으로 ...<BR>"; } $title = "핍클래스홈(phpCLASS HOME)"; $msg = "본 페이지는 기존의 페이지툴들을 서로 비교&평가..."; //=========================== // 유닛테이블 실행(HTML 생성) //=========================== $pw->unittable( ".", array( "test.ut" ), array( "dir_home"=>"./.." ) ); $pw->head("title", "PHP Class Community"); $pw->head("author", "hwooky"); $pw->head("keywords", "class,클래스,상속,객체"); $pw->head("description", "어서 오시 와요"); $pw->parseprint($modify); ?> [/code]
템플릿 파일은 하나로 만들어도 되고 필요에 따라 여러 개의 파일로 나누어서 작성하여도 됩니다. 파일을 관리하기에는 하나의 파일이 유리하나 다른 페이지와 템플릿을 공유할 때는 나누어서 작성하는 것이 유리합니다.

Posted by 방글24
phpsource/템플릿2000. 8. 6. 13:42
VH layout은 레이아웃툴!!!
  • "VH layout"은 대부분의 HTML 태그를 함수(전역함수 및 클래스의 메소드)로 표현하였습니다.
  • "FastTemplate"에서 표현하기가 곤란한 레이아웃용 TABLE 태그를 제한 없이 다층으로 중첩하여 표현할 수 있도록 하였습니다.
  • 템플릿 기능이 없습니다.
아래에 "VH layout"을 이용하여 페이지를 작성하는 예를 나타내었습니다. 보시는 바와 같이 insert() 함수를 이용하여 필요한 객체를 필요한 만큼 삽입시킨 후 printhtml() 함수로 페이지를 작성합니다. 아래에 보면 setdefault(), newhtml(), insert(), wheader(), table(), cell(), text() 등 전역함수들이 몇 개 보이는데 이 외에도 태그에 관련된 많은 함수들이 제공되고 있습니다. 이들 전역함수들은 내부적으로 클래스로 작성된 코드를 이용하여 매번 새로운 객체를 생성하고 있습니다.
[code php;gutter:false] <?php include('class.layout'); setdefault("window",array("bgcolor"=>"#FFFFFF")); newhtml(&$w); insert($w,$h = wheader("PHP Class Community")); insert($w,$t = table(array("width" => "600px"))); insert($t,$c = cell(array("bgcolor"=>"#cccccc"))); insert($c,text("내용이 들어가요.")); printhtml($w); ?> [/code]
평가
위에서 언급하였듯이 VH layout은 "FastTemplate"에서 표현하기가 곤란한 레이아웃용 TABLE 태그를 제한 없이 다층으로 중첩하여 표현할 수 있도록 하였습니다. 그러나 실행할 때 레이아웃 구조 및 데이터를 분석하여 페이지를 작성하기 때문에 속도가 늦습니다. 그리고 태그를 함수로 나타내다보니 전체 레이아웃을 파악하기가 쉽지 않습니다. 실제로 뒷장에 나오는 예제를 제 홈페이지의 HTML 태그를 기준으로 FastTemplate, VH layout, UnitTable을 가지고 작성하려고 했는데 VH layout은 중간에 포기하고 말았습니다. 물론 제가 VH layout을 제대로 다루지 못하는 것이 가장 큰 이유이기도 하지만 무엇보다 레이아웃 구조를 함수로 표현하다보니 가독성이 떨어져서 중첩된 레이아웃의 부모-자식의 관계를 쉽게 나타낼 수가 없었어요. 그래서 예제의 모델이 된 제 홈페이지를 표현하는 것은 포기하고 대신 VH layout에서 받은 예제를 거의 그대로 하여 예제로 올렸습니다. VH layout은 레이아웃 전용툴이기 때문에 템플릿 기능이 없습니다.
AH layout에 대한 더 자세한 사용법이나 특징은 이곳(www.vhconsultants.com)을 방문하세요.
(수정:2010.1.11) 오래된 문서라서 현재는 링크가 깨진 상태입니다. 아래 복사본을 참조하세요.

'phpsource > 템플릿' 카테고리의 다른 글

{유닛테이블}06.구성  (0) 2000.08.06
{유닛테이블}05.개요  (0) 2000.08.06
{유닛테이블}03.FastTemplate의 소개  (0) 2000.08.06
{유닛테이블}02.페이지툴의 필요성  (0) 2000.08.06
{유닛테이블}01.페이지툴  (0) 2000.08.06
Posted by 방글24
phpsource/템플릿2000. 8. 6. 13:30
FastTemplate는 템플릿툴!!!
아래에는 "FastTemplate"로 작성된 템플릿을 보여주고 있습니다. 이 템플릿에는 {TITLE}라는 변수가 포함되어 있으며 이 변수는 출력하기 전에 실제 값으로 치환됩니다. 하나의 페이지를 완성하기 위한 단계는 아래와 같습니다.
  1. 템플릿 이름을 파일 이름으로 맵핑하기 : 메소드 define()
  2. 값을 템플릿 변수에 지정하기 : 메소드 assign()
  3. 템플릿 분석하기 : 메소드 parse()
  4. HTML 출력하기 : 메소드 FastPrint()
[code html;gutter:false] <!-- NAME: main.tpl --> <html> <head><title> {TITLE} </title> </head> <body> </body> </html> <!-- END: main.tpl --> [/code]
[code php;gutter:false] <? // Example FastTemplate Demo #1 - The example from the man page Header("Content-type: text/plain"); include("class.FastTemplate.php3"); $tpl = new FastTemplate("./templates"); $tpl->define( array( main => "main.tpl", ) ); $tpl->assign( array( TITLE => "FastTemplate Test") ); $tpl->parse(MAIN, array("main")); $tpl->FastPrint(); ?> [/code]
평가
PHP4가 동작되는 서버 상에서의 스크립트 수행속도가 VH layout이나 UnitTable보다 2배정도 빠릅니다. 그러나 레이아웃이 복잡하여 TABLE 태그가 다층으로 중첩되어 있는 페이지에 대한 템플릿을 보면 템플릿 내에 TABLE 태그가 그대로 나타나 있어 템플릿 자체가 복잡합니다. 즉 TABLE 태그 내에 들어가는 데이터가 치환되는 것이지 레이아웃에 사용된 TABLE 태그를 해석하여 생성해주는 기능은 빠져 있습니다. VH layout이나 UnitTable은 모두 레이아웃을 표현하고 생성해주는 부분이 포함되어 있으며, 이것 때문에 FastTemplate보다 다소 수행속도가 느리다고 볼 수 있습니다. 따라서 레이아웃은 빼고 데이터만 템플릿에 표현하고 싶으신 분은 FastTemplate를 사용하시는 것이 바람직합니다.
FastTemplate에 대한 더 자세한 사용법이나 특징은 이곳(www.thewebmasters.net) 을 방문하시거나 아니면 컴퓨터 서적 "professional PHP Programming"의 제22장 템플릿을 참조하세요......

'phpsource > 템플릿' 카테고리의 다른 글

{유닛테이블}06.구성  (0) 2000.08.06
{유닛테이블}05.개요  (0) 2000.08.06
{유닛테이블}04.VH layout의 소개  (0) 2000.08.06
{유닛테이블}02.페이지툴의 필요성  (0) 2000.08.06
{유닛테이블}01.페이지툴  (0) 2000.08.06
Posted by 방글24
phpsource/템플릿2000. 8. 6. 13:27
PHP 코드와 HTML 태그를 분리하면???
서버사이드 스크립트로 작성된 소스코드를 보면 스크립트 문장하고 HTML 태그가 혼재되어 있어 매우 혼란스럽기도 하며, 또한 도무지 전체 흐름이 파악하기가 쉽지 않습니다. 그 외에도 웹사이트가 복잡해 지다보면 이러한 방식으로는 관리하기도 어렵고, 향후 홈페이지를 수정하는 작업도 보통문제가 아니라고 생각하였습니다. 그래서 서버사이드 스크립트에서 작업한 PHP 코드와 방문자 인터페이스를 담당하게 될 HTML 태그를 분리하면 이러한 문제를 다소나마 해결할 수 있을 것으로 판단되어 "PHP코드와 HTML태그의 분리" 방법으로 템플릿과 레이아웃 기술을 제 홈페이지에 적용하기 시작했고, 적용하기 전에 템플릿과 레이아웃 기술을 구현할 수 있는 툴을 개발하게 되었죠. 개발하기 전에 "FastTemplate"와 같은 좋은(?) 툴이 있다는 것을 알았다면 개발을 좀 더 쉽게 할 수도 있었을 텐데, 그러지 못해 좀 투박한 상태로 사용해 오다가 보름 전부터 "FastTemplate"와 "VH layout"을 참조하여 유닛테이블의 인터페이스 부분을 대폭 수정하였고, 이제 여러분과 정보를 공유하고자 유닛테이블의 소스코드를 공개합니다.
템플릿툴 또는 레이아웃툴을 사용하여 얻게 되는 이점을 보면 우선 개발속도를 높일 수 있고, 소스 코드의 가독성을 높일 수 있으며, 웹사이트 전체에 걸쳐 반복되는 부분을 재 사용할 수 있어 툴에 따라서는 사용자가 직접 작성해야 할 코드의 양을 상당히 줄일 수 있고, 아울러 관리 및 향후 수정을 용이하게 해줍니다.
장점이 있으면 단점도 있겠지요. 새로운 기술을 적용하다보니 처음 보는 사람은 오히려 복잡해 보입니다. 이해하기도 어렵고요. 또한 스크립트 수행속도가 느려집니다. 그러나 뒤에서 언급될 각 페이지툴에 대한 예제를 실행해보면 알겠지만 인터넷상에서는 페이지툴을 사용할 때나 안 할 때나 속도차이를 별로 느낄 수 없습니다. 이는 서버의 수행속도보다 네트워크의 전송속도가 훨씬 느리기 때문이죠. 페이지툴을 사용한다고 해서 전송되는 데이터 양이 늘어나는 것은 아니며, 단지 서버에서 처리해야 할 데이터 양이 많아지는 것입니다.
어쨌든 페이지툴을 적용하면 단점도 따르기 때문에 모든 페이지에 페이지툴을 적용하기보다는 간단한 개인 홈페이지는 기존에 하던 대로 "HTML 태그 내에 PHP 코드를 삽입하는 방식"을 사용하는 것이 효율적일 수도 있을 겁니다. 반면에 대부분의 상용 홈페이지와 같이 레이아웃 또는 디자인 구조가 다소 복잡한 코드에서는 가능한 한 페이지툴을 적용할 필요가 있을 것 같습니다.
즉, 좀더 정돈된 페이지를 구성하기 위해서는 레이아웃을 위해 TABLE 태그를 여러 층으로 중첩하여 사용하게 되는데, 이렇게 다층으로 구성된 페이지에서 시작 태그와 종료태그 짝을 실수하지 않고 맞추기가 쉽지 않고 전체의 구조를 한 눈에 파악하기도 쉽지 않죠. 또한 웹사이트 내에 있는 여러 페이지의 일부분을 동일한 형태(레이아웃 또는 데이터)로 반복되는 부분이 많을 경우 매 페이지마다 동일한 부분을 매번 별도로 작성한다는 것은 문서를 작성하기도 불편하고 관리하기도 쉽지 않습니다.

'phpsource > 템플릿' 카테고리의 다른 글

{유닛테이블}06.구성  (0) 2000.08.06
{유닛테이블}05.개요  (0) 2000.08.06
{유닛테이블}04.VH layout의 소개  (0) 2000.08.06
{유닛테이블}03.FastTemplate의 소개  (0) 2000.08.06
{유닛테이블}01.페이지툴  (0) 2000.08.06
Posted by 방글24