Programming/Spring

[JPA] GenerationType(AUTO, IDENTITY, SEQUENCE ,TABLE) 기본 키 생성 전략

기록하는 백앤드개발자 2024. 7. 6. 10:10
반응형

ㅁ 들어가며

ㅇ JPA(Java Persistence API)에서 엔티티의 기본 키 생성 전략을 정의하는 데 사용되는 GenerationType에 대해 알아보자.

 

ㅁ GenerationType.IDENTITY이란?

GenerationType enum 부분 캡쳐

ㅇ 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

반응형