블로그 이미지
JEEN

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

Rss feed Tistory
IT/Perl 2010.08.14 09:52

요즘 작업중인 프로젝트의 Catalyst 구성에 대해서



 대부분의 로직은 Catalyst::Model::MultiAdaptor 를 사용해서 전부 MyApp::API 의 네임스페이스 아래에 정의해서 코드의 재사용성을 높이고,
  백그라운드에서 움직이는 몇가지 스크립트는 관리의 편의를 위해서 MooseX::App::Cmd 를 사용했습니다. MyApp::CLI::Command::[commands] 의 네임스페이스로 정의하며, pod 를 적어놓음으로써 간단하게 매뉴얼을 만들 수 있고, GetOpt 등으로 여러가지 옵션에 대한 다양한 처리를 구현할 수 있습니다.

   ORM 으로는 DBIx::Class 를 사용합니다. 테이블의 INSERT,UPDATE 시에 created_on/updated_on 의 자동갱신을 설정해줄 수 있는 DBIx::Class::TimeStamp 와 함께, SQL 쿼리의 직접적인 조건식 대상이 되지 않는 데이터이며 데이터 구성이 다소 변칙적이며, 괜히 테이블을 여러개 찍어내지 않기 위해서 몇 개의 테이블에는 YAML 로 Serialize해줍니다. (DBIx::Class::InflateColumn::Serializer) 
  또한 파일 업로드 시에 DBIx::Class::InflateColumn::FS 같은 것도 함께 사용하고 있습니다. 

  작업도중에는 Catalyst::Plugin::FormValidator::Simple 으로인해서 알수없는 난관을 만난 적이 있어서, FormValidator::Simple 을 별도의 Validator 라는 모델안에 정의해서 각종 폼 이벤트에 대한 유효성 체크를 실사했습니다. 

  또한 몇가지 중요한 시스템 사용 포인트(예를들어 유저등록, 상품 등록, 상품 구매)에 대해서는 별도로 로깅을 하도록 하였고, 이때 Catalyst::Log::Log4perl 을 붙여서 사용하고 있습니다. 시스템 도입이후에 당분간은 -Stats 로 상황을 보며 디버그 요소와 퍼포먼스가 떨어지는 부분을 파악하기 쉬워졌습니다. 

  그 이외 Controller, Model, View 에서 사용하는 각종 config 에 대해서는 myapp_config.yaml 에서 모두 묶어서 관리를 하도록 하였습니다. 

  Mail 발송에 대해서는 웹페이지 상에서 보내는 메일을 전제로 우선 Catalyst::View::Email 을 사용했지만, CLI 에서 메일작업을 해줄 필요가 있어서 MyApp::Mail 을 별도로 정의, Email::Sender 를 사용하고 있습니다.

  기본 Template 으로는 Tempate Toolkit 을 사용하고 있으며, 다량의 메일 템플릿(메일바다 이름과 이메일, 날짜가 매번 바뀌거나)을 보낼 때의 속도 문제로 Text::XSlate 를 시범적으로 사용하고 있습니다.

  서비스를 띄울 때는 Starman 으로 5000 포트로 띄우고, 워커는 시스템 사용 규모에 맞게 설정합니다. (그냥 단순 관리화면임으로 워커는 3개 정도만 띄워놨습니다) Apache 에서 ProxyPass 로 설정해서 서비스 도메인에 붙여넣습니다.

  몇가지 중요한 걸 빼먹은 것 같기도 하지만... 나중에 시간이 난다면 다른 시범구성에 대해서도 말해보고자 합니다.
신고
이빨까기 2010.07.12 16:19

