@GeneratedValue 기본키 전략 4가지

2022. 6. 5. 21:00·Spring Framework/JPA
  • DB에 따라 기본키 생성 전략의 디폴트 값이 달라지기 때문에 MySQL을 기준으로 구현한면, 원하는 전략을 명시적으로 코드로 남겨두시길 추천한다.
  • 결론 : AUTO 전략이 DB마다 다르게 채택되고, Mysql에서는 sequence가 따로 없기 때문에 table 전략이 결국 사용됨을 알았습니다.
    조사하면서 table 전략은 사용 이유가 확실할 때만 사용하는 것이 좋을 것 같다고 생각했는데요.
    지금의 경우 PK가 숫자로만 구성된다면 굳이 table로 PK가 관리되지 않아도 될 거라 판단합니다.

@GeneratedValue 로 기본키 전략 4가지

1. IDENTITY 전략

  • 사용법 : @GeneratedValue(strategy = GenerationType.IDENTITY)
  • DB의 AUTO_INCREMENT를 통해 기본 키 생성
  • 단점
    • 영속성 컨텍스트에서 객체 관리하기 위해서는 PK가 있어야 하는데, PK를 DB에 위임했으므로 persist() 시 db에 insert를 실행합니다.
  • 장점
    • 각 테이블의 auto_increment를 이용하므로 index가 일정하게 증가하고, 따로 id관리를 하지 않아도 됩니다.

2. SEQUENCE 전략

  • 사용법 : @GeneratedValue(strategy = GenerationType.SEQUNCE, generator="USER_PK_GENERATOR")
    • @SequenceGenerator 추가 설정
    • @SequenceGenerator( name = "USER_PK_GENERATOR", sequenceName = "USER_PK_SEQ", initailValue = 1, allocationSize = 50 )
  • DB가 SEQUENCE를 통해 생성하는 PK값을 하이버네이트에서 호출하여 사용
  • 단점
    • 영속성 컨텍스트에서 객체 관리하기 위해서는 PK가 있어야 하는데, PK 생성을 DB가 하므로 persist() 시 db에 insert를 실행합니다. 하지만 매번 그러지 않아도 되도록 allocationSize로 미리 할당할 수 있습니다.
  • 장점
    • 이때 시퀀스 호출은 하이버네이트에서 실행합니다. 시퀀스 호출을 하이버네이트에서 하는 것은 장점이라고 생각합니다. DB에서 시퀀스 호출을 따로 하지 않아도 되기 때문입니다.
    • 또한, 시퀀스 호출을 매번 persist()마다 하지 않고 allocationSize 만큼 미리 해와서 사용합니다.

3. Table 전략

  • 사용법 : @GeneratedValue(strategy = GenerationType.TABLE, generator="USER_PK_GENERATOR")
    • DB 벤더 중 SEQUENCE가 없는 곳에서 마치 시퀀스 처럼 키 생성하는 테이블을 사용하는 방법
    • @TableGenerator 추가 설정
    • @TableGenerator( name = "USER_PK_GENERATOR", table = "USER_PK_SEQ", pkColumnValue = "USER_SEQ", allocationSize = 1 )
  • 단점 : PK 생성/관리에 최적화 되어있지 않은 테이블을 사용하기 때문에 성능문제에 이슈가 있을 수 있습니다.
    • TABLE은 동시성 환경에서 빈번한 락으로 인해 성능 저하가 심하여 권장되지 않는다고 한다.
  • 장점 : PK를 숫자가 아닌 특별한 형식을 지닌 것으로 사용해야 하는데 DB에 SEQUENCE가 없을 때 사용할 수 있습니다.

4. AUTO 전략 - 기본전략

  • 사용법 : @GeneratedValue(strategy = GenerationType.AUTO)
  • 각 DB에 따라 org.hibernate.id.SequenceGenerator가 자동으로 생성합니다. 즉, 식별자 생성시 JPA 구현체의 기본 전략을 따릅니다.
  • MySQL은 GenerationType.TABLE 전략이 선택됩니다.
  • 장점
    • 하이버네이트가 생성하므로 persist() 시 db insert를 하지 않아도 됩니다.
  • 단점
    • PK라는 중요 데이터 생성 자체를 하이버네이트가 한다는 것이 DB가 애플리케이션에 종속되는 느낌입니다.
    • TABLE 전략은 피했으면 하는 전략이었고, 사용할만한 특별한 이유가 있을 때 사용해야 한다고 생각했는데 Mysql 사용시 AUTO전략을 사용하면 TABLE 전략이 사용됨을 알았습니다.

리뷰어 추천 참고 자료

  • https://hyune.gitbook.io/hyune-wiki/and/codesquad/22reviewer/airbnb
저작자표시 (새창열림)

'Spring Framework > JPA' 카테고리의 다른 글

@Embeddable 사용 이유와 장점  (0) 2022.06.04
JPA 엔티티 양방향 참조에 대한 생각  (0) 2022.06.04
'Spring Framework/JPA' 카테고리의 다른 글
  • @Embeddable 사용 이유와 장점
  • JPA 엔티티 양방향 참조에 대한 생각
devstep
devstep
웹 백엔드 개발자
  • devstep
    개발 여정
    devstep
  • 전체
    오늘
    어제
    • 분류 전체보기 (86)
      • Java관련 (27)
        • Java (21)
        • Intellij (4)
      • Spring Framework (14)
        • Spring (11)
        • JPA (3)
      • Concept (6)
        • 인증 (1)
        • REST API (1)
        • 테스트코드 (3)
        • 클린코드 (1)
      • Database (8)
        • RDBMS공통 (1)
        • MySQL (6)
        • Oracle (1)
      • git (2)
      • Computer Science (3)
        • 네트워크 (1)
        • 자료구조 (1)
        • 보안 (1)
      • Essay (15)
        • Learning Essay (10)
        • WIL (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    대칭암호화
    innodb
    단위테스트
    springsecurity
    보안
    linux
    성능테스트
    부하테스트
    seed
    bean
    자바메모리모델
    component
    JMeter
    aggregate
    storageEngine
    부하테스트도구
    클린코드
    ClusteredIndex
    DDD
    applicationcontext
    nofile
    tdd
    비대칭암호화
    블록암호화
    nginx
    인텔리제이실행에러
    JavaMemoryModel
    JVM
    테스트코드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
devstep
@GeneratedValue 기본키 전략 4가지
상단으로

티스토리툴바