[JPA] GenerationType(AUTO, IDENTITY, SEQUENCE ,TABLE) 기본 키 생성 전략
ㅁ 들어가며
ㅇ JPA(Java Persistence API)에서 엔티티의 기본 키 생성 전략을 정의하는 데 사용되는 GenerationType에 대해 알아보자.
ㅁ GenerationType.IDENTITY이란?
ㅇ GenerationType은 JPA에서 엔티티의 기본 키 값을 자동으로 생성하는 방법을 지정할 수 있다.
ㅇ @GeneratedValue 어노테이션과 함께 사용되며, 다음 다섯 가지 타입이 있다.
ㅁ IDENTITY
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
ㅇ지속성 공급자가 데이터베이스 ID 열을 사용하여 엔터티에 대한 기본 키를 할당해야 함을 나타낸다.
ㅇ 데이터베이스의 AUTO_INCREMENT 기능을 사용한다.
ㅁ SEQUENCE
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
@SequenceGenerator(name = "user_seq", sequenceName = "USER_SEQ", allocationSize = 1)
private Long id;
ㅇ 지속성 공급자가 데이터베이스 시퀀스를 사용하여 엔터티에 기본 키를 할당해야 함을 나타낸다.
ㅇ SEQUENCE 전략은 데이터베이스 시퀀스를 사용하여 기본 키를 생성한다. Oracle, PostgreSQL, DB2, H2에서 주로 사용된다.
ㅁ TABLE
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "user_gen")
@TableGenerator(name = "user_gen", table = "id_gen", pkColumnName = "gen_name", valueColumnName = "gen_value")
private Long id;
ㅇ 지속성 공급자가 고유성을 보장하기 위해 기본 데이터베이스 테이블을 사용하여 엔터티에 기본 키를 할당해야 함을 나타낸다.
ㅇ AUTO 생성 전략은 데이터베이스 리소스가 존재할 것으로 예상하거나 데이터베이스 리소스 생성을 시도할 수 있다.
ㅁ AUTO
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
ㅇ 지속성 공급자가 고유성을 보장하기 위해 기본 데이터베이스 테이블을 사용하여 엔터티에 기본 키를 할당해야 함을 나타낸다.
ㅇ MySQL의 auto-increment에 해당된다.
ㅁ UUID
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private Long id;
ㅇ 지속성 공급자가 RFC 4122 Universally Unique IDentifier를 생성하여 엔터티에 대한 기본 키를 할당해야 함을 나타낸다.
ㅇ AUTO와 UUID의 차이를 이해하기 위해서는 MySQL의 ID 생성 방식을 이해해야 한다.
ㅁ MySQL의 ID생성 방식
ㅇ Auto-increment
- 순차적으로 증가하는 정수 값을 사용
- 단순하고 이해하기 쉬움
- 데이터베이스 서버에 의해 자동 생성됨
- 테이블 간 관계 설정이 쉬움
- 인덱싱 성능이 좋음
auto increment는 키를 예측하기 쉬워서 SQL Injection과 같은 공격에 취약하다
이런 부분을 보안하기 위해 uuid를 사용할 수 있다.
ㅇ UUID (Universally Unique Identifier)
- 128비트 길이의 유일한 식별자
- 분산 시스템에서 유용함
- 충돌 가능성이 매우 낮음(중복키 발생 가능성이 매우 낮게 있음)
- 데이터 마이그레이션이 쉬움
- 보안상 더 안전할 수 있음
참조: [MySQL] AUTO INCREMENT vs UUID
ㅁ 마무리
ㅇ GenerationType은 애플리케이션의 요구사항과 사용하는 데이터베이스에 따라 적절히 선택해야 한다.
ㅇ AUTO를 사용하면 대부분의 경우 문제없이 동작하지만, 특정 데이터베이스의 기능을 최대한 활용하고 싶다면
ㅇ 해당 데이터베이스에 최적화된 전략을 선택하는 것이 좋다.
ㅁ 함께 보면 좋은 사이트
ㅇ [MySQL] AUTO INCREMENT vs UUID
ㅇ [JPA] 기본 키 생성 전략과 각 전략의 차이 - GenerationType