Java프로그래밍

[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();

}

error: Content is protected !!