
성능 테스트를 하기 위해서 100만건의 데이터를 넣는 벌크 인서트를 구현해보자.
package com.example.twittermysql.domain.post;
import com.example.twittermysql.domain.post.entity.Post;
import com.example.twittermysql.domain.post.repository.PostRepository;
import com.example.twittermysql.util.PostFixtureFactory;
import java.time.LocalDate;
import java.util.stream.IntStream;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.StopWatch;
@SpringBootTest
public class PostBulkInsertTest {
@Autowired
private PostRepository postRepository;
@Test
public void bulkInsert() {
var easyRandom = PostFixtureFactory.get(
3L,
LocalDate.of(2023, 1, 1),
LocalDate.of(2023, 2, 1)
);
var stopWatch = new StopWatch();
stopWatch.start();
var posts = IntStream.range(0, 10000 * 100)
.parallel()
.mapToObj(i -> easyRandom.nextObject(Post.class))
.toList();
stopWatch.stop();
System.out.println("객체 생성 시간: " + stopWatch.getTotalTimeSeconds());
var queryStopWatch = new StopWatch();
queryStopWatch.start();
postRepository.bulkInsert(posts);
queryStopWatch.stop();
System.out.println("DB 인서트 시간: " + queryStopWatch.getTotalTimeSeconds());
}
}
결과
=> 객체 생성 시간: 2.239345916,
DB 인서트 시간: 9.951494375
모두 실행 후 쿼리를 통해 확인하면 DB에 잘 insert 된것을 확인할 수 있다.

이 테스트를 진행할때 메모리 부족으로 테스트가 종료될 수 있으니 다음의 설정을 추가로 해줘야한다.
shift + command + A (상단바 -> help -> find action...) 창으로 들어가서 Edit Custom VM Options 검색 후 기존 메모리의 용량을 -Xmx4096m로 두배로 올려준다. 인텔리제이를 재실행한다.
shift + command + A -> show memory indicator 를 활성화하면 인텔리제이 오른쪽 하단에서 메모리를 확인할 수 있다.
커맨드 + , gradle 검색 후 Run tests using의 설정을 인텔리제이로 바꾼다.