[잡담] 웁스계수(oops! Coefficient)를 아시나요?

 최근 개인적인 일때문에에 하루에 열댓번씩 커밋하는 어떤 플젝이 있습니다.
 여느 때와 마찬가지로 SCM 는 git 을 사용합니다. 

 작업은 슬슬 막바지에 다다릅니다. 그리고 잦은 실수들을 범하게 됩니다.
 그 잦은 실수들의 대개는 오타라거나, 인수를 넣는 순서가 잘못되었다 라거나 하는 그런 경미한 것들입니다.

 오늘까지의 커밋횟수는 240 commits.
 이중에서 oops 라고 커밋 메시지를 남긴 커밋은 33 commits.
 
 계산해보면, 0.1375 인데 적당하게 사사오입해서 0.14 라고 해둡니다.
 
 고로 100번 커밋했을 때 14번 정도는 삑사리를 낼 수 있다는 얘기입니다 =3

 그리고 WTx 계수가 있습니다.
 WTx 지수는 고쳤다고 생각해서 커밋했더니 안그렇더라, 그래서 또 해봤다, 그런데 또 안되더라, 아, 알았다, 고쳤다, 커밋했다. 아오 WTF!!! 안되잖아!, 아, 이거야? WTH? , 이것도 아니잖아 Fu*k!!
 같은 상황에서 발생합니다. 저의 경우는 전체  5/240 commits 의 WTx 이 발견되었습니다. 


-----
... 물론 이 수치를 줄일 수 있습니다. 커밋하기 전에 테스트 한번 돌려 보는 것입니다. 
...
..
.

 네 맞습니다. Oops/WTx 계수는 바로 테스트코드를 안쓰고 급하게 급하게 작업하다가 벌어지는 것이 대부분입니다.
 그러니 테스트코드를 써야합니다. =3
------

  테스트코드는 당신 가정의 행복을 가져옵니다!! (처음에는 퇴근시간이 늦어질지도 모르지만요)
신고
IT/Perl 2010.06.24 20:34

[ Perl ] 그리고 거기에 TimeStamp 가 있었다 // DBIx::Class

2008/08/06 - [IT/Perl] - [ Perl ] Perl 에서의 ORM , DBIx::Class에 대해서... #3 - Component

  요즘 출퇴근길에 The Definitive Guide to Catalyst 를 보고 있습니다. 테스트코드의 중요성을 역설하는 많은 부분을 엿볼 수 있었습니다. 아니.. 뭐 그보다 다른 사람들은 어떻게 Catalyst 를 쓰냐는 것이 궁금하기도 해서 여러 소스를 디벼보기도 하며 참고하기도 하는데요. 그런 면도 있는 반면에 저 자신이 2-3년 계속 익숙하게 써오던 구문들을 고집하기도 합니다. 

  위의 링크에서 볼 수 있는 자체정의한 AutoStoreDateTime 부분이 바로 그렇습니다. 
  매번 DBIx::Class 를 사용하는 프로젝트마다 저렇게 따로 정의해놓고 쓰는 습관이 있었습니다. 이게 바로 대표적인 2-3년 동안 계속 써오던 그런 고집이죠.

  The Definitive Guide To catalyst 를 보면서 TimeStamp(=DBIx::Class::TimeStamp) 의 존재를 알게되었고,
  이것이 AutoStoreDateTime 으로 따로 컴포넌트를 정의할 필요성을 박살내버려주었습니다.

 package My::Schema;

 __PACKAGE__->load_components(qw( TimeStamp ... Core ));
 
 __PACKAGE__->add_columns(
    id => { data_type => 'integer' },
    t_created => { data_type => 'datetime', set_on_create => 1 },
    t_updated => { data_type => 'datetime',
        set_on_create => 1, set_on_update => 1 },
 );

  TimeStamp 컴포넌트를 읽어주고 DateTime 타입의 컬럼에다가 
  set_on_create / set_on_update 만 지정해주면 되는 것이죠.

  말 그대로 INSERT 쿼리에서는 set_on_create 가 UPDATE 쿼리에서는 set_on_update 가 지정된 컬럼의 값이 자동으로 갱신됩니다. 

  DBIx::Class::TimeStamp 자체는 사실 DBIx::Class::DynamicDefault 에 조금 손을 댄 것 뿐이니...
  이렇게 저렇게 다른 컬럼에 값을 바꿔보고 싶다든가 할때는 DBIC::DynamicDefault 를 참고해보는 것도 좋지 않을까 합니다.

  // 그런 의미에서 급하게 [개인적인 일]에서 사용되던 코드들을 모조리 DBIx::Class::TimeStamp 로 바꿔버렸습니다.
 역시 쓸데없는 자기전용 컴포넌트 // 네임스페이스 생성은 독입니다. 세상은 꾸준히 바뀌어가니... =3

