블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2010.04.04 23:55

[ Perl/WAF/Dancer ] 경량 웹 어플리케이션 프레임 워크라면 이거

  예전에 Mojo 를 시작으로 하는 경량 웹 어플 바람이 불고 가면서, MENTA 라든가 Yacafi 라든가가 떠올랐었지만, 요즘은 Dancer 와 Mojo 로 정리되어가고... Ruby 계열에서 RoR 보다 좀 가벼운 걸로 Sinatra 를 사용하는 것처럼 Dancer 가 대세인 것 같기도 합니다.
   PSGI/Plack 도 지원하니까 이것저것 붙여쓰기에도 좋구요. :-) 그렇다고 Mojo 가 지원하지 않는 건 아니지만...

  http://search.cpan.org/perldoc?Dancer

  Dancer 를 설치하고...

$ dancer -a [App]

  이렇게 기본적인 뼈대가 만들어집니다.

  어차피 웹 개발은 시작이 절반이고. 그 시작의 절반은 이름 정하는 것이니.. =3==3
  그것만 끝나면 시원시원하게 만들어나갈 수 있지 않을까 하는 생각을 해봅니다. :-)

  http://github.com/JEEN/Filstapaper/

  이전 몇번이나 Instapaper 관련으로 떠든 Filstapaper 라는 것이 이 Dancer 로 만든 것이니... 가볍게 참고는 가능하시지 않을까 합니다. (사실 문서만 봐도 충분합니다만...)

 
신고
IT/Perl 2008.06.17 06:30

[ Perl ] Catalyst 를 이용한 웹 서비스 개발 #2

사용자 삽입 이미지
 
 그러면 이제 자신이 원하는 페이지를 만들어 보도록 하겠습니다.

사용자 삽입 이미지

  ./script/oops_create.pl Controller Hello 로 Hello 라는 새로운 컨트롤러를 새로 생성하였습니다. 그리고 서버를 다시 시동하셔서(./script/oops_server.pl) 웹페이지를 확인해 봅니다.

사용자 삽입 이미지

  http://localhost:3000/hello 으로 접속해보면.. 'Matched Oops::Controller::Hello in Hello.' 라고 나옵니다. 이 말 그대로 Oops::Controller::Hello(프로젝트::컨트롤러::컨트롤) 에 매치했다는 것이겠죠. 그러면이렇게 해서 간단하게 페이지 생성을 할 수 있습니다. 이렇게 마치기 전에 Oops::Controller::Hello 가 어떻게 구성되는 지 알아볼까요? lib/Oops/Controller/Hello.pm 의 내용을 살펴봅니다.
package Oops::Controller::Hello;

use strict;
use warnings;
use base 'Catalyst::Controller';
                                                                                                                                                           
=head1 NAME                                                                                                                                                
                                                                                                                                                           
Oops::Controller::Hello - Catalyst Controller                                                                                                              
                                                                                                                                                           
=head1 DESCRIPTION                                                                                                                                         
                                                                                                                                                           
Catalyst Controller.                                                                                                                                       
                                                                                                                                                           
=head1 METHODS                                                                                                                                             
                                                                                                                                                           
=cut                                                                                                                                                       

                                                                                                                                                           
=head2 index                                                                                                                                               
                                                                                                                                                           
=cut                                                                                                                                                       

sub index : Private {
    my ( $self, $c ) = @_;

    $c->response->body('Matched Oops::Controller::Hello in Hello.');
}

 그러면 이와 같은 소스코드를 확인할 수 있으시겠으며.. 'Matched Oops...' 하는 부분은 바로 $c->reponse->body() 안의 문자열로 들어간 것임을 알 수 있습니다.  그렇다면 이 부분을 HTML로 적으면 된다는 것을 대충 짐작하셨을 겁니다.
 하지만 코드와 HTML을 섞어서 같이 쓰신다면... 처음에 허둥지둥 급하게 일을 할 때는 빨리 끝낼 수 있을 지 모르겠지만.. 장기적인 안목으로 봤을 때는 여간 불편한 게 아닙니다. 그리고 보기도 좋지 않죠. 그외 여러가지 제약이 될 수 있는 여러가지들이 있는 데... 이 것이 바로 템플릿의 등장이유가 됩니다.
 PHP의 대표적인 템플릿은 Smarty 라든가 Template_ 같은 것들처럼, Perl에는 Template Toolkit 이라는 강력한 템플릿이 존재합니다.
