[JPA] 기본키 매핑 어노테이션
기본 키 매핑 어노테이션
-
@Id
-
@GeneratedValue
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
기본키 매핑 방법
- 직접 할당 : @Id만 사용
- 자동 생성(@GeneragedValue)
- IDENTITY : 데이터베이스에 위임, MYSQL
- SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE
- @SequenceGenerator필요
- TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용
- @TableGenerator 필요
- AUTO : 방언에 따라 자동 지정, 기본값
IDENTITY 전략
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
- 기본 키 생성을 데이터베이스에 위임
- 주로 MYSQL, PostgreSQL, SQL Server, DB2에서 사용( MYSQL의 AUTO_INCREMENT )
- JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행
- AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행 한 이후에 ID값을 알 수 있음
- IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회한다.
- 원래, 영속성 컨텍스트에서 commit 하는 시점에 db에 값이 들어가는데 IDENTITY 전략만 예외로 em.persist() 시점에 데이터베이스에 들어간다. 영속 컨텍스트에서 관리하려면 PK가 있어야하는데 디비에 들어가봐야 그 값을안다.
- Identity는 디비에 넣기전까지 pk가 없어서 setMemberId(“sss”); 같은걸 못넣기 때문에 em.persist() 시점에 데이터베이스에 값이 들어간다.
SEQUENCE 전략
- 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트(예 : 오라클 시퀀스)
- 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용
SEQUENCT - @SequenceGenerator
- name : 식별자 생성기 이름 (필수)
- sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
- initialValue : DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 1 시작하는 수를 지정한다.(default : 1)
- allocationSize : 시퀀스 한 번 호출에 증가하는 수 (성능 최적화에 사용됨) 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야한다. (default : 50)
- 한번에 db에서 50까지 땡겨서 올려놓고 사용하는 개념으로 성능 최적화에 사용되는것
- catalog, schema : 데이터베이스 catalog, schema 이름
TABLE 전략
- 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
- 모든 데이터베이스에 적용이 가능하다는 장점이 있지만 테이블을 직접사용하니깐 락도 걸릴수있고 성능에 이슈가있다.
TableGenerator - 속성
- name : 식별자 생성기 이름 / 필수
- table : 키생성 테이블 명
- pkColumnName : 시퀀스 컬럼명
- valueColumnNa : 시퀀스 값 컬럼명
- pkColumnValue : 키로 사용할 값 이름 / 기본값 : 엔티티 이름
- initialValue : 초기 값, 마지막으로 생성된 값이 기준이다.
- allocationSize : 시퀀스 한 번 호출에 증가하는 수 / 기본값 : 50
- catalog, schema : 데이터베이스 catalog, schema 이름
- uniqueConstraints : 유니크 제약조건을 지정할 수 있다.
권장하는 식별자 전략
- 기본 키 제약조건 에 대해서 생각해봐야함 : NULL 아님, 유일, 변하면안된다.
- 변하면 안된다는 조건을 추후 운영하고 몇십년뒤까지 만족해서 개발하기가 어렵다.
- 대리키(대체키)를 사용하자 !
- 예를 들어, 주민등록번호도 기본 키로 적절하지 않다. 정책이 바뀔수도 있으니
- 권장 : Long형 + 대체키 + 키 생성전략 사용
😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
개인메모