개발 이야기/Springboot

JdbcTemplate로 batchUpdate 사용해보기

농개 2024. 5. 28. 00:44
반응형

 

 

목차

    1. BatchHelper 클래스

    아래와 같이 jdbcTemplate을 인자로하는 헬퍼 클래스를 하나 만들어 줍니다.

    import org.springframework.jdbc.core.BatchPreparedStatementSetter
    import org.springframework.jdbc.core.JdbcTemplate
    import java.sql.PreparedStatement
    
    object BatchHelper {
    
        fun executeBatchUpdate(
            jdbcTemplate: JdbcTemplate,
            sql: String,
            list: List<Any>,
            setter: (ps: PreparedStatement, i: Int) -> Unit
        ) {
            jdbcTemplate.batchUpdate(sql, object : BatchPreparedStatementSetter {
                override fun setValues(ps: PreparedStatement, i: Int) {
                    setter(ps, i)
                }
    
                override fun getBatchSize() = list.size
            })
        }
    }

     

    • jdbcTemplate: spring-data-jdbc 의존성을 추가하면 사용할 수 있습니다. spring-data-jpa를 추가해도 마찬가지로 사용가능합니다.
    • sql: 실제 SQL문이 들어갑니다.
    • list: 배치로 한꺼번에 입력될 데이터 목록이 들어갑니다. 
    • setter: preparedStatment에 데이터를 셋팅하기 위한 람다식이 들어갑니다.

     

    2. 데이터 타입 구성

    data class MemberRequestDto(
        val id: Long?,
        val name: String,
        val email: String,
        val age: Int
    )

    간단하게 Member 데이터 타입을 정의해줍니다.

    3. 서비스에서 사용하기

    아래와 같이 헬퍼 클래스를 실제 사용할 서비스 단에서 코드를 작성해봅시다.

    @Service
    class JdbcTestService(
        val jdbcTemplate: JdbcTemplate
    ) {
    
        fun jdbcTemplateTest(data: List<MemberRequestDto>) {
    
            val sql = "INSERT INTO tbl_member VALUES (?,?,?,?)"
            BatchHelper.executeBatchUpdate(jdbcTemplate, sql, data) { ps: PreparedStatement, i: Int ->
                ps.setString(1, null)
                ps.setString(2, data[i].name)
                ps.setString(3, data[i].email)
                ps.setString(4, data[i].age.toString())
            }
        }
    }

     

    data의 size 만큼 배치 단위로 단일 sql문을 한꺼번에 실행시킬수 있습니다.

    jpa의 배치 기능보다 더 쉽게 사용이 가능할 것 같습니다.

     

    반응형