본문 바로가기
Spring Framework/JPA

@GeneratedValue 기본키 전략 4가지

by devstep 2022. 6. 5.
  • 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 전략이 사용됨을 알았습니다.

리뷰어 추천 참고 자료

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

@Embeddable 사용 이유와 장점  (0) 2022.06.04
JPA 엔티티 양방향 참조에 대한 생각  (0) 2022.06.04

댓글