saveAll()
을 사용하면 배치 처리가 되지 않나? 라는 생각을 할 수 있다. 하지만, Entity ID 생성 전략에 따라 상황이 달라진다.
MySQL, MariaDB, Oracle(12c 이상)에서 사용.
DB에서 자동 증가(AUTO_INCREMENT)기능을 사용하는 방식.
INSERT
를 실행 시, ID를 지정하지 않아도 됨. DB에서 자동 처리.
JPA는 ID를 INSERT를 하기 전에 알 수 없기 때문에, persist()
하면 바로 INSERT
실행.
영속 상태
로 관리함. 이 영속 상태는 ID를 기반으로 영속성 컨텍스트에서 1차 캐시에 저장.Oracle, PostgreSQL에서 사용.
DB의 SEQUENCE
객체를 사용하여 ID 생성.
allocationSize
설정을 통해 미리 시퀀스 값을 가져와 할당 가능
DB에 별도의 ID관리 테이블을 생성하여 관리.
키 관리를 위해 INSERT와 UPDATE를 같이 보내 성능이 좋지 않음.
SEQUENCE 전략을 사용하지 못하는 RDB에서 Batch INSERT 사용하려면 이용 가능.
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column(columnDefinition = "BINARY(16)")
private UUID id;
위와 같이 UUID을 통해 직접 넣어주면 아래와 같은 장단점이 있다.
전략 별로 Batch INSERT 가능 여부와 그 이유를 보았다.
다음 포스팅에서는, 그렇다면 Batch INSERT를 어떻게 적용을 시켜야 하는지, 성능은 얼마나 좋아지는지 등에 대해 알아보고자 한다.