본문 바로가기

Common Gateway Interface/Perl

[옛 강좌] 45. CGI 모듈 배우기 (완결)

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

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

CGI 모듈 배우기

  • 글쓴이 : 이채광
  • 날짜 : 2000.07.03
  • 에디터 : 나모 웹에디터 4.0
  • 테스트환경 : 윈98, 아파치1.3.12, ActivePerl binary build 522(perl5.005_03), CGI version 2.46
  • 연락처 : w3master@myperl.pe.kr
  • 문서번호 : CGI.pm-1.2

차례

  • CGI 모듈 홈페이지
  • CGI모듈의 두 가지 사용 모드
  • 간단한 문자열 출력하기
  • 환경변수 보기
  • Redirection
  • 쿼리 문자열 처리
  • 쿠키(Cookie) 사용하기
  • 문서번호

CGI 모듈 홈페이지

http://stein.cshl.org/WWW/software/CGI

 홈페이지에 가면, 아주 긴 하나의 HTML 문서를 보게 됩니다. 이는 크게 AbstractContents, 두 부분으로 구성되어 있습니다. Abstract에는 CGI 모듈을 사용한 예제와 소스, 그리고 'The Official Guide to CGI.pm'이란 책의 예제 소스를 볼 수 있습니다. Contents는 매뉴얼인데, 약 80여 쪽(A4용지)이나 되는 상세하고 친절한 설명이 나와 있습니다.

CGI 모듈의 두 가지 사용 모드

함수지향(function-oriented) 모드

 함수를 사용하기 위해서 CGI 모듈을 사용할 경우는, 아래와 같이 사용하고자 하는 함수명을 함께 넣어주면 됩니다.

use CGI 'param', 'header';
print header('text/plain');
$zipcode = param('zipcode');
				

 그런데,사용하고자 하는 함수가 많을 경우에는 위에서처럼 사용한다는 것이 좀 따분해 보이죠? 그래서 CGI 모듈은 기능별로 함수를 모아서 간편하게 사용할 수 있도록 해 줍니다. 아래에 간단하게 함수세트가 정리되어 있습니다. 세트 이름만 보아도 쉽게 짐작할 수 있을 거에요. 각각의 세트에 있는 함수명을 알고자 할 경우에는 CGI.pm의 소스를 보면 됩니다.

  • :cgi
  • :form
  • :html2
  • :html3
  • :netscape
  • :html
  • :standard
  • :all

 보통 펄 내장함수나 C의 함수 사용법과 동일합니다. 여러 개의 함수를 호출하는 형식으로 모듈을 사용해서, CGI 프로그램을 작성하게 됩니다. 모듈을 적재하는 과정에서, 함수의 세트 단위로 수입(import)을 합니다.

#!/usr/bin/perl
use CGI qw/:standard/;           # load standard CGI routines
print header,                    # create the HTTP header
start_html('hello world'),   # start the HTML
	h1('hello world'),       # level 1 header
end_html;                    # end the HTML

 그럼, 간단한 예제를 하나 더 살펴보겠습니다. 모듈설명서에 나와 있는 다음의 예제를, 저자는 elegant script라고 했더군요 ^^

#!/usr/bin/perl
use CGI qw(:standard);
print header,
	start_html('A Simple Example'),
		h1('A Simple Example'),
		start_form,
			"What's your name? ", textfield('name'), p,
			"What's the combination?", p, checkbox_group(-name=>'words', -values=>['eenie','meenie','minie','moe'], -defaults=>['eenie','minie']), p,
			"What's your favorite color? ", popup_menu(-name=>'color', -values=>['red','green','blue','chartreuse']), p, submit,
		end_form,
		hr;

if (param)
{
	print
		"Your name is",em(param('name')), p,
		"The keywords are: ",em(join(", ",param('words'))),	p,
		"Your favorite color is ",em(param('color')),
		hr;
}

print end_html;
				

객체지향(object-oriented) 모드

#!/usr/bin/perl
use CGI;                                # load CGI routines
$q = new CGI;                           # create new CGI object
print
	$q->header,                    # create the HTTP header
	$q->start_html('hello world'), # start the HTML
	$q->h1('hello world'),         # level 1 header
	$q->end_html;                  # end the HTML
				

 매뉴얼에는, 객체 지향 모드로 예제가 설명되어 있습니다. '객체'와 '->'를 생략하면, 함수 지향으로도 쉽게 바꾸어 생각할 수 있습니다.

간단한 문자열 출력하기

 프로그래밍 언어를 이미 접해본 사람은 매우 익숙한 예제일 겁니다. 사람들은 이 예제가 매우 중요하다고 합니다. 그럼 우리에게 중요한 이유를 살펴 봅시다.

  첫째, 아무리 간단한 CGI 프로그램이라도 CGI의 기본 형태는 갖추고 있습니다. 기본 구조는 헤더와 데이터입니다. 여기서는 모듈을 사용해서 이들을 처리하게 되므로, 헤더와 데이터의 앞쪽에서 모듈을 준비합니다.

 둘째, 웹 서버가 제대로 설치, 설정 되었음을 확인할 수 있습니다. 특히 CGI 설정 과정을 통과했기 때문에 더욱 중요한데, 많은 사람들이 웹 서버의 설정에 많은 어려움을 겪고 있습니다.

 셋째, Perl(펄 시스템)이 제대로 설치, 설정되었음을 확인할 수 있습니다. CGI 모듈은 표준모듈로써, Perl에 있어서 perl(인터프리터)뿐만아니라 표준 모듈도 빼놓을 수 없는 부분이기 때문입니다.

 넷째, Perl의 기본적인, 하지만 매우 중요한 모듈 사용법을 익히게 됩니다.

 크게 4부분으로 정리를 해 보았는데... 글쎄요 ^^; 아래에 예제가 있습니다.

