JPA/SPRING DATA JPA
스프링데이터 JPA - 엔티티 식별자 직접할당시 save 성능 최적화(Persistable)
YoonBing9
2021. 2. 8. 13:52
- save의 기본동작은
- 식별자가 없으면 persist
- 식별자가 있으면 merge 이다.
- merge는 데이터베이스에서 식별자로 조회를 해본 후, 없으면 insert, 있으면 update이다.(비효율적이다)
- 그런데 식별자를 @GenerateValue로 자동 할당하지 않고 직접 할당하게되면 엔티티 save시, 무조건 식별자가 세팅되어 있음으로 merge를 하게된다.
- 이 문제를 엔티티에 Persistable 인터페이스를 구현함으로서 자동할당시 save와 동일한 성능을 유지할 수 있다.
@Override
public String getId() {
return id;
}
@Override
public boolean isNew() {
return createdDate == null;
}
- Persistable을 implements하게 되면 getId(), isNew() 메서드를 구현해야한다.
- 여기서 isNew에서 DB에 저장되지 않은 새로운 엔티티를 어떻게 식별할지 새롭게 재정의 하면 된다.
- 보통은 createData(등록일자)를 조합하여 등록일자가 null일 경우 새로운 엔티티로 판단하면 식별자 직접할당시 발생하는 비효율적인 성능을 개선할 수 있다.