본문 바로가기
JAVA/SpringBoot

JPA @GeneratedValue: AUTO, IDENTITY, SEQUENCE, TABLE 에 대해 알아보자

by GangDev 2024. 3. 24.

 

@GeneratedValue 는 JPA에서 사용되는 어노테이션으로, 엔티티의 기본키(primary key)를 자동으로 생성할 때 사용된다.
주로 @Id 어노테이션과 함께 사용되어서 엔티티의 고유 식별자를 자동으로 생성하고 관리하는 데 도움을 준다.

 

Strategy에는 4가지가 있다.

 

GenerationType.AUTO: 특정 데이터베이스가 제공하는 방식을 사용하여 기본 키를 자동으로 생성한다. 데이텁베이스에 따라 'SEQUENCE', 'IDENTITY', 'TABLE' 중 가장 적합한 전략 하나를 자동으로 선택한다.
데이터베이스에 대한 독립성을 제공하여, 데이터베이스 변경 시 JPA 전략을 변경할 필요가 없다.
만약 H2 데이터베이스를 사용하고 있다면, JPA는 SEQUENCE 전략을 택할 수 있다.

@Entity
public class ExampleEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    // ... 
}

 

GenerationType.IDENTITY: 데이터베이스의 자체적인 ID 생성 메커니즘을 사용한다. 주로 MySQL과 MSSQL Server 같은 데이터베이스에서 사용된다.
(MySQL 데이터베이스에서는 AUTO_INCREMENT 를 사용하여 각 행의 ID를 자동으로 생성한다)
일반적으로 데이터베이스에서 제공하는 auto-increment(자동 증가)를 사용한다. 이 방법을 사용하여 간단하고 빠르게 주요 키 값을 생성할 수 있다.
주로 하나의 레코드(행)를 한 번에 삽입, 수정, 삭제하는 일반적인 상황에서는 효과적이다. 반면, 대량의 데이터를 한 번에 처리하는 배치 작업에는 적합하지 않을 수 있다.
(IDENTITY 전략을 사용하면 각 레코드를 삽입할 때마다 데이터베이스에서 식별자를 할당하기 때문. 대량의 데이터를 처리할 땐 성능 문제가 발생할 수 있다. 그래서 애플리케이션이 작은 규모일수록 IDENTITY 전략이 간단하고 효율적일 수 있다.)

@Entity
public class ExampleEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

}

 

GenerationType.SEQUENCE: 데이터베이스의 시퀀스 객체를 사용하여 기본 키를 생성한다. 시퀀스는 미리 정의된 순차적인 값을 반환하는 데이터베이스 객체다. 주로 Oracle, PostgreSQL 같은 데이터베이스에서 사용된다.
(오라클 데이터베이스에서 시퀀스는, 연속적인 숫자 값을 생성하는 데이터베이스 객체다. 이 시퀀스를 사용하여 ID를 생성한다)
(SEQUENCE 전략은 대량의 데이터를 한 번에 처리하는 배치 작업에서 더 효율적일 수 있다. 미리 생성된 시퀀스 값을 사용하기 때문에 여러 레코드를 한 번에 삽입할 때 주요 키 값이 중복되지 않는다. 그래서 대규모 데이터 처리나 분산 시스템에서는 SEQUENCE 전략이 더 적합할 수 있다.)

@Entity
@SequenceGenerator(name = "example_seq", sequenceName = "example_seq", allocationSize = 1)
public class ExampleEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "example_seq")
    private Long id;

}

 

@SequenceGenerator 어노테이션은 시퀀스를 생성하는데 사용된다.(데이터베이스에서 일련 번호를 생성)
위 코드에서는 example_seq 라는 이름의 시퀀스를 생성하고 있다.
sequenceName 속성은 시퀀스의 이름을 설정하고, allocationSize는 시퀀스에서 한 번에 할당할 값의 양을 나타낸다.
@GeneratedValue 어노테이션에서 GenerationType.SEQUENCE 를 사용하여 시퀀스를 통해 값을 생성하도록 지정한다. generator 속성은 어떤 시퀀스 생성기(generator)를 사용할지 지정한다.
(@SequenceGenerator 어노테이션에서 정의한 example_seq 라는 이름의 시퀀스 생성기를 사용하라는 의미)

 

GenerationType.TABLE: 이 전략은 별도의 테이블을 사용해서 기본 키 값을 생성한다. 데이터베이스에 독립적이지만, 다른 전략들보다 성능이 떨어질 수 있다고 한다.

@Entity
@TableGenerator(name = "example_gen", table = "id_gen", pkColumnName = "gen_name", valueColumnName = "gen_val", allocationSize = 1)
public class ExampleEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "example_gen")
    private Long id;

    // 다른 필드들...

    // 생성자, 게터, 세터 등...
}

 

위 코드에서, @TableGenerator에서는, example_gen이라는 이름의 테이블을 생성하고 있다. 이 테이블은 id_gen이라는 이름의 데이터베이스 테이블을 사용하여 값을 생성한다. pkColumnName 과 valueColumnName 속성은 테이블의 열 이름을 지정한다. allocationSize는 한 번에 할당할 값의 양을 나타낸다.

 

각 전략은 사용하는 데이터베이스와 애플리케이션의 요구사항에 따라 달라진다. IDENTITY 전략은 간단하고 빠르지만, 배치 처리에는 적합하지 않을 수 있다. SEQUENCE 전략은 배치 처리에 좀 더 효율적일 수 있다. TABLE 전략은 데이터베이스에 독립적이지만, 성능 면에서 다소 느릴 수 있다.