#!/usr/bin/perl -w
use CGI;
$q = CGI->new();
## $q = new CGI;
print $q->header();
print '<html><head><title>Simple Message</title></head><body><h1>Hello, CGI</h1></body></html>';
				

 3행과 4행은 $q라는 CGI 객체를 만드는, 동일한 기능을 수행합니다. 매뉴얼에는 4행처럼 되어 있으나, 저는 3행처럼 하길 권장합니다.

 5행에서, header()에 아무런 매개변수도 없는데, 이런 경우에는 'Content-type:text/html\n\n'으로 가정합니다. 즉, 기본값입니다.

 펄의 작은 따옴표(single quote)에서는, 오직 '와 \ 둘만이 escape되어야 하므로, html작성시 신경을 써야 합니다. 작은 따옴표 대신에 here-document로 처리해도 됩니다.

환경변수 보기

#!/usr/bin/perl -w
use CGI;
$q = CGI->new();
print $q->header();
$q->start_html(-title=>'ENV');
foreach $item(keys %ENV)
{
	print "$item => $ENV{$item}<br>";
}
print $q->end_html();
					

 이번 예제는, 앞의 예제 '간단한 문자열 출력하기'와 동일합니다. CGI 객체를 만들고, 헤더를 출력하고, 문서를 출력했습니다. CGI 모듈을 사용하지 않을 경우에는, 제일 앞의 'CGI 객체 만들기'가 없습니다. 하지만 나머지 두 부분은 꼭 필요합니다.

 start_html()과 end_html()의 사용도 보이는군요!

Redirection

print
	$q->redirect(-location=>'http://somewhere.else/~perlmania');
	--or--
	print $q->redirect('http://somewhere.else/~perlmania');
					

 브라우저에게 다른 문서로 이동하라고 지시하는 기능입니다. 위의 예에서, CGI는 기본적으로 헤더와 문서, 두 부분으로 구성 됨을 보았습니다. 그럼 redirect기능은 어디에 포함시켜서 브라우저에게 보내야 하겠습니까? 문서에 포함시키기는 쫌 꺼림직하지 않은가요?

 redirect()는 자체 내에서 헤더를 출력하기 때문에, 이를 사용하기 전에 어떠한 헤더도 출력해서는 안 됩니다. 그리고 redirect()를 실행하고 나면, 다음의 코드가 실행되지 않기 때문에 처리해야 할 작업은 redirect()가 나오기 전에 마무리 해 주어야 합니다.

 위에서 매개변수로, 절대경로를 적도록 권장합니다. 왜냐하면, 상대경로는 제대로 작동하지 않는 경우가 있기 때문입니다.

쿼리 문자열 처리

 CGI 프로그램이라면, 사용자로부터 정보를 입력 받아(주로 폼을 통해서), 이를 처리하는 작업이 가장 많을 겁니다. 우선, 가장 일반적이고 평범한 예제를 보겠습니다. 이는 form.html과 form.cgi로 이루어져 있습니다.

 form.html

<html>
<head>
	<title>Form</title>
</head>
<body>
	<hr>
	<form method="GET" action="./form.cgi">
		name : <input type="text" name="name" value=""><p>
		tel  : <input type="text" name="tel" value=""><p>
		address : <input type="txt" name="address" value=""><p>
		<input type="submit">
	</form>
</body>
</html>
					

form.cgi

#!/usr/bin/perl

use CGI;
$q = CGI->new();

## 헤더 출력 ------
print $q->header();

## 쿼리 문자열 처리 ------
$name = $q->param('name');
$tel = $q->param('tel');
$address = $q->param('address');

## 문서 출력 ---------------------------------------
print $q->start_html(-title=>'Simple Query String');
print "이름 : $name<P>";
print "전화번호 : $tel<P>";
print "주소 : $address<P>";
print $q->end_html();
					

 form.cgi에서는, 헤더와 문서 출력의 중간 부분에 쿼리를 처리하는 부분이 삽입되었습니다.

TIPS - 쿼리와 관련된 메소드(또는 함수)와 사용법을 소개합니다.

쿼리의 모든 name을 가져오기:
@names = $q->param();
쿼리 perlmania의 값(value) 가져오기:
@values = $q->param('perlmania'); 또는 $value = $q->param('perlmania');
새로운 쿼리 만들기:
$q->param(-name=>'spam', -values=>['egg', 'ham']);
새로운 쿼리 추가하기:
$q->append(-name=>'spam', -values=>['yet', 'another']);
쿼리 spam 삭제하기:
$q->delete('spam');
모든 쿼리 삭제하기:
$q->delete_all();

쿠키(Cookie) 사용하기

쿠키 만들기- cookie()
$my_cookie = $q->cookie(-name=>'perlmania', -value=>'4');
쿠키 전달하기- header()
print $q->header(-cookie=>$my_cookie);
쿠키 확인하기- cookie()
$cookie_value = $q->cookie('perlmania');

 쿠키는 브라우저마다 약간의 차이가 있습니다. 하지만 모듈을 사용하면, 이 점을 그리 신경쓸 필요가 없습니다. 위에서 본 redirect처럼, 쿠키 또한 헤더에 포함됩니다. 즉, 헤더를 이미 출력하면, 쿠키를 출력하는 헤더는 효과가 없습니다.

문서번호

CGI.pm-1.2에서는 'CGI모듈의 두 가지 사용 모드' 섹션의 내용이 추가 되었습니다.


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