728x90
새로운 엔티티를 판단하는 기본 전략
- 식별자가 객체일 때 null로 판단
- 식별자가 자바 기본 타입일 때 0으로 판단
- Persistable 인터페이스를 구현해서 판단 로직 변경 가능


- 만약 PK를 채번해서 넣는 거라면
- Save 메서드에서 PK가 있기 때문에 값이 있다고 생각하여 Merge 호출
- Merge에서 DB에 값이 있는지를 확인(select쿼리) 없으므로 insert를 실행한다.
- 비효율적이다.
직접 Persitable의 isNew 메서드를 구현

- implement Persistable를 구현하여 isNew 정책을 재정의 한다.
- 현업에서는 createDate를 비교하여 많이 사용한다.
참고
JPA 식별자 생성 전략이 @GenerateValue 면 save() 호출 시점에 식별자가 없으므로 새로운 엔티티로 인식해서 정상 동작한다. 그런데 JPA 식별자 생성 전략이 @Id 만 사용해서 직접 할당이면 이미 식별자 값이 있는 상태로 save()를 호출한다. 따라서 이 경우 merge()가 호출된다. merge()는 우선 DB를 호출해서 값을 확인하고, DB에 값이 없으면 새로운 엔티티로 인지하므로 매우 비효율 적이다. 따라서 Persistable를 사용해서 새로운 엔티티 확인 여부를 직접 구현하게는 효과적이다.
참고로 등록시간( @CreatedDate )을 조합해서 사용하면 이 필드로 새로운 엔티티 여부를 편리하게 확인할 수 있다. (@CreatedDate에 값이 없으면 새로운 엔티티로 판단)
728x90
'실전! 스프링 데이터 JPA' 카테고리의 다른 글
| Ch06. 나머지 기능들 - Query By Example (0) | 2021.12.28 |
|---|---|
| Ch06. 나머지 기능들 - Specifications (명세) (0) | 2021.12.28 |
| Ch05. 스프링 데이터 JPA 분석 - SpringDataJPA 구현체 분석 (0) | 2021.12.28 |
| Ch04. 확장 기능 - Web 확장(도메인 클래스 컨버터, 페이징과 정렬) (0) | 2021.12.27 |
| Ch04. 확장 기능 - Auditing (0) | 2021.12.27 |