새소식

Java

[Java] @GenerativeValue의 개념과 예시

  • -

 

 

@GenerativeValue

 

 

 

1)   개념

 

JPA에서 엔티티의 주요 키(primary key) 값을 자동으로 생성하는 방법을 지정하는데 사용

 

@GeneratedValue 애너테이션 바로 아래에 있는 필드가 주요 키(primary key)에 해당하는 필드입니다.

 

 

2)   strategy

 

@GeneratedValue 애너테이션은 strategy 속성과 함께 사용됩니다.

 

strategy 속성은 주요 키 값을 생성하는 전략(strategy)을 지정하는 역할을 합니다.

 

일반적으로 세가지 주요 전략을 사용할 수 있습니다.

 

 

 

GenerationType.IDENTITY

 

● 개념

데이터베이스의 자동 증가(auto-increment) 기능을 사용하여 기본 키 값을 생성합니다.

데이터베이스에 의존적인 전략으로, 대부분의 관계형 데이터베이스에서 지원합니다.

예를 들어, MySQL의 AUTO_INCREMENT를 사용하는 경우에 적용됩니다.

 

● 주의사항

대부분 데이터베이스의 자동 증가(auto-increment) 기능과 함께 주요 키(primary key)를 생성하기 위해 사용됩니다. 

즉, 주요 키에 GenerationType.IDENTITY를 사용하는 경우가 일반적입니다.

주요 키 이외의 다른 필드에 GenerationType.IDENTITY를 사용하는 것은 적합하지 않을 수 있음. (다른 방법 이용 추천)


 

● 예시1

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

 

<코드 분석>

@Id
// 해당 필드가 주요키 (Primary Key)임을 나타내는 애너테이션

@GeneratedValue(strategy = GenerationType.IDENTITY)
// GenerationType.IDENTITY 전략을 사용하여 id 필드의 값을 자동으로 생성한다는 것을 나타냅니다.
// 데이터베이스의 자동 증가(auto-increment) 기능을 활용하여 기본 키 값을 생성
private Long id;

 

 

 

 

● 예시2

@Entity
@Table(name = "orders")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long orderNumber;

    // 주문 엔티티의 다른 필드들

    // 생성자, getter, setter 등
}

 

<코드 분석>

@Entity
@Table(name = "orders")
public class Order {
    
@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long orderNumber;
    // orderNumber 필드의 값을 자동으로 생성
    // 주문 엔티티의 다른 필드들
    // 생성자, getter, setter 등
}

 

 

 

 

GenerationType.SEQUENCE

 

● 개념

데이터베이스 시퀀스(sequence)를 사용하여 기본 키 값을 생성합니다.

데이터베이스 종류에 따라 시퀀스를 지원하는 경우에 사용할 수 있습니다.

 

※ 시퀀스 : 시퀀스는 데이터베이스에서 생성된 고유한 순차적인 숫자를 생성하는 객체

(시퀀스를 지원하는 데이터베이스 : Oracle, PostgreSQL, DB2, H2 등)

 

 

 

● 구조

@SequenceGenerator(name = "시퀀스 생성기 이름", sequenceName = "데이터 베이스에서 사용될 시퀀스 이름", allocationSize = 할당 크기)
public class 엔티티 이름 {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "시퀀스 생성기 이름")
    필드;
}

 

0) @SequnceGenerator : 시퀀스 생성을 위한 애너테이션 (이름, 시작값, 크기 등을 지정할 수 있음)

1) name : 시퀀스 생성기 이름

2) sequenceName : 데이터베이스에서 사용될 시퀀스 이름

3) allocationSize : 시퀀스에서 한번에 할당되는 값의 크기 

 

 

 

 

 

● 예시

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence_generator")
@SequenceGenerator(name = "sequence_generator", sequenceName = "my_sequence")
private Long id;

 

<코드 분석>

@Id
@SequenceGenerator(name = "sequence_generator", sequenceName = "my_sequence")
// 시퀀스 생성기의 이름은 sequence_generator
// 데이터베이스에 사용될 시퀀스 이름은 my_sequence

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence_generator")
//SEQUENCE 전략을 사용하고, 그 시퀀스 생성기의 이름은 위의 sequence_generator임을 나타냄
private Long id;

 

 

 

 

● 예시2

@Entity
@Table(name = "employees")
@SequenceGenerator(name = "employee_sequence", sequenceName = "employee_seq", initialValue = 1, allocationSize = 1)
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "employee_sequence")
    private Long id;

    private String name;

    // Constructors, getters, setters
}

 

<코드 분석>

