7강(Mybatis + MariaDB 활용하여 10000건 이상의 데이터 INSERT 하기)
- pom.xml에 commoms-lang3 라이브러리 추가 (테스트 데이터 랜덤 문자열 생성에 사용)
얘를 추가
Logback에 root 레벨을 DEBUG로 바꿔줌. 근데 원래 디버그였으니 그대로 둡시다.
- 어플리케이션 프로퍼티에 ?allowMultiQueries=true 추가
- Board.xml에 savelist 추가
세이브 리스트라는 쿼리를 추가. 파라미터 타입은 맵. 핵심은 foreach(라는 태그라이브러리보단 Mybatis.xml문법)
콜렉션 보드리스트는 맵에 담겨있는 키. 보드리스트 배열을 반복하면서 배열의 값을 board에 지정하고 구분자는 콤마로 지정
- BoardParameter에 생성자 2개 추가
첫 번째는 기본 생성자이고 두 번째는 테스트용 생성자.
- BoardRepository에 savelist 메소드 만들기
파라미터를 해쉬맵을 선언함.
- BoardService에 두 가지 메소드 만들기
SaveList1은 for문을 돌면서 repository에 save를 호출해서 데이터를 insert함.
SaveList2는 Map 클래스를 생성하고 paramMap에 boardList 이름으로 boardList를 담는다.
그리고 repository에 saveList 메소드를 호출한다.
- BoardController에 saveList1, saveList2 10000건 데이터 생성
자.. 빨간줄이 생긴다. 문제를 해결해보자
시간 많이 잡아먹었는데 그냥 임포트가 안 된거였다.. 왜 단축키 컨트롤 + 쉬프트+ O가 안 먹혔는지 모르겠다.. 삽질삽질
이건 10000건의 데이터를 만들기 위한 테스트 소스다. 실제로는 parameter나 requestBody 등 다양한 방법으로 받음.
시간을 측정하기 위해 서비스 호출하기 전에 start 시간, 서비스 호출 후 엔드 시간을 비교해서 초로 환산해준다.
saveList2도 거의 다 똑같고 이름만 다름.
로그에 이렇게 뜬다. 시간 차이가 매우 많이 나는데 왜 나는지 로직을 보자.
- saveList1,2 시간 차이가 나는 이유
saveList1은 for문을 돌면서 한 건마다 하나하나 리포지토리에 save라는 메소드를 콜하는데 이게 결국 DBconnection을 한번씩 만 번의 인서트 쿼리를 통해서 호출된거임.
saveList2는 한번에 paramMap에 boardList(10000건)을 담아서 리포지토리에 saveList 호출, 총 한 번의 커넥션을 통해서 인서트 쿼리를 보낸다.
saveList1은 100건 이하에서 사용을 권장하고, 2는 1000, 10000개 이상일 때 쓰면 좋다. 실무에서 써먹을 수 있고 퍼포먼스가 더 좋은 거 같다고 함.
Procedure, Batch라는 방법도 있다고 함.