우당탕탕

[Spring] JPA에서 Persistable 인터페이스로 성능 최적화하기: isNew() 메서드 활용법 본문

Tech/Spring

[Spring] JPA에서 Persistable 인터페이스로 성능 최적화하기: isNew() 메서드 활용법

모찌모찝 2024. 8. 16. 21:38

 

 isNew() 메서드를 활용하여 select 쿼리를 방지하고 데이터 삽입 성능을 최적화하는 방법

 

1. Persistable 인터페이스란?

JPA에서는 엔티티 객체의 상태를 관리하기 위해 다양한 방법을 제공한다. 그중 하나가 Persistable 인터페이스이다.
이 인터페이스는 엔티티가 새로 생성된 상태인지, 아니면 이미 존재하는 상태인지를 판단하는 isNew() 메서드를 제공하며 오버라이드하여 사용이 가능하다.

2. isNew() 메서드의 역할

isNew() 메서드는 JPA가 엔티티의 상태를 결정하는 데 사용되며 return 값으로 true와 false 값을 반환할 수 있다. 만약 true를 반환한다면 JPA는 해당 엔티티를 새로운 것으로 인식하고 insert 쿼리를 수행하고 반대로 false를 반환하면, JPA는 해당 엔티티가 이미 존재한다고 판단하여 select 쿼리를 수행한 후 update 쿼리를 수행한다.

이 메서드를 사용하는 이유는 주로 성능 최적화와 관련이 있다. 기본적으로 JPA는. save()와 같은 저장을 시도할 때 엔티티가 새로 생성된 것인지 확인하기 위해 select 쿼리를 실행하게 된다. 하지만 isNew()를 true로 설정하면, 이 select 쿼리를 건너뛰고 직접 insert 쿼리를 수행하여 불필요한 select 시간을 단축시킬 수 있다.
기본적으로 대량 푸시메시지 발송, 이벤트 처리시에 다건의 신규 데이터를 저장시킬 경우 사용되며, 꽤 많은 시간을 단출시킬 수 있다.

아래는 예시코드이다

import org.springframework.data.domain.Persistable;
@Entity
public class MyEntity implements Persistable<Long> {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    public MyEntity(String name) {
        this.name = name;
    }

  

    @Override
    public boolean isNew() {
    	// true를 return하여 신규저장임을 알려줌
        return true;
    }
 }

  

Comments