개발/spring2

7강(Mybatis + MariaDB 활용하여 10000건 이상의 데이터 INSERT 하기)

LoafingCat 2023. 1. 18. 13:22
  1. pom.xml에 commoms-lang3 라이브러리 추가 (테스트 데이터 랜덤 문자열 생성에 사용)

 

 

얘를 추가

 

Logback root 레벨을 DEBUG 바꿔줌. 근데 원래 디버그였으니 그대로 둡시다.

 

  1. 어플리케이션 프로퍼티에 ?allowMultiQueries=true 추가

 

 

  1. Board.xml savelist 추가

 

 

세이브 리스트라는 쿼리를 추가. 파라미터 타입은 맵. 핵심은 foreach(라는 태그라이브러리보단 Mybatis.xml문법)

콜렉션 보드리스트는 맵에 담겨있는 키. 보드리스트 배열을 반복하면서 배열의 값을 board에 지정하고 구분자는 콤마로 지정

 

  1. BoardParameter 생성자 2 추가

 

번째는 기본 생성자이고 번째는 테스트용 생성자.

 

  1. BoardRepository savelist 메소드 만들기

 

 

파라미터를 해쉬맵을 선언함.

 

  1. BoardService에 가지 메소드 만들기

 

 

SaveList1은 for문을 돌면서 repository에 save를 호출해서 데이터를 insert함.

SaveList2는 Map 클래스를 생성하고 paramMap에 boardList 이름으로 boardList를 담는다.

그리고 repository에 saveList 메소드를 호출한다.

 

  1. BoardController에 saveList1, saveList2 10000건 데이터 생성

 

.. 빨간줄이 생긴다. 문제를 해결해보자

 

시간 많이 잡아먹었는데 그냥 임포트가 된거였다.. 단축키 컨트롤 + 쉬프트+ O 먹혔는지 모르겠다.. 삽질삽질

 

이건 10000건의 데이터를 만들기 위한 테스트 소스다. 실제로는 parameter requestBody 다양한 방법으로 받음.

 

시간을 측정하기 위해 서비스 호출하기 전에 start 시간, 서비스 호출 엔드 시간을 비교해서 초로 환산해준다.

 

saveList2 거의 똑같고 이름만 다름.

로그에 이렇게 뜬다. 시간 차이가 매우 많이 나는데 나는지 로직을 보자.

 

  1. saveList1,2 시간 차이가 나는 이유

 

saveList1 for문을 돌면서 건마다 하나하나 리포지토리에 save라는 메소드를 콜하는데 이게 결국 DBconnection 한번씩 번의 인서트 쿼리를 통해서 호출된거임.

 

saveList2 한번에 paramMap boardList(10000) 담아서 리포지토리에 saveList 호출, 번의 커넥션을 통해서 인서트 쿼리를 보낸다.

 

saveList1 100 이하에서 사용을 권장하고, 2 1000, 10000 이상일 쓰면 좋다. 실무에서 써먹을 있고 퍼포먼스가 좋은 같다고 .

 

Procedure, Batch라는 방법도 있다고 .