Back End/Spring && Spring Boot

[Spring Boot / JPA] PK값을 자동으로 증가시키기

Im_Hayden 2024. 6. 11. 16:13

DB에 데이터를 저장할 때 PK값이 꼭 존재해야한다.

물론 이때 PK 값을 직접 넣어 줄 수도 있지만, 대부분의 경우에서는 DB에서 자동으로 생성되게 설정한다.

Spring Data JPA에서 PK값을 자동으로 처리하기 위한 방법을 살펴보자.

GeneratedValue 아노테이션 사용하기

스프링부트에서 PK값을 자동 증가로 설정하기 위해서는, Entity를 정의할 때 PK 필드에 @GeneratedValue를 붙여주면 된다.
이때 설정할수 있는 전략은 아래와 같은 4가지가 존재한다.

  • GenerationType.IDENTITY
  • GenerationType.SEQUENCE
  • GenerationType.TABLE
  • GenerationType.Auto

하나씩 살펴보자.

GenerationType.IDENTITY

GenerationType.IDENTITY키 생성을 DB에 완전히 위임하는 방법이다.

  • 주로 MySQL 등에서 사용된다.
  • 예시
@Entity
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    int user_id;

    String username;
    String password;
    String role;
}

GenerationType.SEQUENCE

GenerationType.SEQUENCESequence 객체를 통해 독자적인 pk값을 차례대로 얻는 방법이다.
이때 Sequence는 pk 생성을 위한 DB 객체이다.

  • @SequenceGenerator 아노테이션을 사용해서, 엔티티마다 각각의 시퀀스로 관리할 수 있다.
    • @SequenceGenerator를 사용하지 않으면, 기본 시퀀스 객체로 pk를 생성한다.
  • 주로 Oracle 등에서 사용한다.
  • 예시
@Entity
@Getter
@Setter
@SequenceGenerator(
        name = "MY_SEQUENCE",
        sequenceName = "SEQ",
        initialValue = 1,
        allocationSize = 1
)
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "MY_SEQUENCE")
    int user_id;

    String username;
    String password;
    String role;
}

@SequenceGenerator

pk 생성을 관리할 Sequence를 생성하는 아노테이션이다.
속성값들은 다음과 같다.

  • name : SequenceGenerator의 이름을 설정
    • 해당 이름을 통해, Entity에서 시퀀스를 등록 가능하다.
  • sequenceName : DB에 등록되는 이름을 설정
  • initialValue : 시퀀스의 시작 지점을 설정한다.
  • allocationSize : 시퀀스가 증가하는 간격을 설정한다.

이때 name필수로 설정 해 주어야 하고, 나머지 값들은 설정하지 않으면 default값을 가진다.

@GenerationType.TABLE

GenerationType.TABLE키 생성 전용 테이블을 만들어 pk를 관리하는 방법이다.

  • GenerationType.SEQUENCE 전략과 상당히 유사하다.
    • GenerationType.SEQUENCE에서는 시퀀스 객체를 사용하여 pk를 관리하는 반면, GenerationType.TABLE에서는 테이블을 이용하여 pk를 관리한다.
  • @TableGenerator 를 사용하여 키 생성 전용 테이블을 생성할 수 있다.
  • 예시
@Entity
@Getter
@Setter
@TableGenerator(
        name = "MY_SEQUENCE_TABLE",
        table = "my_table",
        initialValue = 1,
        allocationSize = 1
)
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,generator = "MY_SEQUENCE_TABLE")
    int user_id;

    String username;
    String password;
    String role;
}

@TableGenerator

pk 관리 테이블을 생성하는 어노테이션이다.
속성들은 아래와 같다.

  • name : SequenceGenerator의 이름을 설정
    • 해당 이름을 통해, Entity에서 테이블을 등록 가능하다.
  • table : 키 생성 테이블 명
  • pkColumnName : 시퀀스 컬럼 명
  • valueColumnName: 시퀀스 값 컬럼 명
  • pkColumnValue: 키로 사용할 값 이름
  • initialValue : pk의 시작 지점을 설정한다.
  • allocationSize : pk가 증가하는 간격을 설정한다.

name은 필수로 지정해 주어야한다.

GenerationType.Auto

자동으로 키 생성 전략을 설정한다.

  • 예시
@Entity
@Getter
@Setter
public class User {
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    int user_id;

    String username;
    String password;
    String role;
}