본문 바로가기

Backend/Spring | SpringBoot

[Spring] JPA 기본키 전략

반응형

기본키 전략에는 크게 두가지가 있다.

직접 할당과 자동생성하는 방법이 있다.

직접 할당하는 방법에는 @Id 어노테이션만을 적용하고 EntityManager.persist를 이용하면 된다.

하지만 자동생성하는 방법은 대리키를 사용하여 각각 전략에 따라 맞추어 자동 생성한다.

 

1. GenterationType.IDENTITY
- 기본키 생성을 DB에 위임
- INSERT SQL후 DB에서 식별자를 조회

 

2. GenterationType.SEQUENCE
- @SequenceGenerator 속성

 

- 맵핑 DLL

create sequence [sequenceName]
start with [initialValue] increment by [allocationSize]

 

- e.g)

@Entity
@SequenceGenerator(
	name = "SEQ_GENERATOR",
	sequenceName = "SEQ",
	initialValue = 1, allocationSize = 1)
public class JpaTest{
	@Id
    @GeneratedValue(stradgy = GenerationType.SEQUENCE,
    				generator = "SEQ_GENERATOR")
    private Long id;
}

 

- 동작 순서

1. DB 시퀀스 생성
2. DB 생성
3. persist() 시점에 DB 시퀀스에서 식별자 조회 - 1st 통신
4. 트랜잭션 커밋 시점에 플러시로 INSERT SQL을 DB에 보내서 저장 - 2nd 통신

 

 

3. GenterationType.TABLE
- @TableGenerator 속성

 

- 맵핑 DLL

create table MY_SEQUENCES (
	sequence_name varchar(255) not null,
	next_val bigint,
	primary key ( sequence_name )
)

 

- e.g)

@Entity
@TableGenerator(
	name = "SEQ_GENERATOR",
	table = "SEQ",
	pkColumnValue = "SEQUENCE", allocationSize = 1)
public class JpaTest{
	@Id
    @GeneratedValue(stradgy = GenerationType.TABLE,
    				generator = "SEQ_GENERATOR")
    private Long id;
}

 

- 동작 순서

1. DB 시퀀스 생성
2. DB 생성
3. persist() 시점에 DB 시퀀스에서 식별자 조회 - 1st 통신
4. 시퀀스 값을 증가 시키기 위해 UPDATE 실행 - 2nd 통신
5. 트랜잭션 커밋 시점에 플러시로 INSERT SQL을 DB에 보내서 저장 - 3rd 통신

 


4. GenterationType. AUTO
- DB에 따라 위의 전략 중 하나를 자동으로 선택
  (e.g. Oracle : SEQUENCE, MySQL : IDENTITY)
- @GeneratedValue의 기본값은 AUTO이기에 속성을 선언하지 않아도 됨

 

 

반응형