사용자 삽입 이미지
  이런 템플릿을 위한 View 를 생성하기 위해 './script/oops_create.pl view TT TT' 라고 입력합니다. TT 란 바로 Template Toolkit 을 뜻합니다. (처음의 TT는 View/TT.pm 이라는 것을 뜻하고, 두번째 TT는 Catalyst::View::TT 라는 모듈을 기반으로 한다는 것을 의미합니다)

 그리고는 ./root/hello.tt 라고 템플릿을 만듭니다. 예제로 이런 것을 만들어 보았습니다.
 Template Toolkit 은 기본적으로 [% ~ %] 을 템플릿 영역으로 사용합니다.
<html>
<head>
<title>[% title %]</title>
</head>
<body>
[% name1 %] ♥ [% name2 %]<br/>
그들은 왜 신림동으로 갔나?<br/>
</body>
</html>

 위에서 title, template, name1, name2 같은 것을 미리 정해놓았습니다.
 그럼 Controller 에서 해당 템플릿 변수에 값을 넣어주기만 하면 되는 것이죠.
 ./lib/Oops/Controller/Hello.pm 을 열어줍니다.
sub index : Private {
    my ( $self, $c ) = @_;

    $c->stash->{title} = 'PD수첩';
    $c->stash->{name1} = 'yuni';
    $c->stash->{name2} = 'saillinux';
  
    $c->stash->{template} = 'hello.tt';
}

 그리고 이와 $self->stash 로 하나하나 템플릿 변수를 지정해 줍니다. 여기서 $self->stash->{template} 는 해당 템플릿 파일과 매치를 하기때문에 위의 템플릿 변수를 넣어줄 템플릿을 지정해야 합니다. 위에서 'hello.tt'라는 템플릿을 만들었으니 'hello.tt'라고 넣어줘야 겠죠?
  $self->stash가 하는 일은 말씀 안해줘도 아시겠죠?
 아, 물론 Template 을 사용하게 되었으니.. $c->response->body()로 내용 넣어주던 짓은 이제 그만해도 됩니다. :-)
사용자 삽입 이미지
어떤가요? title 에는 PD수첩이.. name1에는 yuni 가 name2 에는 saillinux가 들어갔습니다.
 이런식으로 간단하게 Web Page 를 하나씩 추가해 나가시면 되겠죠?

 Template Toolkit 의 사용법은 이후에도 계속해서 알아가겠지만, 급하시면 아래를 참고하시면 되겠습니다.

 * 참고사이트
  - Template Toolkit
  - Catalyst

 다음에는 SQLite 를 이용한 간단히 Model 쪽을 살펴보겠습니다. :-)
신고
IT/Perl 2008.06.09 13:06

[ Perl ] Catalyst 를 이용한 웹 서비스 개발 #1

