BulkInsert 구현하기

soyeon·2023년 5월 3일
post-thumbnail

성능 테스트를 하기 위해서 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 메모리 늘리기

커맨드 + , gradle 검색 후 Run tests using의 설정을 인텔리제이로 바꾼다.

profile
사부작 사부작

0개의 댓글