250x250
syk531
하루
syk531
전체 방문자
오늘
어제
  • 분류 전체보기 (166)
    • 개발 (166)
      • java (11)
      • kotlin (7)
      • spring, spring boot (35)
      • Javascript (4)
      • Tyhmeleaf (2)
      • Kafka (17)
      • Docker (8)
      • Kubernetes (3)
      • Elastic Stack (4)
      • react native (3)
      • Web (4)
      • GIS (3)
      • 리눅스 (16)
      • Windows (2)
      • 네트워크 (2)
      • 안드로이드앱 (5)
      • git (2)
      • Tool (15)
      • 프로젝트 (7)
      • 백준알고리즘 (14)
      • DB (2)

인기 글

최근 글

블로그 메뉴

    공지사항

    태그

    • 티스토리챌린지
    • 오블완
    • 뉴스앱

    최근 댓글

    티스토리

    hELLO · Designed By 정상우.
    syk531

    하루

    개발/spring, spring boot

    [Spring Boot][Mybatis][MariaDB] Bulk Update 방법

    2024. 2. 7. 16:21
    728x90
    반응형

    Bulk Update 소개

    bulk update는 데이터베이스의 여러 레코드를 한 번에 업데이트하는 성능 최적화와 서버 자원의 효율적 사용에 있어 중요한 기법 중 하나입니다. 이 접근 방식은 네트워크 호출과 데이터베이스 I/O 작업을 줄여 전체 애플리케이션의 성능을 향상시킬 수 있습니다.

     

     

    Bulk Update의 장점

    1. 성능 향상: 단일 쿼리로 여러 레코드를 업데이트함으로써 네트워크 지연 시간과 데이터베이스 서버의 부하를 줄일 수 있습니다. 이는 특히 대량의 데이터를 처리할 때 성능 이점을 제공합니다.
    2. 자원 사용 최적화: 데이터베이스 연결과 네트워크 자원의 사용을 최적화하여 서버 자원을 보다 효율적으로 사용할 수 있습니다.
    3. 일관성 유지: @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

    728x90
    반응형
    저작자표시 (새창열림)

    '개발 > 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
      '개발/spring, spring boot' 카테고리의 다른 글
      • [Spring Boot] 서버 시작 시 WebSocket 연결 client java 로직 구현
      • [Spring Boot] mariadb-java-client vs mysql-connector-j
      • [Spring Integration][Spring Boot Test] Socket 통신 테스트 시 빈 데이터 전송 해결
      • [Spring Integration][Spring Boot Test] Socket 통신 테스트 시 빈 데이터 전송 이슈
      syk531
      syk531
      기억을 위해 기록을.

      티스토리툴바