Play 프레임워크에서 hibernate_sequence 대신 테이블 자신의 시퀀스 사용하기
우리나라에서는 아직 Play Framework 사용자가 거의 없는 듯 하다. 이렇게 좋은 웹프레임워크를 쓰는 사람이 없다니 안타깝다. 최근 간단하게 이것을 이용해서 IP관리 프로그램을 만들었는데, 실제로 만들어보니, Rails 정도까지는 아니지만, 다른 웹프레이워크들(Django, CakePHP 등) 정도로 너무 쉽게 개발이 가능하여 생산성이 아주 좋다는 것을 확인하였다. Play Framework 내부적으로 Hibernate 를 사용하여 DB에 접근을 하고 있다. 각 테이블의 레코드를 구분하기 위하여 id 라는 필드를 사용하고 있는데, Oracle/PostgreSQL 에서는 hibernate_sequence 를 생성하여 모든 테이블에 적용하고 있다. 아무래도 하나의 시퀀스를 이용하기 때문에, 대용량처리/부하 등의 문제가 발생할 수 있을 것이라 판단된다. 이 때문에 각 테이블별로 시퀀스를 생성해서 사용할 수 없는지 방법을 찾아서 아래와 같이 정리하였다. 이 밖에 몇가지 방법이 있는 듯 하나, 복잡하여 일단 쉽게 쓸 수 있는 방법부터 알아보자.
- 일반적으로 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 라는 공통 시퀀스를 모든 테이블에서 사용하게 된다. 상당히 값을 지원하긴 하지만, 대용량 처리에서는 불리하다고 할 수 있다. 테이블당 자신의 시퀀스를 사용하는 것이 일반적이다. - 테이블 자신만의 시퀀스를 사용하여 id 컬럼을 사용하려면 아래와 같이 설정한다. 우선, conf/application.conf 에 를 추가한다.
jpa.dialect=org.hibernate.dialect.PostgreSQLDialect
- 모델은 아래와 같이 변경한다.
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 필드가 추가되었다. - 이렇게 하고 실행해보면, DB에서 users 라는 테이블과 users_id_seq 라는 시퀀스가 생성된 것을 확인할 수 있다.
Play framework 관련 한글로 작성된 글 찾기가 어려운 시점에서 반가운 마음에 댓글 남겨봅니다. :)
답글삭제아직은 PlayFramework 에 대한 글을 찾기 쉽지 않지만, 시간이 지날수록 관심있는 사람들이 많아지면서, 좋은 글도 많이 생기겠죠. *^^*
답글삭제