블로그 이미지
JEEN

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

Rss feed Tistory
IT/Perl 2008.08.06 21:24

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


 현재 개발중인 프로젝트에 쓰이는 내용을 살짝 다뤄볼까 합니다.

 음... 테이블의 칼럼 수가 많거나, 적거나.. 아직 정해지지 않아서 나중에 추가될 지도 모른다거나... 이런 불안함에서 제대로 테이블을 만들더라도, 나중에 ALTER TABLE 의 폭발을 겪게 되는 경우가 있었습니다. 컬럼을 추가하거나, 지우거나, 바꾸거나 하면서 불안함이 있다는 것이죠. 그래서 YAML 을 그대로 집어넣게 되었습니다.

 이럴때 가볍게 쓸 수 있는 것이 inflate_column 입니다.
 위의 얘기는 잠시 접어두고 그럼 예제를 볼까요? MyTest::User 에 다음과 같은 것을 추가했습니다.

 __PACKAGE__->inflate_column(<br />    user_id => {<br />        inflate => sub {<br />            my ($value, $obj) = @_;<br />            # $obj->$column_name 으로 User Schema Class 의 컬럼을 참조할 수 있습니다.<br />            sprintf "%04d", $value;<br />        },<br />        deflate => sub {<br />            my ($value, $obj) = @_;<br />            $value;<br />        },<br />    });

  이것으로 무엇을 하느냐...

  User 의 user_id 컬럼을 지정해서 user_id 를 처음부터 건드려놓은 상태로 내놓거나(inflate), Table 에 입력을 할 시에도 마찬가지로 입력 직전에 건드린 상태로 쓰기를 수행(deflate) 하는 겁니다.

  위의 예제에서는 User 의 user_id 를 zero-fill 합니다. 1 이라면 0001 이라든가.. 이런 형식으로 나오겠죠?

my $user = $schema->resultset('User')->search({});

while(my $row = $user->next) {
    print $row->user_id."\t".$row->name."\n";
}

  그럼 한번 뽑아볼까요?
사용자 삽입 이미지
  자, 이렇게 나오네요.

  이렇게해서, 예를들면 datetime 의 data type 을 가지고 있는 created_on, updated_on 은 DateTime 인스턴스로 만들어 줄 수도 있겠죠.

  제가 사용하는 경우는 ...

CREATE TABLE test (
   no    INT NOT NULL,
   attributes   TEXT NOT NULL,
   created_on DATETIME NOT NULL,
   updated_on DATETIME NOT NULL,
   primary key(no)
 );

  이런 Schema 가 있다면...

use YAML;
__PACKAGE__->inflate_column(
  attributes => {
     inflate => sub {
        my ($value, $obj) = @_;
        YAML::Load($value);
      },
      deflate => sub {
        my ($value, $obj) = @_;
        YAML::Dump($value);
       },
});

  이렇게 inflate_column 을 설정해두었습니다. 그리고 이런식으로 등록합니다.

 my $obj = {
    irc => {
       perl => {
         saillinux => {
           envy => 'yuni',
           attack => 'JEEN',
           love  => [ 'ero', '하얀_고양이', 'Fate' ],
          },
        },
    },
 };
 
 $schema->resultset('Test')->create( attributes => $obj );

 이렇게 등록된 데이터는 YAML 형식으로 보관되어 있을 겁니다.
 그리고 빼내서 쓸려면 이런식으로 합니다.
 
my $rs = $schema->resultset('Test')->search({})->first;
print $rs->attributes->{irc}->{perl}->{saillinux}->{envy};  # yuni
print for (@{ $rs->attributes->{irc}->{perl}->{saillinux}->{love} }); # ero 하얀_고양이 Fate

  이렇게 사용합니다. :-)

  inflate_column 를 사용하지 않는 경우에는 집어넣을 때는 매번 YAML::Dump 하고...
  뺄때는 매번 YAML::Load 해야 되겠죠.

  이렇게 가볍게 InflateColumn 에 대해서 알아보았습니다.
신고
TOTAL 469,934 TODAY 7

티스토리 툴바