[JPA] ID 생성 전략

koline·2024년 1월 8일

JPA

목록 보기
4/11

ID 생성 전략


엔티티를 생성할 때 PK의 관리는 일반적으로 Database의 관리 영역에 있다. AUTO_INCREMENT 기능이나 Oracle의 경우 Sequence 등을 활용한다. (MySQL에서 Sequence기능 사용하기)

Entity의 INSERT 쿼리를 보낼 때 이러한 ID 매핑을 자동으로 해주는 어노테이션이 있다.

GenerationType.AUTO (기본 전략)

이 방식은 JPA가 데이터베이스에 따라 자동으로 선택하는 ID 생성 전략이다. 데이터베이스에 따라 GenerationType.IDENTITY, GenerationType.SEQUENCE, GenerationType.TABLE 중 하나를 사용하게 된다.

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

GenerationType.IDENTITY

이 방식은 테이블의 AUTO_INCREMENT기능을 사용해 PK를 생성하는 방식이다.

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

GenerationType.SEQUENCE

이 전략은 데이터베이스의 Sequence 기능을 사용하여 PK를 생성한다. 시퀀스는 데이터베이스에서 고유한 값을 순차적으로 생성하는 기능이다. 주로 Oracle, PostgreSQL 등에서 사용된다.

Sequence를 사용하려면 @SequenceGenerator 어노테이션을 추가해야 한다.

그런데 MySQL을 사용하더라도 JPA가 자체적으로 시퀀스 기능과 동일한 방식으로 PK를 생성해준다. 아래의 코드를 작성하고 Build 실행하면 @SequenceGenerator에서 설정한 sequenceName의 이름으로 된 테이블도 같이 생성된 것을 볼 수 있을 것이다.

해당 테이블에서 PK Sequence를 관리하며 차례로 PK를 발급해주고 저장된 값을 UPDATE 해주는 것으로 보인다.

다만 이 방식은 뒤에서 설명할 TABLE 전략과 상당히 비슷하다.

@Entity
public class TestEntity {
	@Id
    @GeneratedValue(
    	strategy = GenerationType.SEQUENCE,
        generator = "TEST_ENTITY_ID_GENERATOR"
    )
    @SequenceGenerator(
        name = "TEST_ENTITY_ID_GENERATOR",
        sequenceName = "TEST_ENTITY_ID_SEQUENCE",
        initialValue = 1,
        allocationSize = 1
    )
    private Long id;
}

GenerationType.TABLE

이 전략은 별도의 데이터베이스 테이블을 사용하여 ID를 생성한다. 이 테이블은 모든 엔티티에 대한 ID를 관리하며, 여러 엔티티에서 공유할 수 있다. @TableGenerator 어노테이션을 추가해야 한다.

@Entity
public class TestEntity {
	@Id
    @GeneratedValue(
    	strategy = GenerationType.TABLE,
    	generator = "TEST_ENTITY_ID_GENERATOR"
    )
    @TableGenerator(
    	name = "TEST_ENTITY_ID_GENERATOR",
        table = "TEST_ENTITY_ID_TABLE",
        pkColumnName = "TEST_ENTITY_PK_COLUMN_NAME",
        valueColumnName = "gen_val",
        allocationSize = 1
    )
    private Long id;
}
profile
개발공부를해보자

0개의 댓글