본문 바로가기
개발 이야기/Springboot

JdbcTemplate로 batchUpdate 사용해보기

by 농개 2024. 5. 28.
반응형

 

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의 배치 기능보다 더 쉽게 사용이 가능할 것 같습니다.

 

반응형