** 추기 (2010/09/06)
  아, 이건 DBIC 의 bulk_insert(populate) 를 이용했을 시에는 적용되지 않습니다. (당연한가;;)
신고
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 2010.01.04 13:06

[ Perl ] Catalyst + Plack + Apache

  최근에야 듣보 Web App Framework 에서 Catalyst 로 완전히 옮기게 되었습니다. 개발속도는 안 써봐서 그런지, 좀 느린 감은 있었지만, 기존에 해오던 대로 쓰니까 크게 차이는 없어서 무난히 개발을 할 수 있었습니다. 
  예전에는 FastCGI 띄우고, Apache 에서 mod_fastcgi  붙여서 서버 띄우곤 했는데, 최근에 Server::Starter 가 Plack 에 붙어줘서(Plack::Server::Standalone::Prefork::Server::Starter) mod_proxy 를 써서 Apache 에 접붙이기를 하고 있습니다. 

 왜 Server::Starter 냐? 
  기존의 웹 어플에서는 코드 수정이 이뤄질때마다 서버를 다시 띄워야 되며, 이때의 작은 downtime 이 발생하게 되지만, Server::Starter 를 사용하면  downtime 없이 웹 어플의 재기동이 가능하게 된다는 것입니다. 

  대충 이런 형식입니다. 

  |Apache|  -----  |Plack(::Server::Standalone::Prefork::Server::Starter)| --- |Catalyst|

  우선 사전준비로써,
  Apache 가 있고, mod_proxy 를 사용가능하며, 

  CPAN 모듈로는 
  PSGI 
  Plack 
  Server::Starter 
  Plack::Server::Standalone::Prefork::Server::Starter 
  등이 필요합니다. 
   그리고 물론 WebApp 도 있어야 되겠죠? 여기에서는 Catalyst 를 사용합니다.  Catalyst에서 Plack 엔진을 사용하려면 Catalyst::Engine::PSGI 가 있어야 합니다. 
 
  모든 준비가 끝났다면 우선 Plack 용 .psgi 스크립트를 작성합니다.
 * app.psgi
use Plack::Builder;
use Zzoo::Web;
Zzoo::Web->setup_engine('PSGI');
my $app = sub { Zzoo::Web->new->run(@_) };
builder { 
   enable "Auth::Basic", authenticator => sub {
      my ($user, $pass) = @_;
      return $user eq 'pass' && $pass eq 'word';
   };
   $app;
};
  Auth::Basic 은 접속시 기본인증을 거치게 해줍니다. 

  Plack::Builder 를 통해서 여러가지 MiddleWare 를 사용할 수 있는데, Auth::Basic 이 그 대표적인 예 중 하나입니다. 
  이런 Middleware 는 Plack::Middleware::* 라는 네임스페이스를 가지며 이외에도 다양하고 유용한 미들웨어들이 존재합니다. 

  Apache 설정은 아래와 같습니다. 
 /etc/apache2/site-available/blahblah.blah.blah
<VirtualHost *:80>
   ServerAdmin  who@am.i
   ServerName    your.server.com
   <Location />
      Order allow, deny
      Allow from all
      ProxyPass http://localhost:5000/
   </Location>
</VirtualHost>

  Server::Stater 스크립트를 통해서 Plack을 기동합니다.
  
$ start_server --port=5000 -- plackup -s Standalone::Prefork::Server::Starter --max-workers 3 -a app.psgi  

  그리고는 해당 서버에 접속해서 동작을 확인합니다.  
  --max-workers 옵션으로 서버 기동시의 Prefork 되는 워커(프로세스)의 갯수를 지정할 수 있습니다.
  -s 옵션으로 Plack Server 를 지정합니다. Plack::Server::* 의 네임스페이스를 가지는 모듈이 이에 해당합니다. 
  -a 옵션으로 psgi 스크립트를 지정합니다. 
  그외 여러가지 옵션이 있지만 여기에서는 생략하겠습니다. 

  이렇게 기동한 프로세스는 
