Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

거인의 코딩일지

[JPA] 기본키 생성 전략 과 차이 본문

코딩/JAVA

[JPA] 기본키 생성 전략 과 차이

코딩거인 2023. 10. 7. 10:25
728x90

기본키 생성 전략
  • JPA 가 제공하는 DB 기본키 할당 전략은 직접 할당 방식, 자동 생성 방식 이 존재한다.
직접 할당 방식
  • 직접 할당 방식을 사용할 경우 Entity를 생성할 때 Key Column 에 @Id 를 사용해주면 끝이다.
@Id
private long id;
  • @Id 가 적용 가능한 타입은
    1. Java 기본형 (int, double, long ...)
    2. Java Wrapper
    3. String
    4. Java.util.Date
    5. Java.sql.Date
    6. Java.math.BigDecimal
    7. java.math.BigInteger
자동 생성 방식
  • 자동 생성 방식을 사용할 경우 @Id 와 @GeneratedValue 를 사용한다.
  • 자동생성 방식은 대리 키를 사용하는 방식으로 IDENTITY, SEQUENCE, TABLE, AUTO 네 가지가 있다.
  • IDENTITY
    1. 기본키 생성을 DB에 위임하는 전략이다.
    2. AutoIncrement 기능을제공해 기본 키 값을 자동으로 DBMS 에서 사용한다.
    3. Data를 DB 에 Insert 한 후 기본 키 값을 조회
    4. Id가 null일 경우 해당 객체의 Id를 DB의 AUTO_INCREMENT를 가져와 할당한다.
    5. 객체를 저장할 때?
      1. JPA에서 영속성 컨텍스트에서 객체를 관리하기 위해서는 무조건 ID 속성, 즉 PK 값이 있어야 한다.
        (JPA 입장에서는 Map의 key 값이 없다면 해당 객체의 값을 넣을 수 있는 방법이 없기 때문이다.)
        AUTO_INCREMENT 경우 애플리케이션에서는 그 값이 얼마임을 알지 못하기에 DB에 insert문을 날려야 id 값을 알 수 있다.
      2. 객체를 save() 메서드로 저장을 할 때 원래는 트랜잭션이 끝나는 COMMIT 시점 전에 flush가 이루어지지만,
        해당 경우는 DB에서 id 값을 받아와야 하니 save() 메서드를 호출하는 시점에 insert 쿼리가 나간다. (flush가 이루어진다.)
      3. 이렇게 id 값을 할당한 객체는 영속성 컨텍스트 1차 캐시에 값을 넣게된다. 
  • SEQUENCE
    1. DB의 sequence 객체를 이용해 유일한 값을 순서대로 생성한다.
    2. @SequenceGenerator(시퀀스를 생성하는 어노테이션)과 함께 사용할 수 있다.
    3. 만약 sequence 객체를 사용하지 않는 DB 벤더를 이용할 경우 Sequence를 관리할 객체(테이블)을 생성한다. 
      단 jpa ddl auto 설정이 되어있어야 한다.
    4. 객체를 저장할 때?
      1. IDENTITY 전략과 다른점이 존재한다.
        해당 전략은 단순히 sequence 값만 시퀀스 객체에서 조회해 오면 되기에, 엔티티 테이블에 해당 객체를 바로 insert 할 필요가 없다.
      2. 객체를 save() 메서드로 저장을 할 때 id 값을 채우기 위해 select 문이 실행되고 트랜잭션이 끝나는 COMMIT 시점에 insert 문이 실행된다.
@Entity
@SequenceGenerator(
        name="BOARD_SEQ_GENERATOR",
        sequenceName="BOARD_SEQ",
        initialValue=1,allocationsSize=1
)
  • name : 실제 @Id 필드에서 참조할 이름
  • sequenceName : 실제 데이터베이스에 생성되는 시퀀스 객체 이름
  • allocationsSize : DB에서 가져오는 시퀀스 호출에 증가하는 값의 크기
  • TABLE
    1. Key 생성 Table을 사용하는 전략이다
    2. Key 생성 전용 Table을 생성하고 name, value 로 사용할 Column을 생성하여 DB Sequence 를 흉내내는 전략이다.
    3. 이 전략을 사용할 시, jpa ddl auto 설정이 되어 있지 않았다면 해당 시퀀스 테이블 생성이 선행이 되어야한다.
    4. @TableGenerator(테이블 생성 어노테이션)과 함께 사용할 수 있다.
  • AUTO
    1. 선택한 DB 방언에 따라 자동으로 IDENTITY, SEQUENCE, TABLE 전략을 자동으로 선택한다.
    2. DB의 종류도 많고 기본 키 생성 방식도 다양하기에 해당 전략은 DB를 변경해도 Code 수정을 하지 않아도 되는 장점이 있고 Key 생성 전략이 정해지지 않은 개발 초기 단계나 프로토 타입 개발시에 편리하게 사용될 수 있다.
    3. 하지만 만약 AUTO 로 SEQUENCE 나 TABLE 전략이 선택될 경우 Sequence 나 키 생성 Table을 미리 생성 해두어야 한다.
    4. 만약 DDL 자동 생성 기능을 사용한다면Hibernate가 기본 값을 사용해 알아서 생성해준다.
728x90