Bulk Update 소개
bulk update는 데이터베이스의 여러 레코드를 한 번에 업데이트하는 성능 최적화와 서버 자원의 효율적 사용에 있어 중요한 기법 중 하나입니다. 이 접근 방식은 네트워크 호출과 데이터베이스 I/O 작업을 줄여 전체 애플리케이션의 성능을 향상시킬 수 있습니다.
Bulk Update의 장점
- 성능 향상: 단일 쿼리로 여러 레코드를 업데이트함으로써 네트워크 지연 시간과 데이터베이스 서버의 부하를 줄일 수 있습니다. 이는 특히 대량의 데이터를 처리할 때 성능 이점을 제공합니다.
- 자원 사용 최적화: 데이터베이스 연결과 네트워크 자원의 사용을 최적화하여 서버 자원을 보다 효율적으로 사용할 수 있습니다.
- 일관성 유지: @Transactional 어노테이션을 사용하여 bulk update 작업을 하나의 트랜잭션으로 관리함으로써, 모든 업데이트가 성공적으로 수행되거나, 하나라도 실패할 경우 전체가 롤백되어 데이터의 일관성을 유지할 수 있습니다.
Bulk Update 방법
1. Mapper 인터페이스 정의: MyBatis에서는 Mapper 인터페이스를 사용하여 SQL 쿼리를 관리합니다. Bulk update를 위한 메소드를 Mapper 인터페이스에 정의합니다.
// Mapper 인터페이스
public interface DeviceMapper {
void updateDeviceBulk(List<Device> list);
}
2. XML 매핑 파일 작성: 실제 SQL 쿼리를 XML 파일에 작성합니다. MyBatis는 XML 파일 내의 쿼리를 Mapper 인터페이스의 메소드와 매핑하여 사용합니다. Bulk update를 위해 foreach 태그를 사용하여 리스트나 배열의 각 아이템에 대한 업데이트 쿼리를 동적으로 생성할 수 있습니다.
// XML 매핑 파일
<mapper namespace="com.example.mapper.DeviceMapper">
<update id="updateDeviceBulk">
<foreach collection="list" item="item" separator=";">
UPDATE device
SET value = #{item.value}
WHERE device_id = #{item.deviceId}
</foreach>
</update>
</mapper>
3. 서비스 레이어 구현 및 트랜잭션 관리: 비즈니스 로직을 처리하는 서비스 레이어에서 Mapper 인터페이스의 bulk update 메소드를 호출합니다. 이 메소드는 업데이트할 객체의 리스트를 인자로 받습니다. @Transactional 어노테이션을 사용하여 bulk update 작업을 트랜잭션으로 관리합니다. 이는 모든 업데이트가 성공적으로 수행되거나 실패 시 롤백되어 데이터 일관성을 보장합니다.
@Transactional
public void updateDeviceBulk(List<Device> list) throws Exception {
deviceMapper.updateDeviceBulk(list);
}
4. JDBC URL 수정 : allowMultiQueries=true 옵션은 MariaDB (또는 MySQL) JDBC 연결 URL에서 사용되며, 이 옵션을 사용하면 단일 Statement에서 여러 SQL 쿼리를 실행할 수 있습니다. 기본적으로, 보안상의 이유로 JDBC 드라이버는 하나의 쿼리만 실행할 수 있도록 제한합니다. 이는 SQL 인젝션 공격과 같은 보안 취약점을 방지하기 위함입니다. 그러나 특정 상황에서는 한 번의 호출로 여러 쿼리를 실행해야 할 필요가 있을 수 있으며, allowMultiQueries=true 옵션을 사용하면 이를 가능하게 합니다.
jdbc:mariadb://localhost:3306/test?allowMultiQueries=true
참고자료
https://hyos-dev-log.tistory.com/1
https://gksdudrb922.tistory.com/154
https://velog.io/@frankle97/MyBatis-%EC%9D%BC%EA%B4%84Batch-INSERTUPDATE
'개발 > spring, spring boot' 카테고리의 다른 글
[Spring Boot] 서버 시작 시 WebSocket 연결 client java 로직 구현 (1) | 2024.02.08 |
---|---|
[Spring Boot] mariadb-java-client vs mysql-connector-j (0) | 2024.02.07 |
[Spring Integration][Spring Boot Test] Socket 통신 테스트 시 빈 데이터 전송 해결 (0) | 2024.02.05 |
[Spring Integration][Spring Boot Test] Socket 통신 테스트 시 빈 데이터 전송 이슈 (0) | 2024.02.02 |
[Spring Integration] Multi TCP server 테스트 시 Address already in use: bind 에러 (0) | 2024.01.31 |