벌크 인서트는 한번의 SQL실행으로 여러개의 데이터를 한꺼번에 삽입하는 기법이다.
일반적인 INSERT문은 한행씩 추가하지만, 벌크 인서트는 여러 개의 행을 한번에 추가하여
성능을 개선한다.
일반적인 INSERT 실행시
INSERT INTO seats (hall_id, seat_number) VALUES (1, 1);
INSERT INTO seats (hall_id, seat_number) VALUES (1, 2);
INSERT INTO seats (hall_id, seat_number) VALUES (1, 3);
INSERT INTO seats (hall_id, seat_number) VALUES (1, 4);
각 쿼리마다 트랜잭션이 발생하고 네트워크 요청이 많아진다.
Bulk Insert 실행시
INSERT INTO seats (hall_id, seat_number) VALUES
(1,1), (1,2), (1,3), (1,4);
이렇게 한번에 쿼리로 요청을 보낼수 있어서 효율적이다.
그리고 Bulk Insert를 사용하는 방식으로
JdbcTemplate가 많이 사용되는데
이 경우 영속성 컨텍스트에 저장하지 않고 바로 DB에 저장하기에 성능 적으로 유리할 수 있다.
예)
public void bulkInsertSeats(List<SeatsDto> seatsDto) {
String sql = "INSERT INTO seats (hall_id, seat_number) VALUES (?,?)";
jdbcTemplate.batchUpdate(sql, seatsDto, 1000, (ps, dto) -> {
ps.setLong(1, dto.getHallId());
ps.setInt(2, dto.getSeatNumber());
});
}
하지만 이렇게 사용했을 경우 영속성 컨텍스트에 저장되지 않기 때문에
ORM의 장점을 살릴 수 없다.
그래서 나는 JdbcTemplate로 수행하는 방식말고
Jpa의 saveAll() 메서드를 사용하고 Hibernate의 배치 설정을 함께 사용하는 방식인
ORM 방식을 사용하기로 했다.
public List<Seats> saveAll(List<Seats> seats) {
List<Seats> seatsList = seatsRepository.saveAll(seats);
return seatsList;
}
# 배치 사이즈 설정
spring.jpa.properties.hibernate.jdbc.batch_size=1000
# 배치 처리 활성화
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true
이렇게 하면 효율적으로 INSERT를 할수 있고 ORM의 장점을 살릴 수 있게된다.
데이터를 저장만 해야한다면 JdbcTemplate 를 사용하는게 성능상 유리할수 있지만
데이터를 저장해두기만 할일이 있을까? 라는 의문을 가지게된다.
저장했다는 것은 꺼내서 사용할 일이 있을것이고
꺼내서 사용할 일이 적다면 저장해둘 필요가 없지않을까? 라는 생각이다.
그래도 중요한 대량의 데이터를 저장하고 조회할일이 적다면 JdbcTemplate방식을 사용하도록 기억해둬야겠다.
'개발학습기' 카테고리의 다른 글
| STOMP(Simple Text Oriented Messaging Protocol) (0) | 2025.02.11 |
|---|---|
| 웹 소켓 (0) | 2025.02.11 |
| 쿠키(Cookie) (1) | 2024.12.29 |
| 세션(Session) (0) | 2024.12.29 |
| FTP(File Transfer Protocol) (0) | 2024.12.29 |