우아한 프로그래밍

1. 문제사항

개발을 진행하다보면 배치 혹은 엑셀업로드와 같이 여러 건의 데이터를 삽입하는 일이 있을 수 있다.
예를들어 5만건의 데이터를 삽입하는 경우라고 생각해보자.

이 경우 소스단에서 For문을 돌면서 삽입을 진행하는 경우 엄청나게 느림을 확인 할 수 있다.
그 이유는 실제로 DB에서 작업처리에 필요한 Cost보다 네트워크 I/O Cost가 수천 혹은 수백배는 크기 때문이다.

예를 들자면 100개의 사과를 A지역에서 B지역으로 옴기는데 10개씩 옴기는게 1개씩 옴기는 것보다 힘은 들지라도 속도는 훨신 빠를것이다.

그럼 어떻게 하는지 확인해 보도록하자.

 

2. 해결방법

1. Mapper 파일

void bulkInsert(@Param("itemList") List<Item> itemList);

 

2. Xml 파일

<insert id="bulkInsert">
    INSERT INTO TABLE_NAME 
        (
            TABLE_COLUMN_1
            ,TABLE_COLUMN_2
            ,TABLE_COLUMN_3
            ,TABLE_COLUMN_4
        ) 
    VALUES
    <foreach collection="itemList" item="item" separator=","> 
        (           
            #{item.table_column1}
            ,#{item.table_column2}
            ,#{item.table_column3}
            ,#{item.table_column4}            
        )
    </foreach>
</insert>

3. 마무리 하면서..

내가 테스트 했을때..
3만건 테스트를 진행했고 소스에서 For문을 걸경우 분당 400건의 데이터를 인서트 했지만
위의 코드로 변경후에는 10초내외로 Insert가 모두 끝났다.

여기서 프로그래밍에 있어서 I/O의 Cost가 가장 크다는 것을 알 수 있다.
비유를 하자면 냉장고를 10초 열어두는것과 10초동안 열었다 닫았다하는것과

전기비가 후자가 더 많이 나온다는 것이다.

profile

우아한 프로그래밍

@자바조아!

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!