@Entity
@Table(name = "employees")

@SequenceGenerator(name = "employee_sequence", sequenceName = "employee_seq", initialValue = 1, allocationSize = 1)
// 시퀀스 생성기를 정의하는 애너테이션
// 시퀀스 생성기의 이름은 employee_sequence
// 데이터베이스에 사용될 시퀀스의 이름은 employee_seq
// 초기값은 1, 할당크기는 1

public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "employee_sequence")
// SEQUENCE 전략으로 주요키를 생성하고 생성기의 이름은 employee_sequence
    private Long id;

    private String name;

    // Constructors, getters, setters
}

 

 

 

 

● 활용

그럼 시퀀스 생성을 코드로 하는 방법은 위에서 설명하였습니다.

데이터베이스에서는 그럼 어떤 일을 해야할까요?

 

 

 

PostgreSQL 데이터베이스 예시를 보여주겠습니다.

 

 

1) 데이터베이스에 접속합니다.

 

 

2) 쿼리를 생성하여줍니다.

CREATE SEQUENCE my_sequence START WITH 1 INCREMENT BY 1;

이 쿼리는 my_sequence라는 이름의 시퀀스를 생성하고, 시작값은 1이며 1씩 증가하는 것을 의미합니다.

 

 

3) 시퀀스를 사용하여 데이터를 삽입하거나 업데이트할 때 시퀀스를 참조하는 필드에 NEXTVAL 함수를 사용하여 시퀀스 값을 가져올 수 있습니다.

INSERT INTO 테이블명 (주요키열, 다른열1, 다른열2) VALUES (NEXTVAL('my_sequence'), '값1', '값2');

(이 코드는 데이터를 테이블에 삽입하는 것이고, 시퀀스를 수정하는 내용은 아님)

 

 

4) Java에서 시퀀스 생성

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence_generator")
@SequenceGenerator(name = "sequence_generator", sequenceName = "my_sequence")
private Long id;

 시퀀스 생성기의 이름이 PostgreSQL에서 만든것과 동일해야하는 것이 아니라,

실제로 데이터베이스에서 사용할 시퀀스 이름(sequenceName)과 PostgreSQL에서 만든 이름과 같아야합니다. => my_sequence

 

 

 

 

 

 

③  GenerationType.TABLE

 

● 개념

별도의 키 생성용 테이블을 사용하여 기본 키 값을 생성합니다.

데이터베이스의 테이블에 값을 저장하고 조회하는 방식입니다.

 

JPA 구현체(예: Hibernate)가 주요 키 값을 생성하기 위해 자체적으로 테이블을 생성하고 관리하기 때문에

데이터베이스에서 추가적인 작업을 할 필요가 없습니다.

 

 

 

● 구조

@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "table_generator")
@TableGenerator(name = "table_generator", table = "id_generator", pkColumnName = "pk_name", valueColumnName = "pk_value", pkColumnValue = "member_id", allocationSize = 1)
private Long id;

 

0) @TableGenerator : 테이블 생성을 위한 애너테이션

1) name : 테이블 생성기 이름

2) talbe : 데이터베이스에서 사용될 테이블 이름

3) pk(primary key)

 

 

 

 

● 예시

@Entity
@Table(name = "members")
@TableGenerator(name = "member_generator", table = "id_generator", pkColumnName = "id_key", pkColumnValue = "member_id", allocationSize = 1)
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "member_generator")
    private Long id;

    // 다른 필드들

    // 생성자, getter, setter 등
}

 

 

 

 

 

④  GenerationType.AUTO

 

● 개념

JPA 구현체에 따라 자동으로 적절한 전략을 선택하도록 합니다.

주로 데이터베이스의 자동 증가(auto-increment) 기능이 있는 경우에는 해당 기능을 사용하고,
그렇지 않은 경우에는 시퀀스(sequence)나 테이블(Table Generator) 등의 다른 전략을 선택할 수 있습니다.

 

 

● 예시

@Entity
@Table(name = "members")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    // 다른 필드들

    // 생성자, getter, setter 등
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2023.07.12 - [Java] - [JPA] 코드 예제 Part.1) JPA 학습 전 흉내내보기

 

[JPA] 코드 예제 Part.1) JPA 학습 전 흉내내보기

JPA 맛 1) 취지 JPA 사용하기 전, JPA 없이 구현하는 것이 가능하다는 점을 확인해보자. JPA를 사용하게 되면 어떻게 코드가 바뀌는 지도 알 수 있을 것이다. 예시는 멤버(Member) 클래스와 취미(Hobby) 클

devwarriorjungi.tistory.com

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.