실전! 스프링 데이터 JPA

Ch05. 스프링 데이터 JPA 분석 - 새로운 엔티티를 구별하는 방법

webmaster 2021. 12. 28. 12:35
728x90

새로운 엔티티를 판단하는 기본 전략

  • 식별자가 객체일 때 null로 판단
  • 식별자가 자바 기본 타입일 때 0으로 판단
  • Persistable 인터페이스를 구현해서 판단 로직 변경 가능

PK가 자동증가가 아닌 채번값이다.
Test

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

직접 Persitable의 isNew 메서드를 구현

isNew 구현

  • implement Persistable를 구현하여 isNew 정책을 재정의 한다.
  • 현업에서는 createDate를 비교하여 많이 사용한다.

참고

JPA 식별자 생성 전략이 @GenerateValue 면 save() 호출 시점에 식별자가 없으므로 새로운 엔티티로 인식해서 정상 동작한다. 그런데 JPA 식별자 생성 전략이 @Id 만 사용해서 직접 할당이면 이미 식별자 값이 있는 상태로 save()를 호출한다. 따라서 이 경우 merge()가 호출된다. merge()는 우선 DB를 호출해서 값을 확인하고, DB에 값이 없으면 새로운 엔티티로 인지하므로 매우 비효율 적이다. 따라서 Persistable를 사용해서 새로운 엔티티 확인 여부를 직접 구현하게는 효과적이다.

참고로 등록시간( @CreatedDate )을 조합해서 사용하면 이 필드로 새로운 엔티티 여부를 편리하게 확인할 수 있다. (@CreatedDate에 값이 없으면 새로운 엔티티로 판단)

728x90