블로그 이미지
JEEN

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

Rss feed Tistory
IT/Perl 2008.08.06 14:22

[ Perl ] Perl 에서의 ORM , DBIx::Class에 대해서... #3 - Component

  이번에는 Component 에 대해서 알아보겠습니다. 일단 예제부터 보고 시작하죠.

  Mytest/Company.pm 을 열어봅니다.

package MyTest::Company;

use strict;
use warnings;

use base 'DBIx::Class';
use AutoStoreDateTime;

__PACKAGE__->load_components("PK::Auto", "+AutoStoreDateTime", "Core");
__PACKAGE__->table("company");
__PACKAGE__->add_columns(
  "company_id",
  { data_type => "INT", default_value => undef, is_nullable => 0, size => 11 },
  "name",
  { data_type => "VARCHAR", default_value => "", is_nullable => 0, size => 255 },
  "created_on",
  { data_type => "DATETIME", default_value => "", is_nullable => 0, size => 19 },
  "updated_on",
  { data_type => "DATETIME", default_value => "", is_nullable => 0, size => 19 },
);
__PACKAGE__->set_primary_key("company_id");


# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-08-05 16:39:27                      
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:DHRIea3OvvtGG+yhaBVTvQ                        


# You can replace this text with custom content, and it will be preserved on regeneration    
1;

 이 중에서 제가 살짝 추가한 부분이 있습니다.

use AutoStoreDateTime;
__PACKAGE__->load_components("PK::Auto", "+AutoStoreDateTime", "Core");

 바로 이부분에 PK::Auto 라는 component 도 불러오라고 지정했습니다. PK::Auto 는 온라인 게임에서 자동으로 PK 를 수행하는   Primary Key Auto Increment 라고 보시면 됩니다. 즉 이 Schema Class 에서는 company_id 가 Primary Key 이니까 자동으로 Auto Increment 해준다는 거죠. (물론 SQL 에서 Auto Increment 를 지정해주면 DBMS 자체적으로 이 행위를 수행하지만, auto increment 가 지정되지 않은 경우에는 PK::Auto가 알아서 해줍니다. 이것을 확인하기 위해서 직접 Company 테이블을 변경해보시길 바랍니다)

  그리고 AutoStoreDateTime 도 있습니다. 근데 이 앞에 +라고 붙었는데.. 이것은 Custom component 입니다. PK::Auto 같은 경우는 DBIx::Class::PK::Auto 라는 모듈을 불러오는 것인데, AutoStoreDateTime 은 DBIC 정식 모듈이 아닌... 여기서 만들어서 쓰겠다라는 것이죠.
use AutoStoreDateTime;

use strict;
use warnings;
use base 'DBIx::Class';

use DateTime;

sub insert {
    my $self = shift;
   
    $self->created_on( DateTime->now( time_zone => 'Asia/Seoul' ) )
                             if $self->result_source->has_column('created_on');
                      
    $self->next::method(@_);
}

sub update {
    my $self = shift;

    $self->updated_on( DateTime->now( time_zone => 'Asia/Seoul' ) )
                           if $self->result_source->has_column('updated_on');
    $self->next::method(@_);
}

1;

  이와 같은 컴포넌트 모듈을 만들었습니다. 이것을 AutoStoreDateTime.pm 이라고 저장하고 MyTest.pm 과 같은 디렉토리에 놓습니다.
  그럼 어떤 결과를 보이는 지 확인해 볼까요?
my $company = $schema->resultset('Company');

while(<DATA>) {
    chomp;
    $company->create({
        'name'    => $_,
    });
}

__DATA__
I company
N company
D company
E company
A company
Y company

  이렇게 Company.name 을 만들도록합니다. company_id 도 지정하지 않았고, created_on 도 지정하지 않았습니다. 등록날짜도 모르면 어떻게 하려고 이럴까요?
사용자 삽입 이미지
  하지만 이렇게 created_on 은 create 한 시점의 날짜/시간을 가지고 있습니다. company_id 도 물론 지정하지 않았는데 이렇게 생겼네요(SQL에서 auto increment 가 있으면 뭐 그게 그거입니다만).

 근데 사장 마인드를 가지신 saillinux 님께서 짝수 회사번호를 가진 회사는 전부 소문자로 표기하고 싶다는 얼토당토 않은 요구를 하고 있습니다. 어쩔 수 있나요. 까라면 까야지..

my $company = $schema->resultset('Company')->search({});

while(my $row = $company->next) {
    if ($row->company_id % 2 == 0) {
        $row->name(lcfirst $row->name);
        $row->update;
    }
}

  이렇게 하면 되겠죠?
사용자 삽입 이미지
  그러면 update 된 레코드만 updated_on 이 지정되게 되죠.  어때요? 참 쉽죠?

 이렇게 DBIC 의 Component 활용에 대해서 알아보았습니다. :-) 직접 Component 를 만들어서 보다 편하게 DB 를 주물러 보심은 어떠실런지요?

  다음에는 Relation 에 대해서 살짝 알아보겠습니다. 

* 참고
 - **** Project



신고
IT/Perl 2008.05.20 21:56

