- 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
로 미리 할당할 수 있습니다.
- 영속성 컨텍스트에서 객체 관리하기 위해서는 PK가 있어야 하는데, PK 생성을 DB가 하므로 persist() 시 db에 insert를 실행합니다. 하지만 매번 그러지 않아도 되도록
- 장점
- 이때 시퀀스 호출은 하이버네이트에서 실행합니다. 시퀀스 호출을 하이버네이트에서 하는 것은 장점이라고 생각합니다. 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 |
댓글