[Spring] JDBC Bulk Update 적용

윤성철·2024년 6월 10일

Back-End

목록 보기
5/22
post-thumbnail

🙋‍♂️ 개발중, loop마다 단건으로 INSERT 쿼리가 날아가는 로직을 개선할 필요성을 느꼈다.

요청이 10000개 혹은 그 이상일 때❓ DB connection pool이 늘어지는 이슈, 수행시간이 오래걸리는 이슈가 필연적으로 발생할 수 밖에 없다고 판단했다.

🥇 JDBC에서 제공하는 bulk_update로 loop가 종료되는 시점에 일괄 쿼리를 날리는 방법을 찾게 되었다.

감사하게도..JdbcTemplate 클래스로 구현이 돼있어 가져다쓰면 됐다. 😭

public void saveAll(List<Class> classes){
	String sql = "INSERT INTO {DB Table} ({칼럼1, 2 ....} +
    VALUES (?, ?, ...)";
    
    jdbcTemplate.batchUpdate(sql, <classes>, <classes.size()>,
    (PreparedStatement ps, <Class> <class>) -> {
    	ps.setString(1, {class.getValue()};
        ps.setString(2, .....);
        ...
    }
}
파라미터로 넘겨받은 list의 크기만큼 배치가 돌면서 해당 쿼리문의 value값을 setString 메서드로 바인딩한다.

간단하게 테스트 코드를 작성해 성능 비교를 했다.

  1. loop돌때 마다의 각각 INSERT

  1. batch에 쌓아두고 한번에 쿼리를 날리는 bulkUpdate (

10000개의 데이터의 성능 차이가 이정도....
참고로 내부 로직에선 update쿼리도 두번 더 나간다.

JPA에서 SaveAll보다 많이 사용되는 것 같은데 이부분도 한번 찾아봐야겠다.

비단 INSERT 뿐만 아니라, UPDATE, DELETE쿼리까지 bulkUpdate를 범용적으로 활용할 수 있다!
참고 - https://docs.spring.io/spring-framework/reference/data-access/jdbc/advanced.html

profile
내 기억보단 내가 작성한 기록을 보자..

0개의 댓글