일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- CloudWatch
- 티스토리챌린지
- Elasticsearch
- Pinpoint
- Java
- CKA 기출문제
- 정보처리기사 실기
- Linux
- Kubernetes
- 코틀린 코루틴의 정석
- APM
- 정보처리기사실기 기출문제
- AI
- mysql 튜닝
- minikube
- MySQL
- 정보처리기사 실기 기출문제
- 기록으로 실력을 쌓자
- CKA
- IntelliJ
- kotlin spring
- kotlin coroutine
- 공부
- 오블완
- aws
- kotlin querydsl
- PETERICA
- Spring
- AWS EKS
- kotlin
- Today
- Total
피터의 개발이야기
[JPA] GenerationType(AUTO, IDENTITY, SEQUENCE ,TABLE) 기본 키 생성 전략 본문
[JPA] GenerationType(AUTO, IDENTITY, SEQUENCE ,TABLE) 기본 키 생성 전략
기록하는 백앤드개발자 2024. 7. 6. 10:10
ㅁ 들어가며
ㅇ 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
'Programming > Spring' 카테고리의 다른 글
[Spring] Gradle 9.0 호환성 경고 해결하기, Deprecated Gradle features were used in this build (0) | 2024.08.08 |
---|---|
[JPA] CascadeType.REMOVE과 orphanRemoval=true, MySQL DELETE CASCADE 비교 (0) | 2024.08.02 |
[QueryDSL] querydsl관련 명령어를 gradle탭에 생성하기, querydsl plugin 설치 (0) | 2024.07.05 |
[Spring] Gradle 프로젝트에서 테스트를 스킵하는 방법 (0) | 2024.07.03 |
[QueryDSL] fetchFirst()와 fetchOne()의 차이 (0) | 2024.06.29 |