Insert문 전에 발생하는 Select문을 제거해보자
# Back-End/Spring

Insert문 전에 발생하는 Select문을 제거해보자

 

주제

  • 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