주제
- 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
'# Back-End > Spring' 카테고리의 다른 글
ShedLock을 이용한 스케줄 작업 중복 방지하기 (0) | 2023.08.29 |
---|---|
스프링 배치 익혀보기 : 개념 정리 + 간단한 실습 (0) | 2023.08.03 |
[JPA] 낙관적 락(Optimistic Lock), 비관적 락(Pessimistic Lock) (0) | 2023.04.22 |
JPA Batch Insert/Update를 적용하여 성능 향상하기 (0) | 2023.04.15 |
@Transactional 어노테이션을 이용한 트랜잭션 관리 (0) | 2023.04.08 |
[Spring Data JPA] Pageable을 이용한 Paging 조회 (0) | 2022.10.01 |
Logback과 slf4j 간단한 예제 (0) | 2022.09.02 |