Spring/JPA

태태개발일지 - JPA PK Key

태태코 2024. 12. 3. 10:49
반응형

JPA KEY 생성 전략

 

1. AUTO (기본값)

  • JPA가 사용하는 데이터베이스 방언에 따라 키 생성 방식을 자동으로 선택합니다.
  • 주로 SEQUENCE(PostgreSQL, Oracle) 또는 IDENTITY(MySQL, MariaDB)를 사용.
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

2. IDENTITY

  • 데이터베이스가 자동으로 ID를 생성합니다.
  • 매번 insert가 즉시 실행되며 쓰기 지연이나 batch insert는 불가능.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

 

3. SEQUENCE

  • 데이터베이스의 시퀀스 객체를 사용하여 ID를 생성합니다.
  • JPA가 미리 시퀀스를 조회하여 쓰기 지연 및 batch insert가 가능.
  • 주로 PostgreSQL, Oracle에서 사용.
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
@SequenceGenerator(name = "user_seq", sequenceName = "user_sequence", allocationSize = 1)
private Long id;
 

 

4. TABLE

  • 테이블을 이용해 ID를 관리.
  • 성능이 떨어지므로 잘 사용하지 않음.
  • 주로 데이터베이스가 SEQUENCE나 IDENTITY를 지원하지 않을 때 사용.
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table")
@TableGenerator(name = "user_table", table = "id_gen", pkColumnName = "gen_name", valueColumnName = "gen_val", allocationSize = 1)
private Long id;

 

 

여기서 문제점

IDENTITY 가 쓰기지연이나 Batch Insert 를 할 수 없는이유?

 

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
}

// 저장 코드
@Transactional
public void saveUsers() {
    for (int i = 0; i < 10; i++) {
        User user = new User();
        user.setName("User" + i);
        entityManager.persist(user);
    }
}

 

아래와 같이 입력하게 되면 

insert query가 세개가 나가게 된다.

 

이유: JPA에서 persist를 통해서 영속화 하려고 할땐 PK가 DB에 저장되어있어야하는데
위와 같은 코드로 쓰기지연 batch insert 를 하려고할 때 PK가 이미 지정 되어있지 않기 때문에 영속화를 할 수 없고, 매번 save 메서드를 실행하는 것이다.

 

 

반응형

'Spring > JPA' 카테고리의 다른 글

태태개발일지 - 비동기처리  (0) 2024.12.11
태태개발일지 - 트랜잭션?  (0) 2024.12.03
태태개발일지 - 양방향 연관관계  (1) 2024.11.22
태태개발일지 - JPA 슈퍼타입  (1) 2024.11.20
태태개발일지 - ActionQueue  (3) 2024.11.18