@GeneratedValue(strategy = GenerationType.IDENTITY)란?@GeneratedValue(strategy = GenerationType.IDENTITY)는 JPA(Java Persistence API)에서 데이터베이스의 기본 키(primary key) 값을 자동으로 생성해 주는 전략을 정의할 때 사용하는 어노테이션입니다.
id와 같은 기본 키를 생성하고 관리할 때, 개발자가 직접 값을 지정하지 않고, 데이터베이스가 자동으로 값을 생성해 주도록 설정할 수 있습니다. @GeneratedValue는 이 작업을 도와주는 JPA 어노테이션입니다.@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 값을 생성하도록 설정합니다.GenerationType 전략의 종류@GeneratedValue는 기본 키를 생성하는 방식(전략)을 정의하기 위해 strategy 속성을 사용합니다. JPA는 4가지 전략을 제공합니다:
GenerationType.IDENTITY
AUTO_INCREMENT, PostgreSQL의 SERIAL.IDENTITY 전략을 사용하면, JPA는 INSERT SQL이 실행된 후 데이터베이스가 생성한 ID 값을 가져옵니다.null이어야 하며, 데이터베이스가 직접 값을 생성합니다.GenerationType.SEQUENCE
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
@SequenceGenerator(name = "user_seq", sequenceName = "user_sequence", allocationSize = 1)
private Long id;GenerationType.TABLE
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;GenerationType.AUTO
IDENTITY, Oracle에서는 SEQUENCE를 선택합니다.GenerationType.IDENTITY의 특징IDENTITY 전략은 데이터베이스가 기본 키 값을 자동 생성합니다.AUTO_INCREMENT 예제MySQL에서는 AUTO_INCREMENT 속성을 통해 IDENTITY 전략이 동작합니다.
CREATE TABLE user (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255)
);
위 테이블에서 id 값은 데이터베이스가 자동으로 증가시킵니다.
IDENTITY는 한 번에 하나의 엔티티를 삽입하는 경우에 적합합니다.SEQUENCE 전략이 더 적합합니다.GenerationType.IDENTITY를 사용해야 할까?MySQL 또는 MariaDB를 사용하는 경우
AUTO_INCREMENT를 사용하여 기본 키 값을 쉽게 생성하므로, IDENTITY 전략과 잘 맞습니다.ID 값이 외부에서 관리되지 않을 때
단일 삽입이 많을 때
영속성 컨텍스트 관리
IDENTITY 전략은 데이터베이스가 ID를 생성하기 때문에, INSERT SQL이 실행된 이후에야 ID 값을 사용할 수 있습니다.대량 삽입 비효율
SEQUENCE 전략이 더 적합합니다. IDENTITY는 매번 쿼리를 실행하여 ID 값을 생성해야 하기 때문입니다.@GeneratedValue(strategy = GenerationType.IDENTITY)는 데이터베이스가 기본 키 값을 자동으로 생성하도록 설정하는 전략입니다.AUTO_INCREMENT를 지원하는 데이터베이스에서 사용됩니다.이렇게 @GeneratedValue(strategy = GenerationType.IDENTITY)를 사용하면 기본 키 관리를 데이터베이스에 위임할 수 있어 편리합니다. 하지만, 사용 시 데이터베이스 특성과 대량 작업 시의 성능을 고려해야 합니다.