$ killall -HUP start_server
  을 통해서 앞에서 말한 downtime 이 없는 서버재기동이 가능하게 됩니다. 

  여러모로 설명을 생략해버렸지만, Plack 에 대해서는 차후에 천천히 처음부터 차근차근 소개해볼까 합니다.

  참고자료
신고

'IT > Perl' 카테고리의 다른 글

[ Perl ] Twitter Steam + IRC = Twit2IRC  (2) 2010.01.04
[ Perl ] Catalyst + Plack + Apache  (0) 2010.01.04
[ Perl ] Cafe Crawler  (0) 2010.01.03
Rakudo Perl 6 development release #24 ("Seoul")  (1) 2009.12.18
IT/Perl 2009.04.25 14:33

[ Perl ] JPA Seminar #1 을 다녀와서 ( 4/ 21)


* http://wiki.perlassociation.org/seminar/2009-04-21

  지난 화요일(4/21)에 아키하바라 UDX 컨퍼런스장에서 JPA Seminar #1 이 있었습니다.
  강사는 Jay Shirley, EPO(Enlightened Perl Organisation) 의 코어멤버이며, National Auto Sport 의 IT Director 라고 하네요.
  주요 세션은 2가지입니다. Better Perl Practices, Catalyst Enhanced 입니다.
  이 두 세션의 슬라이드는 위의 링크에서 일본어/영어판으로 구할 수 있으니 참고하세요.

  감상을 말하면... local::lib 에 대한 감동? 을 느낄 수 있었습니다.
  local::lib 에 대해서는 최근에 aero 님의 블로그를 참고하시면 쉽게 아실 수 있으실 겁니다. 

  * local::lib 모듈로 CPAN 모듈을 일반계정에 설치하기
 
  설계 - 테스트 - 리팩토링.
  아쉽게도 대충 짜고 움직이면 땡이라는 인식에서는 차후에 발생할 수 있는 여러가지 부작용에 대해서 미리 대처하기 힘듭니다. 코드는 갈수록 꼬여가고.. 이쪽을 고치면 저쪽이 말썽이고. 그래서 강사는 이것을 습관하하는 것을 권합니다.
  Test 모듈로는 Ovid 와 chromatic 이 만든 Test::Class 를 추천하더군요. 아직 안써봤지만 기회가 된다면 한번 만져봐야 되겠습니다. 그리고 Test::FITesque 라는 것두요.
  Email 에 관한 테스트로 Email::Send::Test, 그리고 Web App 작동여부를 확인하기 위한 테스트 모듈로 Test::WWW::Mechanize 를 제시합니다. 그리고 통합 테스트를 위한 스모크 서버도 갖추는 것이 어떠냐는 얘기도 있었던 것 같습니다.   요근래 Smolder 라는 계속적 테스트 서버가 주목을 받고 있는 것 같던데요. 이것도 역시 좀 건드려봐야 되겠네요.
  그리고 작년부터 불기시작한 신개념 Perl OOP 인 Moose 에 대한 감탄사를 연발하면서 소개하고.. 첫번째 세션이 끝났습니다.

  두번째 세션은 Catalyst 에 대해서 입니다. 어떻게 하면 Catalyst 를 제대로 쓰느냐 하는 얘기였습니다.
  플러그인을 많이 쓰지 마라는 것과 ... ActionClass 에서 지원하는 ?dump_info=1 을 통한 디버그.
  그리고 Chained와 Accessor. 그리고 배포방법에 대해서도 간단한 설명이 있었습니다.
  FastCGI 의 Static/External 방식의 차이.. 그리고 local::lib 을 사용하면 root 가 아니더라도 web app 를 다시 재기동할 수 있다는 것두요.
  그리고 로깅과 5.8 부터 Moose 기반으로 바뀐 Catalyst 에 대한 소소한 이야기.
  그리고 Catalyst 에 대한 참여에 관한 이야기였습니다.
  물론 문서화나, 블로그나, 직접 App 를 만들고 공개된 리포지트리에 올리거나 하는 이야기입니다.
  사실 전 Catalyst like 한 것만 써서.. Catalyst 에 대한 경험이 미천했지만... 이번기회에 Catalyst 를 좀 더 반겨볼까 하는 생각도 하고 있습니다.

  아무튼 이 두세션으로 JPA Seminar #1 는 끝이 났습니다.
  준비가 미진했다고 주최자가 말했지만... 이런 자그만한 techtalk 에도(하지만 200명이 참석할 수 있는 공간) 동시통역을 지원하거나, 슬라이드 자료를 미리 인쇄해서 나눠주거나 하는 등의 정성이 엿보였습니다. 거기에 JPA Seminar #1 얘기는 두달전부터 미리 "하겠다" 라는 공지를 내놓고 한 것이기 때문에... 최근 급하게 구성된 YASPS 에서는 좀 더 여러모로 계획할 필요가 있지 않나 하는 생각도 듭니다.

  아무튼 느낀 점 많고, 배울 점 많은 JPA Seminar #1 이었습니다.
