[카테캠 3단계] JPA bulk-insert 작동 안함

Seokjun Moon·2023년 10월 14일
0

JPA에서 saveAll은

엔티티 ID가 IDENTITY 로 설정할 경우, saveAll은 저장할 엔티티 하나당 하나의 insert query 를 전송합니다 ... 확인해보기 위해서 리뷰 필터링 프로젝트에서 테스트를 해봤습니다.

사전에 광고 이미지로 판별된 데이터를 주입하는데, 분명 saveAll을 했지만 로그에 기록된 쿼리를 보니

이 후에도 무수히 많은 insert 쿼리가 발생하는 ... 대참사가 벌어졌습니다. 지금 상황으로 insert 시간은 대략 41ms 입니다.

지금은 작아서 괜찮지만, 개수가 많아지면 부하가 크죠. 이를 위해 insert 쿼리를 줄일 필요가 있습니다. bulk-insert 를 구현하기 위해 jdbc 를 이용하여 직접 쿼리를 작성 후 데이터베이스에 추가하도록 구현하였습니다.

JDBC를 이용한 bulk-insert 구현

public void insertBatch(List<ParsedImageInsertRequest> requests) {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();

            String sql = String.format("""
            INSERT INTO `%s` (url, advertisement, created_at)
            VALUES (:url, :advertisement, :createdAt)
            """, TABLE);

    List<ParsedImage> images = requests.stream().map(request ->
            ParsedImage.builder().url(request.url()).advertisement(request.advertisement()).build()
    ).toList();

    SqlParameterSource[] sources = images
            .stream()
            .map(BeanPropertySqlParameterSource::new)
            .toArray(SqlParameterSource[]::new);

    namedParameterJdbcTemplate.batchUpdate(sql, sources);
    
    stopWatch.stop();
    System.out.println("Insert 시간 : " + stopWatch.getTotalTimeMillis());
}

로그를 보면

2023-10-14T15:09:43.674+09:00 DEBUG 68197 --- [  restartedMain] o.s.jdbc.core.JdbcTemplate               : Executing SQL batch update [INSERT INTO `parsed_image` (url, advertisement, created_at)
VALUES (?, ?, ?)
]
2023-10-14T15:09:43.675+09:00 DEBUG 68197 --- [  restartedMain] o.s.jdbc.core.JdbcTemplate               : Executing prepared SQL statement [INSERT INTO `parsed_image` (url, advertisement, created_at)
VALUES (?, ?, ?)
]
Insert 시간 : 62

왜 쿼리가 두번 실행되는거지 ?!?
더 찾아봐야겠다 ....

profile
차근차근 천천히

0개의 댓글