JPA Entity ID 생성 전략 및 전략별 Batch INSERT 가능 여부

대영·2025년 2월 20일
1

Spring

목록 보기
16/16

🙏내용에 대한 피드백은 언제나 환영입니다!!🙏

saveAll()을 사용하면 배치 처리가 되지 않나? 라는 생각을 할 수 있다. 하지만, Entity ID 생성 전략에 따라 상황이 달라진다.

🍀 생성 전략

👉 1. IDENTITY 전략

MySQL, MariaDB, Oracle(12c 이상)에서 사용.

DB에서 자동 증가(AUTO_INCREMENT)기능을 사용하는 방식.
INSERT를 실행 시, ID를 지정하지 않아도 됨. DB에서 자동 처리.

JPA는 ID를 INSERT를 하기 전에 알 수 없기 때문에, persist()하면 바로 INSERT실행.

  • 이러한 이유로 Batch INSERT 불가
    • JPA는 트랜잭션 관리, 변경 감지 등을 위해 Entity를 영속 상태로 관리함. 이 영속 상태는 ID를 기반으로 영속성 컨텍스트에서 1차 캐시에 저장.
    • IDENTITY 전략 사용 시, ID를 DB에서 정하기에 바로 INSERT하여 ID를 받아오는 것. -> Batch INSERT 불가

👉 2. SEQUENCE 전략

Oracle, PostgreSQL에서 사용.

DB의 SEQUENCE객체를 사용하여 ID 생성.
allocationSize설정을 통해 미리 시퀀스 값을 가져와 할당 가능

  • IDENTITY와 달리 미리 가져올 수 있어, Batch INSERT 가능

👉 3. TABLE 전략

DB에 별도의 ID관리 테이블을 생성하여 관리.
키 관리를 위해 INSERT와 UPDATE를 같이 보내 성능이 좋지 않음.

SEQUENCE 전략을 사용하지 못하는 RDB에서 Batch INSERT 사용하려면 이용 가능.

👉 번외. UUID 사용

	@Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    @Column(columnDefinition = "BINARY(16)")
    private UUID id;

위와 같이 UUID을 통해 직접 넣어주면 아래와 같은 장단점이 있다.

장점

  1. 값을 정해서 직접 정해서 줌.
    - 모든 DB 사용 가능
    - Batch INSERT 사용 가능
  2. 예측 불가능한 ID로 보안성 증가
  3. 샤딩 환경 등 분산 시스템에서 ID 충돌 방지 가능

단점

  1. 랜덤 값이기에 인덱스에 무작위로 삽입이 발생하여 인덱스가 느림.
  2. 저장 크기가 큼

📚 다음 포스팅

전략 별로 Batch INSERT 가능 여부와 그 이유를 보았다.
다음 포스팅에서는, 그렇다면 Batch INSERT를 어떻게 적용을 시켜야 하는지, 성능은 얼마나 좋아지는지 등에 대해 알아보고자 한다.

profile
Better than yesterday.

0개의 댓글

관련 채용 정보