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초동안 열었다 닫았다하는것과
전기비가 후자가 더 많이 나온다는 것이다.