시퀀스란 순차적으로 증가하는 데이터를 자동으로 반환해주는 데이터베이스 객체를 말한다. PK값의 중복을 방지하기 위해 사용하기도 하는데, 게시판의 글 번호를 예시로 들 수 있다. 게시판의 글 번호를 수동으로 +1해줄 필요 없이, 자동으로 이루어져 매우 편리하다.
JPA는 엔티티들을 영속성 컨텍스트에서 관리하는데, 이 엔티티를 구분할 수 있는 식별자가 필요하다. 식별자가 되는 필드는 @Id
어노테이션을 통해 지정할 수 있다.
이처럼 JPA에서 엔티티에 식별자를 할당하는 방법은 여러가지가 있지만, 그 중 Oracle, DB2, H2, PostgreSQL 등에서 사용할 수 있는 시퀀스 기능을 활용한 SEQUENCE 전략이 있다.
@SequenceGenerator
@SequenceGenerator
는 시퀀스 생성기를 설정하는 어노테이션이다. 클래스 단위 또는 식별자 필드에서 @GeneratedValue
설정과 함께 사용 가능하다.
@SequenceGenerator
의 속성은 아래와 같다.
name
: @GeneratedValue
에서 지정할 수 있는 시퀀스 생성기 이름을 등록합니다.sequenceName
: 데이터베이스에 생성해둔 시퀀스 이름initialValue
: DDL을 생성할 때 사용하며, 시퀀스 생성 DDL에서 처음 시작하는 값 지정allocationSize
: JPA에서 가상으로 관리할 시퀀스 할당 범위로, 성능 최적화를 위해 값 수정이 가능하다. 기본값은 50이며, 1로 설정하는 경우 매번 insert시마다 DB의 시퀀스 호출catalog
, schema
: DB의 카타로그와 스키마 이름@SequenceGenerator(name="team_seq_gen", sequenceName="team_seq_id"
, initialValue=1, allocationSize=50)
DB에서 생성한 시퀀스를 이용하여 식별자를 생성하는 생성기를 생성한 이후에는 해당 시퀀스 생성기를 사용하겠다는 설정이 필요하다. @GeneratedValue
를 통해 strategy
속성을 GenerationType.SEQUENCE
로 하여 식별자를 할당하는 전략을 '시퀀스 방식으로 하겠다'라는 설정과, 식별자를 생성해줄 식별자 생성기를 team_seq_gen
으로 사용하겠다는 설정을 속성을 통해 설정한다.
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="team_seq_gen")