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를 어떻게 적용을 시켜야 하는지, 성능은 얼마나 좋아지는지 등에 대해 알아보고자 한다.