신고
IT/Perl 2009.02.25 13:49

[ Perl ] MojoMojo(Perl 기반의 Wiki) 한글화


  Perl 기반의 Wiki 인 MojoMojo 를 한글화했습니다. 물론 전체적인 부분에는 아직 미진하지만.. 60% 정도의 공정(?)을 거쳤다고 할까요. MojoMojo 는 Perl 의 웹 프레임워크인 Catalyst 를 기반으로 만들어진 DB 기반의 Wiki입니다. 기본적으로 SQLite 를 채용하고 있으며.. MySQL, PostGRE 등을 지원한다고 하네요. 거기에 KinoSearch 라는 Perl 로 만들어진 인덱스 생성기도 채용되어 있어서, Wiki 컨텐츠의 검색에 많은 도움이 된다고 합니다.

  그럼 MojoMojo 를 시작해봅니다.
  MojoMojo 를 실행하려면 먼저 Catalyst 를 설치할 필요가 있습니다.
  위의 번역된 MojoMojo 는...


  위의 github 에서 clone 할 수 있습니다. MojoMojo 프로젝트에서 fork 해왔는데... 이게 어떻게 mojomojo 프로젝트로 반영되는 지... 아직 git 에 대한 공부가 부족해서 잘 모르겠군요. 그냥 remote 등록하고 push 해버리면 되는 건지. 아니면 그쪽 프로젝트 마스터가 알아서 해주는지...

   git clone git://github.com/JEEN/mojomojo.git

  clone 하고 난 다음에는 우선 mojomojo.conf 의 default_lang 을 ja 에서 ko 로 바꿔줍니다. 그리고는 DB 를 생성합니다.

  ./script/mojomojo_spawn_db.pl

  그러면 mojomojo.db 라는 SQLite 가 생성되며,

 ./script/mojomojo_server.pl

  로 자체서버를 기동할 수 있으며 http://[domain]:3000/ 을 접속할 수 있습니다.
  자체서버를 사용하지 않고 Apache + FastCGI 를 사용할 수도 있습니다. 아래의 wiki 페이지를 참고해주세요.


  MojoMojo 의 국제화 관련처리는 Locale::Maketext::Simple 모듈에 의존하고 있고, 각 언어처리는 [언어].po 파일을 만들어 두는 것으로 시작힙니다. 그리고 po 파일안의 내용은 이렇게 구성되어 있습니다.

#. (page.path)
#: root/base/page/list.tt:1
msgid "All Pages in x"
msgstr "「%1」아래의 모든 페이지"

#. (page.name)
#: root/base/page/list.tt:17
msgid "All pages in x listed alphabetically"
msgstr "「%1」아래의 모든 페이지(알파벳순)"

  그래서 한글화라고 해도 간단하게 ko.po 파일을 만들고 해당 부분을 한글로 끄적거리는 것 밖에 없었죠. 
  그리고 템플릿 파일에서 아래처럼 넣어주면 한글화는 끝입니다.


  이상입니다. 
신고
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 486,526 TODAY 16

티스토리 툴바