save가 "무조건 insert"라고 믿는지, persist/merge 분기와 isNew 판별 규칙까지 잡는 사람인지를 가른다.
Spring Data JPA의 SimpleJpaRepository.save는 JpaEntityInformation.isNew(entity) 결과로 persist와 merge 중 어느 쪽으로 갈지 분기한다. 기본 구현은 @Version 필드가 있으면 그 값의 null 여부, 없으면 @Id 타입과 값(null 또는 primitive 0)을 기준으로 "신규"인지 판단한다. 그래서 GenerationType.IDENTITY/SEQUENCE처럼 DB가 ID를 할당해주면 자연스럽게 isNew=true가 잡히지만, _UUID나 외부 키처럼 ID를 직접 할당_하면 isNew=false가 되어 merge 경로로 들어가 select-then-update가 돈다. 이 경우 Persistable을 구현해 isNew를 명시적으로 제공하거나 EntityManager.persist를 직접 호출하는 게 정공법이다.
대량 저장 API에서 SQL 로그를 보고 "왜 select가 같이 나오지"를 추적해본 적이 있다면 isNew/merge 경로 이야기로 연결할 수 있다
UUID PK 도메인에서 Persistable을 구현해 persist 경로로 강제한 경험이 있다면 그대로 답변 후크가 된다
ID 생성 전략을 IDENTITY에서 직접 할당 방식으로 바꾸며 저장 성능이 달라진 경험을 정량으로 말할 수 있다
아직 공개된 답변이 없어요. 첫 공개 답변을 남겨보세요.