# Back-End/Spring
Insert문 전에 발생하는 Select문을 제거해보자
왕꿀꿀
2023. 4. 15. 18:34
주제
- JPA save 호출 시 Insert문 전에 Select문이 발생하는 이유를 알아본다.
- Select문을 제거하여 성능 개선을 경험한다.
1. JPA Insert 하기 전에 Select 문이 발생하는 이유
1.1 Save 메소드를 열어보자
SimpleJpaRepository를 확인하면 저장하려는 엔티티가 새로운 것인지 isNew를 통해 확인하고 저장한다.
- 새로운 엔티티의 경우 persist
- 기존에 있던 엔티티라면 merge
1.2 isNew의 기준을 재정의하자
AbstractEntityInformation.class 를 보면 isNew의 기준은 엔티티의 ID(식별자)를 보고 새로운 엔티티인지 판별하게 된다.
우리는 엔티티에 Persistable를 구현하여 이 기준을 재정의 한다.
package com.kingpiggy.study.domain.test;
...
import org.springframework.data.domain.Persistable;
...
@Data
@Builder
@Entity
@Table(name = "simple_id_data")
@NoArgsConstructor
@AllArgsConstructor
public class SimpleIdEntity extends BaseTimeEntity implements Persistable<Long> {
@Id
private Long id;
@Column
private String title;
@Column
private String description;
@Override
public boolean isNew() {
return this.getCreatedTime() == null;
}
}
엔티티에 Persistable 인터페이스를 Implements하고, isNew의 기준을 재정의한다.
1.3 주의사항
주의사항은 엔티티의 기본 키 생성 전략이 Identity(Auto Increment) 일 경우 적용되지 않는다.
재정의한 기준은 꼭 신규 엔티티인지 판별할 수 있는 기준이어야 한다.
2. 성능 비교
2.1 재정의하지 않았을 때(Select 후 Insert)
2,000건의 데이터를 모두 삭제 후 저장한다 했을 때
실행 메서드: bulkInsertForSimpleId, 실행시간 = 24.989s
2.2 재정의 했을 때(Select 후 Insert)
2,000건의 데이터를 모두 삭제 후 저장한다 했을 때
실행 메소드: bulkInsertForSimpleId, 실행시간 = 7.41s
데이터의 양이 많을 수록 비약적인 차이가 날 것으로 보인다.
# 참고자료
- 구글
728x90