조금 색다른 스킨처리 방식을 소개할까한다.
먼저 말하자면, 서버 부하나 이런것에 대한 고려는 전혀 이루어지지 않았다. 단지, 디자이너가 쓰기 편한 그래서 내가 손을 대지 않아도 되는 방법을 생각하다가 나온 꽁수에 가까운 방법이기 때문이다. 하지만 실제로 내가 하는 개발은 다 이딴식으로 이루어지고 있다.
난…
같은 일 두번하는게 정말 싫다. -_-;;
.
.
.
보통 최근 게시물을 만들때 “따로” 만들어진 파일에 스킨도 박아넣고 iframe 이나 혹은 조금 이해하기 어려운 구조로 최근게시물을 사용한다. 그래서, 자신의 작업물과 분위기를 맞추기 위해서 많은 삽질을 한다.
다음 코드를 보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
| < ?php
// Define skin pattern
define('SKIN_PATTERN', ';<s:(.+)>(.*)|\{([a-z_]+)\};isU');
// MySQL Connection
$conn = mysql_connect('localhost', '*****', '****');
mysql_select_db('*****');
function skin_start($page, $table)
{
global $current_table, $skin_page;
$current_table = 'gb_write_'.$table;
$skin_page = $page;
ob_start();
}
function skin_end()
{
global $current_table, $skin_data, $skin_page;
$skin = ob_get_contents();
ob_end_clean();
$skin_data = array();
$res = mysql_query('SELECT wr_subject as subject, wr_id, UNIX_TIMESTAMP(wr_datetime) as regdate FROM '.$current_table.' WHERE wr_comment=0 order by wr_id desc limit 0, 5');
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
if (strlen($row['subject']) > 30) {
$row['subject'] = mb_strcut($row['subject'], 0, 30).'...';
}
$row['link'] = $skin_page.'?wr_id='.$row['wr_id'];
$row['date'] = date('m/d', $row['regdate']);
$skin_data[] = $row;
}
$skin = preg_replace_callback(SKIN_PATTERN, 'skin_callback', $skin);
echo $skin;
}
function skin_callback($m)
{
global $skin_data;
static $rowidx;
if ($m[1]) {
switch ($m[1]) {
case 'nodata':
if (count($skin_data) > 0) return '';
else return preg_replace_callback(SKIN_PATTERN, 'skin_callback', $m[2]);
case 'data':
$loop = count($skin_data);
if ($loop == 0) return '';
else {
$ret = ''; $rowidx = -1;
while (++$rowidx < $loop) {
$ret .= preg_replace_callback(SKIN_PATTERN, 'skin_callback', $m[2]);
}
return $ret;
}
case 'new':
if ($skin_data[$rowidx]['regdate'] + (86400*3) < time()) return '';
else return $m[2];
}
} elseif ($m[3]) {
return $skin_data[$rowidx][$m[3]];
}
}
?> |
조금 길어보이지만 그런것엔 신경쓰지 말고 그 다음엔 사용법을 보자.
아래에 최근게시물이 들어갑니다.
<s:nodata>게시물이 없습니다.</s:nodata>
<s:data>- <a href=”{link}”>{subject}</a> <s :new>*</s:new></s:data>
위쪽이 최근게시물입니다.
s: 로 시작하는 태그들이 바로 템플릿의 블럭이고 {}와 같은 형식을 지닌게 변수들이다.
보통 메인페이지로 만들게 되는 index.html 에서 최근게시물을 사용할 부분만 저렇게 처리해주면 된다. 페이지의 제일 상단에 함수등의 정의를 위해 include ‘latest.php’ 를 해주는 것 외에는 딱히 못쓸것이 없다는 거다.
보통 디자이너들이 작업할때는 하나의 전체페이지를 만들어내고 많은 개발자들이 그것을 다시 쪼개는 작업을 하고 있다. 하지만 이 방식대로라면… 디자이너에게 간단한 몇가지의 교육만으로도 개발자는 손을 털 수 있다. 그리고 그것이 내가 궁극적으로 지향하는 목표이다.
만약, 조금 더 많은 데이타를 뽑아와야 한다면 그저 latest.php 라는 파일만 살짝 손봐주고 변수나 블럭명만을 디자이너에게 알려주면 된다. 지긋지긋한 HTML 코드를 안봐도 되고 디자이너가 CSS를 잘쓰니 못쓰니 따위의 스트레스받는 논쟁은 더 이상 안해도 되는 것이다.
지금 개발중인 게시판이며 많은 프로그램들을 이런식으로 처리하고 있는데, 물론 내가 개발하는 것들이란게 규모가 뻔한 것들이라서 그런지는 몰라도 속도의 차이는 크게 느끼지 못했다. 벤치마킹해본 적은 물론 없다.
이런 방식을 가리켜 나름대로 “인라인 스킨처리법” 이라고 부르고는 있는데, 의외로 쓸만한 방식인 듯 하다.
그렇다면 인덱스 페이지에서 사용하는 여러번의 쿼리질을 다해야 하는가? 라는 물음에 좀 더 자신있게 답하기 위해서 생각한 것이 바로 캐싱기법이다. 이에 대해선 클래스를 만들고 있으니 다음에 올리도록 하겠다.