[ Perl ] IRC BOT을 만들어봅시다 :-) #1


 YAPC::ASIA 2008 의 광풍이 불고난 다음, Perl 을 사용하는 사람에게 남은 숙제는, Perl에 대해 제대로 알리는 것입니다. 그리고 어떻게 하면 그것이 가능하느냐에 대해 수없이 고민을 해보았습니다. 어떻게 하면 좋을까 해서 나온 게 일단 use strict 가 무엇이고 문법이 어떻고를 떠나, 어떻게 하면 Perl에 재미를 느낄 수 있을 까 하는 것입니다.
 그래서 생각한 것이 현재 irc.hanirc.org, #perl 에서 움직이고 있는 Perl_^^ BOT에 대한 내용을 한번 올려보면 어떨까 하는 것에서 시작합니다.
 
사용자 삽입 이미지

 IRC BOT을 만들어봅시다 :-) #1

 - Warning!!

 - 우선 이 내용에 대해서 불건전한 사용에 대한 책임은 지지 않습니다.
 - 본 내용은 "난 Perl 을 들어봤다. Linux 커맨드는 기본적인 것은 알고 있다." 의 조건에 부합하신 분들에게 최적화 되어 있습니다.
 - IRC Port가 열려 있어야 합니다.
 - 여기에서는 제 시스템 환경인 CentOS 5, Perl 5.8 이상의 환경을 기반으로 합니다.
 - 특히 Windows 의 경우에는 사용해 본 적이 없기에 장담할 수 없습니다.

 - Intro...


 IRC BOT 을 만들 기 위해, IRC Protocol 을 미리 다 알 필요는 없습니다(물론 저도 전부 모릅니다).
 미리 IRC 프로토콜에 맞춰서 만들어진 모듈이 이미 존재하고, 이에 대한 내용이 구성되어 있기 때문이죠.

  Perl CPAN 모듈에서 대표적인 IRC 클라이언트 모듈은

  Net::IRCPOE::Component::IRC 가 있습니다.

  이중에서 Net::IRC는 2004년 이후로는 관리되지 않고 있으며,
  POE::Component::IRC 는 2008년 4월까지 꾸준히 계속해서 관리되어 오고 있고, 이 모듈을 위한 여러가지 플러그인들이 존재하고 있습니다.

  그리고 이제부터 다루고자 할 모듈도 POE::Component::IRC(이하 PoCo::IRC) 입니다.

  - Tutorial

  우선적으로 해야할 것은 CPAN Module 의 인스톨입니다.

  대부분의 리눅스계열의 OS는 Perl은 기본적으로 들어가 있고, cpan 역시 기본적으로 지원하고 있습니다.
  만약, root 계정을 사용할 수 없으시거나, 웹 호스팅을 이용하고 계신다면, CPAN Module을 로컬 계정에 설치할 수 있습니다.
  이에 대해서는 펄매니아 위키에 자세히 적혀져 있으므로 참고하세요.

$ cpan
cpan shell -- CPAN exploration and modules installation (v1.9205)
ReadLine support enabled
                                                                                                                                              cpan[1]>

  cpan 을 실행하면 cpan용 터미널이 뜹니다. 이때 인스톨 하실 모듈을 넣어주시면 됩니다.

cpan[1]> install POE::Component::IRC

  그러면 모듈을 설치합니다. 중간에 어떤 것을 물어보신다면 그냥 엔터만 믿고 눌러주시면 됩니다.

cpan[2]> quit

  설치가 종료하면 "quit"으로 나옵니다.

  이상으로 POE::Component::IRC 모듈의 설치가 끝났습니다.

 - Summary

  - IRC 를 이용하기 위한 CPAN Module에는 대표적으로 Net::IRC, POE::Component::IRC 가 있습니다.
  - 웹 호스팅을 이용하시거나, root 계정을 사용할 수 없으실 때에는 이곳을 참조하세요.
  - CPAN Module 을 인스톨 하기 위해서는 "cpan 터미널에서 install [모듈이름]을 입력합니다."
    (혹은 cpan [모듈이름])

 - #2에서는

  - PoCo::IRC를 이용해서 BOT의 Nick 을 설정합니다.
  - IRC 서버에 접속합니다.
  - PoCo::IRC를 이용해서 어떤 처리를 할 수 있는지 알아봅니다.

※ 현재 POE::Component::IRC를 사용한 Perl Bot 만들기 프로젝트가 진행중입니다.
- http://code.google.com/p/perl-irc-bot
※ 더불어 perldoc을 한글로 번역하기 위한 프로젝트도 진행중입니다.
- http://code.google.com/p/perldoc-kr
※ 거기에 덧붙여 me2day Perl API를 만드는 프로젝트도 진행중입니다.
- http://code.google.com/p/me2day-perl-api

 참여를 원하시면 댓글을 달아주시거나, email: aiatejin@gmail.com
 혹은 IRC(irc.hanirc.org, #perl)에서 JEEN에게 연락하시면 됩니다.

신고

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

[ Perl ] IRC BOT을 만들어봅시다 :-) #2  (4) 2008.05.21
[ Perl ] IRC BOT을 만들어봅시다 :-) #1  (6) 2008.05.20
YAPC::Asia 2008 이야기 #3  (2) 2008.05.18
YAPC::Asia 2008 이야기 #2  (0) 2008.05.18
TOTAL 466,866 TODAY 40

티스토리 툴바