사용자 삽입 이미지

 Python 진영에서 Django 같은 게 있고, Ruby 진영에는 Rails 같은 게 있고, PHP 진영은... 뭐가 있는 지 모르겠습니다. Zend Framework일까요?
 그럼 Perl 에서는 뭐가 있을까요? 대표적인 것이 Catalyst 와 Jifty 입니다. (Catalyst 는 네트워크 쪽에 일하시는 분들이 얘기하는 그 Catalyst 가 아닙니다 :-) 이중에서 다수의 이용자에게 광범위하게 사용되고 있는 펄 웹 프레임워크 Catalyst 를 이용한 간단한 웹 프로그래밍입문을 다뤄볼까 합니다. 물론 저 역시도 Catalyst 를 깊게 사용해본 적이 없습니다. 이와 비슷한 프레임워크를 사용하면서 대충 Catalyst 도 이렇게 움직이지 않을까 하는 생각으로 시작하려고 합니다.
 Catalyst 한글 문서화 작업도 괜찮겠다 싶습니다. 현재 한국에서 Catalyst 에 관한 문서는 전무하다 시피 하거든요. 관심있으신 분들은 doc.perl.kr 에 들러주시면 되겠습니다.

 _____
 
 그럼 우선 설치부터 시작하죠.
 CPAN 에서 Task::Catalyst 를 설치합니다.(cpan Task::Catalyst)
 꽤나 덩치가 있는 웹 프레임워크라서 그런지 이것저것 많은 모듈 의존을 하고 있습니다. 그렇게 의존된 모듈까지 전부 인스톨합니다. 설치가 끝나면 셸로 돌아옵니다.
 
 그리고는..
사용자 삽입 이미지
catalyst.pl 이라고 타이핑하면 이렇게 나오게됩니다. 여기까지 나오면 설치는 잘 하신 겁니다.

 그렇다면 적당한 프로젝트를 하나 만들어보겠습니다. 위의 설명 예제에서도 나와 있듯이
사용자 삽입 이미지
  전 'Oops' 라는 프로젝트를 만들어보려고 합니다. 셸에서 'catalyst.pl Oops' 라고 쳤습니다. 그러면 프로젝트를 움직이는 기본 뼈대(Skeleton) 을 만들게 됩니다.

  그 뼈대의 구조는 어떻게 되느냐면 이렇습니다.
사용자 삽입 이미지
  프로젝트 루트는 프로젝트의 움직임을 관장하는 lib, 그리고 웹 서버를 올리기 위한 스크립트등의 script , 그리고 테스트 스크립트를 놓는 t, 템플릿 파일이나 정적 파일들을 보관하는 root 로 나뉩니다.그리고 config 설정을 위한 YAML 파일 등도 있죠.

  그럼 lib 의 구성은 어떻게 되어 있을까요?
사용자 삽입 이미지
  lib 의 아래 디렉토리에는 프로젝트 초기의 행동을 정의할 수 있는 Oops.pm 가 있고.. 그 밑의 디렉토리에서는 Controller , Model, View .. 흔히 말하는 MVC 패턴을 지원하는 디렉토리 구조를 가지고 있습니다.  
사용자 삽입 이미지
그럼 script에는 어떤 것들이 있냐면..
 *_cgi.pl, *_fastcgi.pl 은 딱 보시면 아시다 시피 cgi, fastcgi 의 스크립트 입니다.
 *_server.pl 는 내장 서버를 이용해서 웹 서버를 띄우게 됩니다. 아파치 따위의 의존없이 간편하게 웹서비스를 띄울 수 있습니다.
 *_create.pl 는 Model, View, Controller 를 새롭게 생성할 수 있습니다.
 *_test.pl 은 테스트를 위한 스크립트죠.
 
  그럼 간단하게 웹 서버를 띄워보도록 하겠습니다. './script/oops_server.pl' 을 실행하면..
사용자 삽입 이미지
  이와 같은 각종 디버그 정보와 함께 웹서버가 가동됩니다. port 는 3000번을 기본값으로 사용하고 있구요. 당연히 옵션을 통해서 웹 서버의 제어가 가능합니다.

 'http://localhost:3000' 으로 접속하면...
사용자 삽입 이미지
이와 같은 화면을 볼 수 있습니다. 이렇게 해서 간단하게 Catalyst 를 이용한 웹 개발을 시작하실 수 있습니다.

 그럼 다음에는 Controller 를 추가해서 이러쿵 저러쿵 하는 방법에 대해서 알아보겠습니다.

 ___
신고
TOTAL 466,905 TODAY 22

티스토리 툴바