본문 바로가기

Common Gateway Interface/Perl

[옛 강좌] 34. Perlprog - Bookmark Program

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 이 게시물은 지금은 폐쇄되어 접속되지 않는 Kim Young Soo(http://hours.interpia98.net/~unisoo/)님의 웹 사이트에 2001년경 게시된 내용을 바탕으로 오늘날 웹 환경에 맞게 내용을 덧붙였습니다.

Perlprog - Bookmark Program

Description

Perl과 DB를 이용한 Bookmark Program 첫 번째


들어가기(Start)

 지난번에는 펄에서 디비를 사용하기위한 준비과정을 알아보았습니다. 이젠 이걸 응용해서 아주 간단한 프로그램을 하나 만들어 보겠습니다. 여기서 좀 더 발전하면, 그럴듯한 뭔가가 나오지 않을까... 착각(?)도 해봅니다.... -_-;;

 지금부터 할 건, 펄과 디비를 이용한 북마크 프로그램입니다. 이건 일종의 사이트 관리 프로그램이라고 하면 될까요... 유저들이 본인들의 사이트를 각각의 디렉토리에 등록을 시키고, 홍보도 하고, 다른 유저들이 검색도 하는... 일종의 아주 간단한 검색사이트 같은 일을 한다고 생각하시면 됩니다. 여기서 좀더 발전한다면... 그럴듯한 검색사이트나, 아니면 순위 사이트를 관리하는 프로그램으로 발전시킬 수도 있을 겁니다.

 그럼 이번엔 DB의 Table 생성과, 저장된 데이터에서 디렉토리별로 출력하는 과정까지 살펴보겠습니다. 참고로 테스트 환경은 NT + Apache + Mssql 6.5 입니다.

DB 구축(Table 생성)

 필요한 데이터들에 관해서 살펴보겠습니다.

필요한 데이터(DB_Data)

type(varchar)
이 값은 현재의 데이터가 폴더인지('f') 인지, URL인지('b') 를 나타내는 값입니다.
parent(varchar)
이 값은 현재 보고 있는 디렉토리의 상위 디렉토리를 저장하는 값입니다.
path(varchar)
이 값은 현재의 디렉토리입니다.
name(varchar)
디렉토리나 URL의 이름입니다.
url(varchar)
홈페이지의 주소 입니다.
owner(varchar)
등록한 사람의 이름입니다.
descript(varchar)
URL의 설명입니다.
search(varchar)
URL을 검색할 때 필요한 검색어 입니다.

Table 생성

 이제 필요한 데이터들을 보았으니깐, 만듭니다.

create table bookmark
{
	type varchar(1),
	parent varchar(255),
	path varchar(255),
	name varchar(100),
	url varchar(100),
	owner varchar(50),
	descript varchar(255),
	search varchar(200)
}
					

 위에서 데이터의 길이는 제가 나름대로 정한겁니다. 본인이 요구하는 사항이 다를수 있으니깐, 그거에 맞게 수정하셔서 테이블을 만드시길 바랍니다. 물론 위의 과정도 Perl내에서 수행할 수 있지만, DB 내에서 직접 만들었습니다. 새로운 테이블을 생성하는 프로그램은 나중에 관리자에서 다루도록 하겠습니다.

초기 데이터 넣기(insert data)

 이제 맨 위의 디렉토리를 정해야 합니다. 우리가 디렉토리를 만드는 프로그램이 있기 전까지는 손으로 작업해야죠.

insert into bookmark(type, path, name) values ('f', '/', 'Perl_관련_사이트')

위의 쿼리 문을 이용해서 몇개의 초기 디렉토리를 만듭니다. 지금 만드는 것이 최상위에 위치한 디렉이니깐, path는 '/'가 됩니다. 또 디렉이기 때문에 type은 'f'가 되는 거구요. 나머진 필요 없으니깐.. 넣지 않습니다.

 그리고 디렉토리의 이름에서 공백은 '_'(아래 밑줄)로 처리합니다. 공백은 특수문자로 인식이 되고, 또 우리는 그걸 다시 디코딩해야 하니깐... 이런 과정을 생략하기 위해서 공백은 '_'로 처리합니다.

초기화면 보여주기(index.cgi)

 처음 인덱스 파일에서는 이 최상위 디렉을 보여주어야 합니다. 이 인덱스 파일에서 그 하위 디렉에 대한 검색도 가능 하게 만들구요. 그럼 index.cgi라는 이름으로 시작합니다.

index.cgi(초기실행 프로그램)

#!/usr/local/bin/perl

use DBI; 
# DBI 모듈을 사용한다고 알립니다. 

print "Content-type: text/html\n\n";

$dbh = DBI->connect('DBI:ODBC:bookmark', 'sa', '') || die print "$DBI::errstr";
# 여기선 각자가 사용할 DBD를 선택하고, DB를 선택하고해서 DB와 접속합니다. 

$sth = $dbh->prepare (q {select name from bookmark where path='/' and type='f'} ) || die print "$DBI::errstr";
# prepare() 메소드를 이용해서 쿼리문을 준비합니다. 이때 우리는 type이 'f'인것과, path가 '/'인것만을 추려냅니다. 다른건 필요 없으니깐 name필드만 부릅니다. 

$sth->execute || die "$DBI::errstr";
# 쿼리 문을 실행합니다. 

while (($name) = $sth->fetchrow_array)
{
	print "<tr>\n";
	print "<td align=left height=25><font size=2>\n";
	print "<ul type=disc>";
	print "<li><a href=\"./search.cgi/$name/\">$name</a>\n";
	print "</ul></font></td>\n";
	print "</tr>\n";
}

&HtmlStart;
# 문서의 머리를 출력 

$rc = $sth->rows;
# rows는 execute로 실행되어진 쿼리문에서 fetch에 성공한 rows수를 반환합니다. 없다면 '-1'를 반환합니다. 

if ($rc eq -1)
{
	print "등록된 자료가 없습니다.";
}
# 자료가 없을경우의 출력 

&HtmlEnd;
# 문서의 마지막 출력 

$sth->finish;
$dbh->disconnect;
# 쿼리문을 종료하고, DB와의 접속을 끊습니다. 
					

 그리 길지 않네요. 위의 간단한(?) 코드로 우리가 사용할 메인 페이지의 프로그램이 다 끝났습니다. 다음은 HtmlStart(), HtmlEnd() 함수의 내용입니다.

HtmlStart()

sub HtmlStart
{
	print <<Html;

<html>
	<head>
		<title>BlackUnicorn's BookMark Site</title>
	</head>
	<body>
		<center>
			<b><font size=3 color=green>My Favorite Site!!!</font></b><p>
		</center>
		<font size=2>
			<a href="http://localhost/~bookmark/">처음</a> >
			<center>
				<hr size=2 color=green width=100%>
				<table width=600 border=0>
	Html
}
						

HtmlEnd()

sub HtmlEnd
{
	print <<End;
				</table>
				<hr size=2 color=green width=100%>
				<center>
					<a href="http://localhost/~bookmark/"><font color=blue>BlackUnicorn's BookMark Site</font></a> - <a href="./add.cgi">북마크 등록</a>
				</center>
			</font>
		</center>
	</body>
</html>
    End
}
						

NOTES

 이것으로 이번 이야기를 마칠까 합니다. 설명을 하지 않은곳이 index.cgi내에서 $name에 링크를 걸때 사용한 search.cgi, 다음엔 기본 디렉토리에서 원하는 목록을 눌렀을 경우, 그에 맞는 URL을 찾아주는 search.cgi에 대해서 이야기 하겠습니다.

 그 외 추가하는 add.cgi, 관리자, 검색에 대한 이야기는 앞으로 진행하면서 추가 하도록 하겠습니다.


이 문서는 Perl 패키지내의 pod2html를 이용하여 만들었습니다. - Kim Young Soo