반응형
JPA에서는 기본키의 값을 설정하는데 다양한 옵션을 제공한다.
먼저 기본키 매핑부터 진행해보자.
기본 키 매핑 방법
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Id와 @GeneratedValue라는 어노테이션을 통해 기본키 매핑을 해줄 수 있다.
만약 기본키 값을 직접 할당해줄 경우 @Id만 사용하면 된다.
반대로 자동 생성을 원할 경우 @GeneratedValue를 사용하면 된다.
@GeneratedValue을 사용할 경우 아래의 매핑전략을 활용할 수 있다.
IDENTITY : 데이터베이스에 위임. (MYSQL)
SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용. @SequenceGenerator 필요. (ORACLE)
TABLE : 키 생성용 테이블 사용. (모든 DB)
AUTO : 방언에 따라 자동 지정. (기본 값)
기본 키 매핑 전략 별 특징
IDENTITY
- 기본 키 생성을 데이터베이스에 위임.
- MySQL, PostgreSQL, SQL Server, DB2에서 주 사용(ex : MySQL의 AUTO_INCREMENT)
- JPA는 트랜잭션 커밋 시점에 INSERT SQL을 실행하지만 AUTO_INCREMENT로 설정할 경우 persist 점에서 INSERT SQL을 실행하여 Id값 조회 가능.
SEQUENCE
- 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 데이터베이스 오브젝트를 사용 (ex: 오라클 시퀀스)
- 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용.
- 아래와 같이 @SequenceGenerator 어노테이션을 통해 설정을 해준 후 사용해 줘야 한다.
@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ",
initalValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
TABLE
- 키 생성 전용 테이블을 만들어서 데이터베이스 시퀀스를 흉내내는 방식.
- 모든 데이터베이스에 적용 가능하지만 크기가 늘어날수록 성능이슈가 발생.
@TableGenerator 속성
속성 | 설명 | 기본값 |
name | 식별자 생성기 이름 | 필수 |
table | 키생성 테이블명 | hibernate_sequences |
pkColumnName | 시퀀스 컬럼명 | sequence_name |
valueColumnName | 시퀀스 값 컬럼명 | next_val |
pkColumnValue | 키로 사용할 값 이름 | 엔티티 이름 |
initialValue | 초기 값, 마지막으로 생성된 값이 기준 | 0 |
allocationSize | 시퀀스 한번 호출에 증가수(성능 최적화 목적) | 50 |
catalog, schema | 데이터베이스 catalog, schema 이름 | |
uniqueConstraints(DDL) | 유니크 제약조건 |
권장하는 식별자 전략
기본 키 설정 조건
- null값은 허용하지 않는다.
- 유일해야 한다.
- 변해선 안 된다.
과거에는 자연 키를 기본 키로 하는 것이 정석이었지만, 주민등록번호 DB 암호화 이슈로 최근에는 변할 가능성이 적은 대리 키 방식을 선호한다.
따라서 Long형 + 대체키 + 키 생성전략 사용 방식을 권장한다.
본 내용은 아래의 강의를 참고했습니다.
반응형
'Framework > 🍃Spring' 카테고리의 다른 글
JPA - 양방향 연관관계와 연관관계 주인 - 2 (0) | 2022.12.15 |
---|---|
JPA - 양방향 연관관계와 연관관계 주인 - 1 (1) | 2022.12.14 |
JPA - 플러시(Flush)란? (2) | 2022.12.01 |
JPA - 영속성 컨텍스트란? (0) | 2022.11.25 |
SpringBoot + Gradle기반의 EhCache 사용 (0) | 2022.02.10 |
댓글