1. 기본 키 직접 할당 전략
1) 개념
기본 키를 애플리케이션에서 직접 할당하는 것
2) 방법
@Id로 매핑
3) 특징
- em.persist() 하기 전에 애플리케이션에서 기본 키를 직접 할당, 만약 식별자 값 없으면 예외 발생
2. IDENTITY 전략
1) 개념
기본 키를 자동 생성하는데, 생성을 데이터베이스에게 위임
2) 방법
@ID와 @GeneratedValue의 GenerationType.IDENTITY 사용
3) 특징
- 데이터베이스에 값을 저장하고 나서야 기본 키 값을 구할 수 있을 때 사용
- JPA는 기본 키 값을 얻어오기 위해 데이터베이스를 추가로 조회
- JDBC3에 추가된 Statement.getGeneratedKeys()를 사용하면 데이터를 저장하면서 동시에 생성된 기본 키 값도 얻어 올 수 있다. 하이버네이트는 이 메소드를 이용해서 데이터베이스와 한 번만 통신가능하다.
- 엔티티가 영속 상태가 되려면 식별자가 반드시 필요한데, 이 전략은 엔티티를 데이터베이스에 저장해야 식별자를 구할 수 있어서 em.persist를 호출하는 즉시 sql이 데베에 전달된다. 따라서 트랜잭션을 지원하는 쓰기 전략이 동작 하지 않는다.
- em.persist를 하면 먼저 엔티티를 데베에 저장한 후에 데베에 있는 식별자를 조회해서 엔티티의 식별자에 할당한 다음 영속성 컨텍스트에 저장
3. SEQUENCE 전략
1) 개념
유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트인 데이터베이스 시퀀스를 사용해서 기본 키를 생성
2) 방법
@ID, @SequenceGenerator, @GeneratedValue의 strategy = GenerationType.SEQUENCE, generator = "이름" 사용
3) 특징
- em.persist()를 호출할 때 먼저 데이터베이스 시퀀스를 사용해서 식별자를 조회. 조회한 식별자를 엔티티에 할당하고 엔티티를 영속성 컨텍스트에 저장, 이후 플러시 일어나면 엔티티를 데베에 저장
- 데베 시퀀스를 통해 식별자를 조회하는 추가 작업이 필요해서 데베와 2번 통신한다
- 식별자 구하려고 데베 시퀀스 조회
- 조회한 시퀀스를 기본 키 값으로 이용해 데베에 저장
- JPA는 시퀀스에 접근하는 횟수를 줄이기 위해 @SequenceGenerator.allocationSize를 사용하여 여기에 설정한 값만큼 한 번에 시퀀스를 증가시키고 나서 그만큼 메모리에 시퀀스 값을 할당한다. 그러면 1~50까지 사용할 때는 시퀀스에 접근할 필요가 없이 메모리에만 접근하면 된다.
- 장점: 시퀀스 값을 선점하므로 여러 JVM이 동시에 동작해도 기본 키 값이 충돌하지 않는다
- 단점: 데베에 직접 접근해서 데이터 등록할 때 시퀀스 값이 한번에 많이 증가한다
4. TABLE 전략
1) 개념
키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데베 시퀀스를 흉내
2) 방법
- 키 생성 용도로 사용할 테이블을 만든다
예: sequence_name 컬럼이 시퀀스 이름
next_val 컬럼이 시퀀스 값
3) 특징
- 값을 조회하면서(다음값 구하려면 이전값 뭔지 알아야 하니) select 쿼리를 사용하고 다음 값으로 증가시키기 위해 update 쿼리 사용한다. 이 전략은 sequence보다 데베와 한 번 더 통신한다는 단점이 있다
- 위의 단점을 최적화하기 위해서는 sequence처럼 allocationSize를 사용하면 된다
- 데베 시퀀스 생성용 테이블에서 식별자 값을 획득 후 엔티티에 식별자 할당. 이후 엔티티를 영속성 컨텍스트에 저장하고 플러시 일어나면 데베에 엔티티 저장
sequence_name -> pkColumnName | next_val -> valueColumnName |
BOARD_SEQ -> pkColumnValue | 2 |
MEMBER_SEQ | 10 |
5. AUTO 전략
1) 개념
데베 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택하는 전략
2) 방법
@GeneratedValue(strategy = GenerationType.AUTO)
@GeneratedValue
3) 특징
- 데베를 변경해도 코드 수정할 필요 없음
- SEQUENCE나 TABLE 전략일 경우 전용 시퀀스 혹은 전용 테이블을 미리 만들어야 함. 스키마 자동 생성 기능 사용하면 하이버네이트가 기본값 사용해서 적절한 걸 만들어 줌
6. 식별자 선택 전략
- 자연키(ex: 주민번호) 보다는 대리키를 권장
- 자연키의 경우 유일할 수 있어도 null이거나 변할 수 있는 가능성이 크다(예: 전화번호)
- 자연키의 경우 변하는 비즈니스 환경에서 영원히 적합하지 않을 수 있다(예: 주민번호가 더 이상 데베에 저장하면 안 되는 정책이 나타남)
'Spring > jpa' 카테고리의 다른 글
[JPA] 연관관계 어노테이션 (0) | 2023.02.13 |
---|---|
[JPA] 단방향 연관관계, 양방향 연관관계 (0) | 2023.02.13 |
[JPA] 영속성 관리 (0) | 2023.02.09 |
[JPA] 엔티티 매니저 팩토리, 엔티티 매니저, 트랜잭션 (0) | 2023.02.09 |
[JPA] persistence.xml (0) | 2023.02.09 |