Backend/JPA

[JPA] 대량 insert, mysql insert all

findmypiece 2021. 12. 16. 12:19
728x90

jpa 를 사용해서 대량 insert 를 해야할 일이 생겼다. 사실 딱히 대량까진 아니고 많아봐야 1,000건이란 제한이 있는 데이터였다. 그런데 이게 10초가 넘게 걸렸다. jpa에서 대량 insert 시 사용하라고 하는 saveAll 을 사용하는데도 그랬다.

 

mybatis 환경이라면 쿼리로 insert all 를 작성해서 사용했을 것이고 이 경우 insert 하는 데이터가 1만건이 넘어가더라도 10초가 걸리진 않는다.

 

 JPA에서  saveAll 로 배치 insert 하려면 application.yml 파일에 아래 설정이 추가로 필요하다.

spring.jpa.properties.hibernate.jdbc.batch_size=1000
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true

 

그런데 문제는 이게 @GeneratedValue(strategy = GenerationType.IDENTITY) 와 같이 PK를 AUTO_INCREMENT 로 생성하는 환경에서는 동작하지 않는다.  안되는 이유는 서칭하면 많이 나오니 여기에서는 생략한다. 아무튼 대부분 AUTO_INCREMENT 로 PK를 구성할 것이기 때문에 이는 타격이 크다.

 

이런 이유로 JPA 에서 대량 insert 를 해야 하는 상황이라면 대부분 JdbcTemplate 의 batchUpdate 를 사용한다. spring-boot -starter-data-jpa 의존성에 기본적으로 포함되어 있기도 하고 mybatis 를 추가로 연동해서 사용해도 되지만 대부분 insert 하나 때문에 추가로 구성하진 않는 걸로 보인다.

 

코틀린 기반 구성방법은 추후 다시 정리...

 

 

 

https://kapentaz.github.io/jpa/JPA-Batch-Insert-with-MySQL/#
https://jojoldu.tistory.com/558
https://velog.io/@rainmaker007/spring-data-jpa-batch-insert-정리
https://wave1994.tistory.com/160
https://homoefficio.github.io/2020/01/25/Spring-Data에서-Batch-Insert-최적화/
https://mkyong.com/spring/spring-jdbctemplate-batchupdate-example/
https://godekdls.github.io/Spring%20Data%20Access/dataaccesswithjdbc/
https://pepperoni.netlify.app/batch-insert/
https://heowc.dev/2019/02/12/using-mysql-jdbc-to-handle-large-table-2/
https://ohgym.tistory.com/48
728x90