@GeneratedValue - IDENTITY, SEQUENCE, AUTO, TABLE

박영준·2023년 6월 24일
0

Spring

목록 보기
18/58

1. 의문점

프로젝트를 만들고, 각 게시글마다 IDENTITY 옵션을 이용하여 Id값을 부여해서 구분하도록 헀다.

첫 번째 게시글의 아이디는 "id":1, 두 번째는 "id":2 ... 이렇게 진행됐었다.

그러나 생성한 게시글들을 모두 지우고 새로운 게시글을 작성했을 때,
해당 게시글이 "id":1 에서 시작하는 것이 아닌, 삭제한 그 다음 id 값이 부여되었다.

궁금증에 AUTO 옵션으로 바꿔서 했더니 이번엔 랜덤한 아이디 값이 부여되면서 첫 게시글의 id값은 "id":105가 되고, 이 값에서부터 하나씩 더한 "id":106이 나왔다.
그리고 Java 프로젝트를 재실행하면 시작 id 값은 또 랜덤하게 변경되었다."id":54

2. @GeneratedValue

1) 정의

  • JPA에서 Entity의 Primary Key를 생성하여 주는 기능

  • Pk로 사용될 Entity의 프로퍼티에 @Id를 선언 후, @GeneratedValue를 선언해준다.

2) 옵션

IDENTITY

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

(강의에서는 @GeneratedValue의 옵션으로 IDENTITY 을 사용했다.)

  • DB의 identity 컬럼을 이용

  • 기본 키 생성을 데이터베이스에 위임

    • 데이터베이스에 의존적
  • Entity를 등록할 때, DB에서 AUTO_INCREAMENT 하여 PK를 생성 후 INSERT 한다.

  • 사용처 : MySQL, PostgresSQL, SQL Server, DB2

SEQUENCE

@SequenceGenerator(
        name = "MEMBER_SEQ_GENERATOR",
        sequenceName = "MEMBER_SEQ",
        initialValue = 1,
        allocationSize = 1
)
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
    				generator = "MEMBER_SEQ_GENERATOR")
    @Column(name = "member_id")
    private Long Id;
  • DB의 Sequence를 이용하여 PK를 생성

    • 데이터베이스에 의존적
  • @SequenceGenerator 속성: Sequence 전략 사용 시 @SequenceGenerator을 선언하여 사용

    • name : 식별자 생성기 이름 (필수)

    • sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름

    • initialValue

      • DDL 생성 시에만 사용됨
      • 시퀀스 DDL을 생성할 때 처음 1 시작하는 수를 지정
    • allocationSize

      • 시퀀스 한 번 호출에 증가하는 수
      • 성능 최적화에 사용
      • 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다
    • catalog, schema : 데이터베이스 catalog, schema 이름

  • 사용처 : Oracle ...

AUTO

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
  • 기본값으로 DB 방언에 맞춰(특정 DB에 맞게) 자동으로 설정

  • 데이터베이스에 따라 IDENTITY, SEQUENCE, TABLE 방법 중 하나를 자동으로 선택해주는 방법

    • 따라서, 데이터베이스를 변경해도 코드를 수정할 필요 X
  • 예시 1 : Oracle일 경우, SEQUENCE를 자동으로 선택해서 사용

TABLE

@TableGenerator(
        name = "MEMBER_SEQ_GENERATOR",
        table = "MEMBER_SEQUENCE",
        pkColumnValue = "MEMBER_SEQ",
        allocationSize = 1
)
public class Member extends BaseEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,
                    generator ="MEMBER_SEQ_GENERATOR" )
    @Column(name = "member_id")
    private Long Id;
  • 유일성이 보장된 데이터베이스 테이블을 이용

  • 키 생성 테이블을 사용하는 방법

  • 키 생성 전용 테이블을 하나 만들고, 여기에 이름과 값으로 사용할 컬럼을 만든다

  • 테이블을 사용하므로, 데이터베이스 벤더에 상관없이 모든 데이터베이스에 적용 가능

3. 결론

IDENTITY 옵션을 사용할 때 id값이 초기화되지 않았던 이유는
Postman에서 해당 게시글을 삭제해도 해당 게시글을 DB에서 관리하기 때문이었던 것 같다.


참고: [ Spring-Boot ] JPA @GeneratedValue 사용하기
참고: [Spring JPA] @Id와 @GeneratedValue - Primary Key 생성방법

profile
개발자로 거듭나기!

0개의 댓글