2011-02-15

Play 프레임워크에서 hibernate_sequence 대신 테이블 자신의 시퀀스 사용하기

우리나라에서는 아직 Play Framework 사용자가 거의 없는 듯 하다. 이렇게 좋은 웹프레임워크를 쓰는 사람이 없다니 안타깝다. 최근 간단하게 이것을 이용해서 IP관리 프로그램을 만들었는데, 실제로 만들어보니, Rails 정도까지는 아니지만, 다른 웹프레이워크들(Django, CakePHP 등) 정도로 너무 쉽게 개발이 가능하여 생산성이 아주 좋다는 것을 확인하였다. Play Framework 내부적으로 Hibernate 를 사용하여 DB에 접근을 하고 있다. 각 테이블의 레코드를 구분하기 위하여 id 라는 필드를 사용하고 있는데, Oracle/PostgreSQL 에서는 hibernate_sequence 를 생성하여 모든 테이블에 적용하고 있다. 아무래도 하나의 시퀀스를 이용하기 때문에, 대용량처리/부하 등의 문제가 발생할 수 있을 것이라 판단된다. 이 때문에 각 테이블별로 시퀀스를 생성해서 사용할 수 없는지 방법을 찾아서 아래와 같이 정리하였다. 이 밖에 몇가지 방법이 있는 듯 하나, 복잡하여 일단 쉽게 쓸 수 있는 방법부터 알아보자.


  1. 일반적으로 Play 에서 Model 을 생성할 때 아래와 같이 작성한다.
    package models;
     
    import java.util.*;
    import javax.persistence.*;
    import play.*;
    import play.db.jpa.*;
    import play.data.validation.*;
     
    @Entity
    @Table(name = "users")
    public class Users extends Model {
        public String userid;
        public String password;
        public String name;
    }
    그런데, Oracle 이나 PostgreSQL 처럼 Sequence 를 이용하여 id 를 자동증가를 시키면, hibernate_sequence 라는 공통 시퀀스를 모든 테이블에서 사용하게 된다. 상당히 값을 지원하긴 하지만, 대용량 처리에서는 불리하다고 할 수 있다. 테이블당 자신의 시퀀스를 사용하는 것이 일반적이다.
  2. 테이블 자신만의 시퀀스를 사용하여 id 컬럼을 사용하려면 아래와 같이 설정한다. 우선, conf/application.conf 에 를 추가한다.
    jpa.dialect=org.hibernate.dialect.PostgreSQLDialect
  3. 모델은 아래와 같이 변경한다.
    package models;
     
    import java.util.*;
    import javax.persistence.*;
    import play.*;
    import play.db.jpa.*;
    import play.data.validation.*;
     
    @Entity
    @Table(name = "users")
    public class Users extends GenericModel {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        public Long id;
     
        public String userid;
        public String password;
        public String name;
    }
    Model → GenericModel 로 바뀌었으며, id 필드가 추가되었다.
  4. 이렇게 하고 실행해보면, DB에서 users 라는 테이블과 users_id_seq 라는 시퀀스가 생성된 것을 확인할 수 있다.

2011-02-10

Debian Linux 6.0(squeeze)에서 Ruby 설치

Debian Linux 에서 Ruby를 사용하려면 패키지를 설치하면 쉽게 사용할 수 있다. 그러나 원하는 버전의 Ruby를 사용하고자 한다면, 별도로 설치해야 되는데, 그 방법을 설명하고자 한다.


  • 참조
  • 필요한 패키지 설치
    # apt-get install autoconf build-essential bison curl git
  • rvm 설치
    # bash < <( curl -L http://bit.ly/rvm-install-system-wide )
  • /etc/profile 에 다음 내용 추가
    [[ -s "/usr/local/lib/rvm" ]] && source "/usr/local/lib/rvm"
  • rvm 정상설치 확인
    # source "/usr/local/lib/rvm"
    # type rvm | head -1
    rvm is a function
    위에서 rvm is a function 이 나오면 정상 설치된 것이다.
  • 설치할 수 있는 ruby 버전들 확인
    # rvm list known
  • 원하는 버전의 ruby 설치
    # rvm install 1.9.2
    # rvm --default use 1.9.2
  • ruby 버전 확인
    # ruby -v
    ruby 1.9.2p136 (2010-12-25 revision 30365) [i686-linux]