기본키 매핑
- 직접 할당: 기본키를 애플리케이션에서 직접 할당
- 자동 생성: 대리 키 사용 방식
- IDENTITY: 기본 키 생성을 데이터베이스에 위임
- SEQUENCE: 데이터베이스 시퀸스를 사용해서 기본 키를 할당
- TABLE: 키 생성 테이블을 사용
IDENTITY 전략
기본 키 생성을 데이터베이스에 위임
- 주로 MySQL, PostgreSQL 등에서 사용
- 개발자가 엔티티에 직접 식별자를 할당하면 @Id 어노테이션을 사용
- 식별자가 생성되는 경우에는 @GeneratedValue 어노테이션을 사용하고 식별자 생성 전략을 선택해야 함
사용 예시
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...
}
public static void logic (EntityManager em) {
Board board = new Board();
em.persist(board);
System.out.println("board.id = " + board.getId());
// 출력: board.id = 1
}
- em.persist()를 호출해서 엔티티를 저장한 후 할당된 식별자 값을 출력
- 출력된 값 1은 저장 시점에 데이터베이스가 생성한 값을 JPA가 조회한 것
SEQUENCE 전략
유일한 값을 순서대로 생성하는 특별한 DB 오브젝트
- 오라클, PostgreSQL, H2 DB 등에서 사용 가능
사용 예시
@Entity
@SequenceGenerator (
name = "BOARD_SEQ_GENERATOR",
sequenceName = "BOARD_SEQ", // 매핑할 데이터베이스 시퀸스 이름
initialValue = 1, allocationSize = 1)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.Sequence,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
// ...
}
- 우선 DB 시퀸스를 매핑
- @SequenceGenerator를 통해 BOARD_SEQ_GENERATOR라는 시퀸스 생성기 등록
- sequenceName 속성의 이름으로 BOARD_SEQ를 지정함
- 시퀸스 생성기를 실제 DB의 BOARD_SEQ 시퀸스와 매핑
- 키 전략을 Sequence로 설정, generator를 등록한 시퀸스 생성기로 선택 -> 이제 id 식별자 값은 BOARD_SEQ_GENERATOR가 할당
public static void logic (EntityManager em) {
Board board = new Board();
em.persist(board);
System.out.println("board.id = " + board.getId());
// 출력: board.id = 1
}
코드는 IDENTITY 전략과 같지만 내부 동작 방식에서 차이가 있다.
- em.persist()를 호출할 때 먼저 DB 시퀸스를 사용해서 식별자를 조회
- 조회한 식별자를 엔티티에 할당한 후에 엔티티를 영속성 컨텍스트에 저장
- 이후 트랜잭션을 커밋해서 플러시가 일어나면 엔티티를 DB에 저장
- IDENTITY 전략은 먼저 엔티티를 저장 후에 식별자를 조회하여 엔티티를 식별자에 할당한다.
IDENTITY전략을 항상 사용했었는데 식별자가 나중에 할당되는지는 몰랐다 wow
항상 모든 코드에 의문을 가지는 습관을 지녀야겠다고 생각이 들면서도 너무 당연하게 받아들이게 되는 것 같다...
꾸준히 고민하고 개선하자!
'Spring 🟢' 카테고리의 다른 글
LazyConnectionDataSourceProxy에 대해 알아보자 (0) | 2024.10.25 |
---|---|
[Spring] 시큐리티로 JWT 로그인 구현하기 (0) | 2023.10.20 |
filter와 Interceptor (0) | 2023.08.04 |
[Spring] RowMapper (2) | 2023.06.09 |
[Intellij] Cause: error: invalid source release: 16 해결하기 (0) | 2023.06.02 |