@GeneratedValue(strategy = GenerationType.IDENTITY)란?

예린·2024년 11월 18일

SpringBoot

목록 보기
2/3

@GeneratedValue(strategy = GenerationType.IDENTITY)란?

@GeneratedValue(strategy = GenerationType.IDENTITY)는 JPA(Java Persistence API)에서 데이터베이스의 기본 키(primary key) 값을 자동으로 생성해 주는 전략을 정의할 때 사용하는 어노테이션입니다.

데이터베이스에서 id와 같은 기본 키를 생성하고 관리할 때, 개발자가 직접 값을 지정하지 않고, 데이터베이스가 자동으로 값을 생성해 주도록 설정할 수 있습니다. @GeneratedValue는 이 작업을 도와주는 JPA 어노테이션입니다.


1. @GeneratedValue의 사용법

이 어노테이션은 엔티티 클래스에서 기본 키(primary key) 필드에 사용됩니다. 기본적으로 @Id와 함께 사용되어 JPA가 이 필드를 데이터베이스의 기본 키로 인식하고, 자동으로 값을 생성하게 합니다.

예제 코드

import javax.persistence.*;

@Entity
public class User {

    @Id // 기본 키
    @GeneratedValue(strategy = GenerationType.IDENTITY) // IDENTITY 전략 사용
    private Long id;

    private String username;

    // Getter & Setter
    public Long getId() {
        return id;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

위 코드에서:

  • @Id: id 필드를 기본 키로 설정합니다.
  • @GeneratedValue(strategy = GenerationType.IDENTITY): 데이터베이스가 자동으로 ID 값을 생성하도록 설정합니다.

2. GenerationType 전략의 종류

@GeneratedValue는 기본 키를 생성하는 방식(전략)을 정의하기 위해 strategy 속성을 사용합니다. JPA는 4가지 전략을 제공합니다:

  1. GenerationType.IDENTITY

    • 데이터베이스가 자동으로 ID 값을 생성합니다.
    • 예: MySQL의 AUTO_INCREMENT, PostgreSQL의 SERIAL.
    • IDENTITY 전략을 사용하면, JPA는 INSERT SQL이 실행된 후 데이터베이스가 생성한 ID 값을 가져옵니다.
    • 특징:
      • ID 값은 null이어야 하며, 데이터베이스가 직접 값을 생성합니다.
      • 단일 행 INSERT에 적합하며, ID 값이 필요할 때마다 쿼리를 실행해야 합니다.
    • 사용 예: 위에서 작성한 예제.
  2. GenerationType.SEQUENCE

    • 데이터베이스의 시퀀스(sequence) 객체를 사용하여 ID를 생성합니다.
    • PostgreSQL, Oracle과 같은 데이터베이스에서 사용 가능.
    • JPA는 시퀀스를 미리 호출하여 버퍼링된 ID 값을 가져올 수 있으므로 대량 삽입 작업에 효율적입니다.
    • 특징:
      • 대량의 엔티티를 삽입할 때 적합합니다.
    • 예제:
      @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
      @SequenceGenerator(name = "user_seq", sequenceName = "user_sequence", allocationSize = 1)
      private Long id;
  3. GenerationType.TABLE

    • 데이터베이스에 별도의 테이블을 생성하여 ID 값을 관리합니다.
    • 데이터베이스에 독립적이며, 어떤 데이터베이스에서도 사용할 수 있습니다.
    • 그러나 별도의 테이블 조회가 필요하므로 성능이 떨어질 수 있습니다.
    • 예제:
      @GeneratedValue(strategy = GenerationType.TABLE)
      private Long id;
  4. GenerationType.AUTO

    • JPA가 기본적으로 사용하는 전략으로, 데이터베이스에 적합한 전략을 자동으로 선택합니다.
    • 예를 들어, MySQL에서는 IDENTITY, Oracle에서는 SEQUENCE를 선택합니다.

3. GenerationType.IDENTITY의 특징

1. 데이터베이스에 의존

  • IDENTITY 전략은 데이터베이스가 기본 키 값을 자동 생성합니다.
  • 데이터베이스가 ID를 생성하기 전까지는 ID 값을 알 수 없기 때문에, INSERT SQL이 실행된 이후에야 ID 값을 가져올 수 있습니다.

2. MySQL AUTO_INCREMENT 예제

MySQL에서는 AUTO_INCREMENT 속성을 통해 IDENTITY 전략이 동작합니다.

CREATE TABLE user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255)
);

위 테이블에서 id 값은 데이터베이스가 자동으로 증가시킵니다.

3. 단일 행에 적합

  • IDENTITY는 한 번에 하나의 엔티티를 삽입하는 경우에 적합합니다.
  • 대량 데이터 삽입 작업에서는 비효율적일 수 있으므로, 이런 경우 SEQUENCE 전략이 더 적합합니다.

4. 언제 GenerationType.IDENTITY를 사용해야 할까?

  1. MySQL 또는 MariaDB를 사용하는 경우

    • MySQL과 MariaDB는 AUTO_INCREMENT를 사용하여 기본 키 값을 쉽게 생성하므로, IDENTITY 전략과 잘 맞습니다.
  2. ID 값이 외부에서 관리되지 않을 때

    • 데이터베이스가 기본 키 값을 자동으로 관리하도록 설정하고 싶을 때 사용합니다.
  3. 단일 삽입이 많을 때

    • 대량 삽입보다는 한 번에 한 행씩 추가하는 작업이 많을 때 적합합니다.

5. 주의점

  1. 영속성 컨텍스트 관리

    • IDENTITY 전략은 데이터베이스가 ID를 생성하기 때문에, INSERT SQL이 실행된 이후에야 ID 값을 사용할 수 있습니다.
    • 따라서 ID 값이 필요한 연관 관계를 설정하려면, INSERT가 먼저 실행되어야 합니다.
  2. 대량 삽입 비효율

    • 대량의 데이터를 한 번에 삽입해야 하는 경우, SEQUENCE 전략이 더 적합합니다. IDENTITY는 매번 쿼리를 실행하여 ID 값을 생성해야 하기 때문입니다.

6. 요약

  • @GeneratedValue(strategy = GenerationType.IDENTITY)는 데이터베이스가 기본 키 값을 자동으로 생성하도록 설정하는 전략입니다.
  • 주로 MySQL과 같은 AUTO_INCREMENT를 지원하는 데이터베이스에서 사용됩니다.
  • 데이터베이스가 ID 값을 관리하므로, 개발자는 ID 생성에 대해 신경 쓰지 않아도 됩니다.
  • 단일 행 삽입 작업에 적합하며, 대량 삽입에는 적합하지 않을 수 있습니다.

이렇게 @GeneratedValue(strategy = GenerationType.IDENTITY)를 사용하면 기본 키 관리를 데이터베이스에 위임할 수 있어 편리합니다. 하지만, 사용 시 데이터베이스 특성과 대량 작업 시의 성능을 고려해야 합니다.

0개의 댓글