블로그 이미지
JEEN

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

Rss feed Tistory
IT/Perl 2008.08.05 16:46

[ Perl ] Perl 에서의 ORM , DBIx::Class에 대해서... #1 - DBIC::Schema::Loader

: 요 근래 잠깐 깜빡하고 Catalyst 에 관한 글을 쓰지도 못하고 있었네요.

일단 그전에 미리 Template Toolkit 같은 Template Engine 이나
DBIx::Class 같은 ORM 같은 것을 알아놓고 가는 게 좋겠다는 생각에...
잠시 얘기가 빙빙 겉돌고 있습니다.

 일단 DBIx::Class, 통칭 DBIC 라고 불리는 것부터 알고 나중에 차근차근 Catalyst 내용을 이어가도록 하겠습니다.

 ORM 이라고 아시죠? Object-Relation Mappings 라고...
 자세한 내용은 검색해보시면 짠 하고 나올겁니다. ( 검색 예 )

 Perl 에서 ORM 을 얘기하면 DBIC 가 대표적인 예가 될 것입니다. 그외 여러가지 있지만 안써봐서 생략합니다.

 DBIC 를 제대로 사용하려면 Schema 클래스를 만들어야 합니다.

 만들어야한다에 대한 제대로 다시 정의를 하자면, "만들게 해야합니다" 입니다.

 DBIx::Class::Schema::Loader 가 이 일을 해주는데요. 그런고로 한번 만들게 해보겠습니다.
 CREATE TABLE user (
   user_id  int not null auto_increment,
   name    varchar(255) not null,
   created_on datetime not null,
   updated_on datetime not null,
   primary key(user_id)
 );

 CREATE TABLE company (
   company_id int not null auto_increment,
   name           varchar(255) not null,
   created_on datetime not null,
   updated_on datetime not null,
   primary key(company_id)
 );

 CREATE TABLE deathnote (
   death_id int not null auto_increment,
   user_id   int not null,
   company_id int not null,
   created_on datetime not null,
   updated_on datetime not null,
   primary key(death_id)
 );

 이와같은 SQL 을 깨작거렸습니다. 우선 mytest 라는 DB 를 만들고 위의 user 와 company와 deathnote 라는 테이블을 생성합니다.

use strict;
use warnings;

use DBIx::Class::Schema::Loader (qw/make_schema_at/);

make_schema_at(
    'MyTest', {
        components => [],
        dump_directory => './',
    },
    \@ARGV,
    );

 그리고 이와같은 스크립트를 만들었습니다.(schema-loader.pl)

 perl schema-loader.pl dbi:mysql:mytest "mysql user" "mysql pass"

 그런 다음에는 이렇게 명령을 내립니다. (DBI 에서 connect_info 설정해주는 그것입니다)

Dumping manual schema for MyTest to directory ./ ...
Schema dump completed.
  그러면 이렇게 Schema dump 가 끝났다고 말해주죠.
 
사용자 삽입 이미지
  그러면 이처럼 Schema 클래스가 생성되게 됩니다.

package MyTest;

use strict;
use warnings;

use base 'DBIx::Class::Schema';

__PACKAGE__->load_classes;


# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-08-05 16:25:30        
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:P0OGC/gBKsOEyhe8yV+xsA          


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

  MyTest.pm 은 이처럼 썰렁합니다만..

package MyTest::User;

use strict;
use warnings;

use base 'DBIx::Class';

__PACKAGE__->load_components("Core");
__PACKAGE__->table("user");
__PACKAGE__->add_columns(
  "user_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("user_id");


# Created by DBIx::Class::Schema::Loader v0.04005 @ 2008-08-05 16:25:30                      
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:wV7hRdze6zdTrll+QAg4fw                        


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

  MyTest/User.pm (MyTest::User) 는 이처럼 속이 꽉찼습니다. 처음에 SQL 로 정의해준 내용들이 그대로 정의되어 DBIC Schema 를 구성하게 됩니다.

  Catalyst 에서는 위의 스크립트(schema-loader.pl)를 쓸 필요없이...
./script/[App]_create.pl model MyTest DBIC::Schema MyTest create=static dbi:mysql:mytest *** ****
 이런식으로 하면 Schema Class 가 생성됩니다.

 다음에는 DBIC 를 이용해서 어떻게 데이터를 다루는 가에 대해서 알아보겠습니다.

 -- 참고
 * DBIx::Class
 * DBIx::Class::Schema::Loader
 
신고
TOTAL 474,069 TODAY 23

티스토리 툴바