[JAVA SPRING] DB데이터 대량 등록시 Bulk Insert 개발 방안 (Mybatis Provider 사용 추천)
자바언어로 코딩시 데이터 조회 결과데이터 List가 있을때 for문을 돌려서 저장하는 방식은 Mybatis Provider를 사용하는 것보다 비효율적이고 데이터가 많아질수록 insert하는데 걸리는 시간이 1천건 기준으로 10배, 10만건 기준으로 60배 이상의 처리속도 차이가 발생한다.
처리건수별 소요시간 비교
1. for문으로 insert 단건 호출시
1천건 : 13,459ms
1만건 : 125,579ms
10만건 : 1,268,108ms
2. Mybatis Provider를 통해 다량호출시
1천건 : 167ms
1만건 : 1,016ms
10만건 : 20,368ms
[스프링부트] 동적쿼리(DynamicSql) 작성방법 Sql.java 구현 예제
Mybatis Provider 개발 템플릿 예시
Service 파일
@RequiredArgsConstructor
@Service(“Test”)
public class saveCmdSvc {
private final saveMbtsRepo repo;
public void insertTest(ArrayList<DataDto> list) {
return repo.insertTest(list);
}
}
Repository 파일
@Mapper
//@Repository
public interface saveMbtsRepo {
@InsertProvider(type= saveSql.class, method=”saveTest”)
public void insertTest(ArrayList<DataDto> list);
}
Sql파일
public saveSql {
public String saveTest(ArrayList<DataDto> list) {
DataDto dto = list.get(0);
SQL sql = new SQL()
.INSERT_INTO(“USER_INFO”)
.INTO_COLUMN(“ID”, “NAME”)
.INTO_VALUE(
new StringBuilder(“₩'”).append(dto.getUserId()).append(“₩'”).toString(),
new StringBuilder(“₩'”).append(dto.getUserName()).append(“₩'”).toString()
);
if(list.size() > 1) {
for(int i=1; i<list.size(); i++) {
dto = list.get(i);
sql.ADD_ROW()
.INSERT_VALUE(
new StringBuilder(“₩'”).append(dto.getUserId()).append(“₩'”).toString(),
new StringBuilder(“₩'”).append(dto.getUserName()).append(“₩'”).toString()
);
}//for
}//if
}
return sql.toString();
}