스프링데이터 JPA - 엔티티 식별자 직접할당시 save 성능 최적화(Persistable)
2021. 2. 8. 13:52ㆍJPA/SPRING DATA JPA
- 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일 경우 새로운 엔티티로 판단하면 식별자 직접할당시 발생하는 비효율적인 성능을 개선할 수 있다.
'JPA > SPRING DATA JPA' 카테고리의 다른 글
스프링데이터 JPA - 컨트롤러에서 Pageable 파라미터로 받아 페이징하기 (0) | 2021.02.08 |
---|---|
스프링데이터 JPA - 도메인 클래스 컨버터 (0) | 2021.02.08 |
스프링 데이터 JPA - Auditing, 엔티티에 등록일, 수정일, 등록자, 수정자 자동으로 적용하기! (0) | 2021.02.08 |
스프링데이터 JPA - 사용자 정의 레퍼지토리 구현 (0) | 2021.02.07 |
스프링 데이터 JPA[쿼리 메서드] - 벌크 연산 (0) | 2021.02.06 |