반응형
목차
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의 배치 기능보다 더 쉽게 사용이 가능할 것 같습니다.
반응형
'개발 이야기 > Springboot' 카테고리의 다른 글
AWS S3 타계정의 버킷 업로드 시 BucketOwnerFullControl 설정 (0) | 2024.06.06 |
---|---|
DTO에서 LocalDateTime 유효성 체크와 에러핸들링 방법 (1) | 2024.06.01 |
Springbatch에서 메타테이블 없이 실행(Springbatch 5) (0) | 2024.03.19 |
Multi-module에서 Domain 분리하기 (0) | 2024.02.21 |
Springboot Webflux에서 blocking 감지하기(with BlockHound) (0) | 2024.02.08 |