https://www.maeil-mail.kr/question/69
요약: JPA에서는 table의 pk인 id값을 직접할당, 자동할당의 방식을 사용해서 할당을 합니다.
보통은 @GeneratedValue
와 @Id
를 이용해서 자동할당의 방식을 사용하는데 할당방식에 따라서 Identity
Table
Sequence
가 있습니다.
자동할당방식
@Entity
class java{
@Id
@GenratedValue(strategy=GeneratedType.identity)
private Long id;
}
위처럼 자동 할당 방식은 @GenratedValue
으로 전략을 선택합니다.
identity
- 기본키 생성을 DB에 위임하는 전략입니다.
- 엔티티 생성시에 id값을 db에서 할당해주는데, 이는 영속성 컨텍스트에서 엔티티를 관리하기위한 식별자가 필요하기 때문입니다.
- 따라서 쓰기-지연전략이 사용되지 않고, 엔티티가 생성할 때 즉시 Insert쿼리가 나갑니다.
- 쓰기 지연 전략을 사용하지 않기 때문에,여러 Insert문 수행시 성능상 상대적으로 느릴 수 있습니다.
- 주로 Mysql,PostegreSql에서 사용됩니다.
Sequence
- 시퀀스 방식은 기본키를 생성하는 데이터베이스 시퀀스 객체로부터 기본키를 생성 받는 전략입니다.
- JPA가 시퀀스 객체로부터 기본키를 받아서 사용하므로, identity와 달리
persist
호출전에 식별자를 통해서 영속성 컨텍스에서 관리 할 수 있습니다.
- 즉, 쓰기 지연 방식을 통해서 트랜잭션 커밋시 flush가 일어날 때 데이터베이스에 저장이 가능합니다.
- 시퀀스 전략의 경우 id값을 얼만큼 가져올지의 갯수를
allocationSize
를 통해서 정하여 성능을 최적화할 수 있습니다.
Table
- 테이블 전략은 키 생성 전용 테이블을 만들어서, 키를 하나의 테이블에서 관리하는 방식입니다.
- 키를 가져올 때 데이터베이스에서 가져오고, 키의 값을 올릴 때도 데이터베이스에서 접근을 해야하므로, 성능상 안 좋을 수 있지만, 모든 db에서 적용할 수 있다는 장점이 있습니다.
Auto
- 기본 설정으로, 데이터베이스에 따라 적합한 전략을 자동으로 선택합니다.
- 특정 상황에서 예기치 않은 전략이 선택될 수 있으므로 주의가 필요합니다.
참고
https://velog.io/@msw0909/Entity%EC%84%A4%EA%B3%84%ED%95%98%EA%B8%B0