PK를 지정할 때 값을 자동으로 증가 시키기 위해 @GeneratedValue를 사용하는 편입니다.
여기서 들어갈 수 있는 전략으로 어떤게 있는지 정리해 보겠습니다.
1. GenerationType.AUTO
- JPA가 사용하는 기본 전략입니다. 데이터베이스에 따라 자동으로 적절한 생성 전략을 선택합니다.
- 어떤 데이터베이스에서는 시퀀스를 사용하고, 어떤 데이터베이스에서는 테이블을 사용하게 됩니다.
@GeneratedValue(strategy = GenerationType.AUTO)
2. GenerationType.IDENTITY
- 데이터베이스의 Auto Increment 기능을 사용하여 기본 키를 생성합니다.
- 주로 MySQL, SQL Server 등에서 사용됩니다.
- 주의점: 배치 삽입 시 성능 저하가 있을 수 있습니다. IDENTITY 전략은 삽입 후에 ID 값을 얻을 수 있기 때문에 한 번에 여러 엔티티를 삽입할 때 효율이 떨어질 수 있습니다.
@GeneratedValue(strategy = GenerationType.IDENTITY)
3. GenerationType.SEQUENCE
- 데이터베이스의 시퀀스를 사용하여 기본 키를 생성합니다.
- 주로 Oracle, PostgreSQL 등에서 사용됩니다.
- 이 전략은 시퀀스 값을 미리 가져와서 ID로 사용하기 때문에, 대량 삽입 시 성능이 좋습니다.
- 주의점: 시퀀스를 지원하지 않는 데이터베이스에서는 사용할 수 없습니다.
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_sequence")
@SequenceGenerator(name = "my_sequence", sequenceName = "MY_SEQUENCE", allocationSize = 1)
4. GenerationType.TABLE
- 별도의 테이블을 만들어서 키 값을 관리합니다.
- JPA가 관리하는 테이블에서 키 값을 생성하고, 이 값을 PK로 사용합니다. 데이터베이스에 종속적이지 않아서 어느 데이터베이스에서나 사용할 수 있습니다.
- 특정한 데이터베이스에 종속되지 않는 키 생성 전략을 사용하고 싶을 때.
- 주의점: 성능이 다른 전략들에 비해 다소 떨어질 수 있으며, 테이블을 추가로 관리해야 합니다.
@GeneratedValue(strategy = GenerationType.TABLE, generator = "my_table_generator")
@TableGenerator(name = "my_table_generator", table = "ID_GEN", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", allocationSize = 1)
요약
- AUTO: 데이터베이스에 따라 자동으로 적절한 전략을 선택.
- IDENTITY: 데이터베이스의 Auto Increment 기능을 사용하여 키를 생성.
- SEQUENCE: 데이터베이스의 시퀀스를 사용하여 키를 생성.
- TABLE: 별도의 테이블을 사용하여 키를 관리.