거인의 코딩일지
[JPA] 기본키 생성 전략 과 차이 본문
728x90
기본키 생성 전략
- JPA 가 제공하는 DB 기본키 할당 전략은 직접 할당 방식, 자동 생성 방식 이 존재한다.
직접 할당 방식
- 직접 할당 방식을 사용할 경우 Entity를 생성할 때 Key Column 에 @Id 를 사용해주면 끝이다.
@Id
private long id;
- @Id 가 적용 가능한 타입은
- Java 기본형 (int, double, long ...)
- Java Wrapper
- String
- Java.util.Date
- Java.sql.Date
- Java.math.BigDecimal
- java.math.BigInteger
자동 생성 방식
- 자동 생성 방식을 사용할 경우 @Id 와 @GeneratedValue 를 사용한다.
- 자동생성 방식은 대리 키를 사용하는 방식으로 IDENTITY, SEQUENCE, TABLE, AUTO 네 가지가 있다.
- IDENTITY
- 기본키 생성을 DB에 위임하는 전략이다.
- AutoIncrement 기능을제공해 기본 키 값을 자동으로 DBMS 에서 사용한다.
- Data를 DB 에 Insert 한 후 기본 키 값을 조회
- Id가 null일 경우 해당 객체의 Id를 DB의 AUTO_INCREMENT를 가져와 할당한다.
- 객체를 저장할 때?
- JPA에서 영속성 컨텍스트에서 객체를 관리하기 위해서는 무조건 ID 속성, 즉 PK 값이 있어야 한다.
(JPA 입장에서는 Map의 key 값이 없다면 해당 객체의 값을 넣을 수 있는 방법이 없기 때문이다.)
AUTO_INCREMENT 경우 애플리케이션에서는 그 값이 얼마임을 알지 못하기에 DB에 insert문을 날려야 id 값을 알 수 있다. - 객체를 save() 메서드로 저장을 할 때 원래는 트랜잭션이 끝나는 COMMIT 시점 전에 flush가 이루어지지만,
해당 경우는 DB에서 id 값을 받아와야 하니 save() 메서드를 호출하는 시점에 insert 쿼리가 나간다. (flush가 이루어진다.) - 이렇게 id 값을 할당한 객체는 영속성 컨텍스트 1차 캐시에 값을 넣게된다.
- JPA에서 영속성 컨텍스트에서 객체를 관리하기 위해서는 무조건 ID 속성, 즉 PK 값이 있어야 한다.
- SEQUENCE
- DB의 sequence 객체를 이용해 유일한 값을 순서대로 생성한다.
- @SequenceGenerator(시퀀스를 생성하는 어노테이션)과 함께 사용할 수 있다.
- 만약 sequence 객체를 사용하지 않는 DB 벤더를 이용할 경우 Sequence를 관리할 객체(테이블)을 생성한다.
단 jpa ddl auto 설정이 되어있어야 한다. - 객체를 저장할 때?
- IDENTITY 전략과 다른점이 존재한다.
해당 전략은 단순히 sequence 값만 시퀀스 객체에서 조회해 오면 되기에, 엔티티 테이블에 해당 객체를 바로 insert 할 필요가 없다. - 객체를 save() 메서드로 저장을 할 때 id 값을 채우기 위해 select 문이 실행되고 트랜잭션이 끝나는 COMMIT 시점에 insert 문이 실행된다.
- IDENTITY 전략과 다른점이 존재한다.
@Entity
@SequenceGenerator(
name="BOARD_SEQ_GENERATOR",
sequenceName="BOARD_SEQ",
initialValue=1,allocationsSize=1
)
- name : 실제 @Id 필드에서 참조할 이름
- sequenceName : 실제 데이터베이스에 생성되는 시퀀스 객체 이름
- allocationsSize : DB에서 가져오는 시퀀스 호출에 증가하는 값의 크기
- TABLE
- Key 생성 Table을 사용하는 전략이다
- Key 생성 전용 Table을 생성하고 name, value 로 사용할 Column을 생성하여 DB Sequence 를 흉내내는 전략이다.
- 이 전략을 사용할 시, jpa ddl auto 설정이 되어 있지 않았다면 해당 시퀀스 테이블 생성이 선행이 되어야한다.
- @TableGenerator(테이블 생성 어노테이션)과 함께 사용할 수 있다.
- AUTO
- 선택한 DB 방언에 따라 자동으로 IDENTITY, SEQUENCE, TABLE 전략을 자동으로 선택한다.
- DB의 종류도 많고 기본 키 생성 방식도 다양하기에 해당 전략은 DB를 변경해도 Code 수정을 하지 않아도 되는 장점이 있고 Key 생성 전략이 정해지지 않은 개발 초기 단계나 프로토 타입 개발시에 편리하게 사용될 수 있다.
- 하지만 만약 AUTO 로 SEQUENCE 나 TABLE 전략이 선택될 경우 Sequence 나 키 생성 Table을 미리 생성 해두어야 한다.
- 만약 DDL 자동 생성 기능을 사용한다면, Hibernate가 기본 값을 사용해 알아서 생성해준다.
728x90
'코딩 > JAVA' 카테고리의 다른 글
[JAVA] charAt() 함수란?? 기능??? (2) | 2023.10.27 |
---|---|
[JPA] deleteAll(), deleteAllInBatch(), deleteInBatch() 개념과 차이점 (0) | 2023.10.10 |
[Spring boot] Swagger API 연동하기 (0) | 2023.10.06 |
[Spring] 다양한 의존성 주입 방법 (0) | 2023.09.27 |
[Annotation] @CrossOrigin 이란? (0) | 2023.09.25 |