
회사에서 나에게 많은 도움을 주었던 개발자 선배가 많았는데, 그 중 한명인 두모씨가 쓰윽 나타나서 툭 던져주고 간 Bulk Insert 개념
코드 리팩토링시 가장 중점적으로 리팩토링 되어야 할 부분 중에 하나라고 한다
픽셀플러스 리부트 전에 이 개념을 적용해서 코드를 짰던 기억이 있는데 그 이후로 새까맣게 잊고 있다가 이제서야 다시 떠올랐다!
핵심은 DB에 접촉하는 것을 최대한 줄여야 성능이 좋아진다는 것!
// 현재 내 코드 일부
for (const v of 배열) {
await 레포지토리.save({
...,
language: v.language,
description: v.description,
title: v.title,
});
}
이 코드의 문제점은 반복문을 돌면서 그때마다 한 번씩 DB에 INSERT 해주는 작업을 하고 있다는 것이다. 이럴 경우 개수가 많아지면 100, 1000, … N번의 INSERT 작업이 필요하게 되는데 상당히 비용이 많이 드는 작업이다. 똑같은 틀의 INSERT 작업이라면 배열로 한 번에 모아서 INSERT 할 수 있다. 그럼 테스트를 해보자
console.log("실행시간 :", new Date());
console.time("단일 insert");
for (const v of 배열) {
await 레포지토리.save({
...,
language: v.language,
description: v.description,
title: v.title,
});
}
console.timeEnd("단일 insert");
console.time("벌크 insert");
const aa = 배열.map((v) => {
return {
...,
language: v.language,
description: v.description,
title: v.title,
};
});
await 레포지토리.save(aa);
console.timeEnd("벌크 insert");
console.log("============================");빠를 땐 2배 이상 빠른데 느릴 때도 있고 결과 값이 일정하지 않다…. 왜 그럴까?

console.log("실행시간 :", new Date());
console.time("단일 insert");
for (var i = 0; i < 1000; i++) {
console.log("단일 -----", i);
await 레포지토리.save({
...,
...: historyCount + 1,
});
await 레포지토리.createQueryBuilder();
}
console.timeEnd("단일 insert");
let result = [];
for (var i = 0; i < 1000; i++) {
result.push({
...,
...: historyCount + 1,
});
}
console.time("벌크 insert");
console.log("벌크 -----");
await this.connection
.createQueryBuilder()
.insert()
.into(...)
.values(result)
.execute();
console.timeEnd("벌크 insert");
console.log("============================");






bulk insert에 대한 개념을 확실히 잡을 수 있었고 모든 비교 조건이 완벽하지는 않았겠지만 눈으로 직접 성능 확인도 해서 앞으로 잘 사용할 수 있을 것 같다