본문 바로가기
웹/Spring

[JPA] Persist와 Merge

by J_Remind 2024. 9. 3.

Spring Boot Data JPA에서 persistmerge는 둘 다 엔티티 객체를 데이터베이스에 저장하거나 갱신하는 데 사용 되는 메서드 입니다.

save 메서드를 실행하게 되면 Spring Boot Data JPAJpaRepository 인터페이스의 기본 구현체인 SimpleJpaRepository에서 신규 Entity 여부 확인 후 persist혹은 merge을 실행합니다.

persist는 새로운 엔티티를 영속화 할 때 사용하며 EntityManager의 영속성 컨텍스트에 추가합니다.

merge는 기존의 엔티티를 업데이트 하거나 데이터베이스에 없는 엔티티를 저장할 때 사용합니다. 만약 엔티티가 영속성 컨텍스트에 없으면 새로운 영속 상태를 생성하고, 존재하면 기존 엔티티를 갱신합니다.

SimpleJpaRepository에서 EntityInformation 의 구현체인 AbstractEntityInformationisNew 메서드를 통해 엔티티가 새로운 엔티티인지 여부를 판단하여 persist혹은 merge실행합니다.

isNew 메서드는 엔티티의 ID를 가져와 원시타입이 아닌 경우, ID가 null 이면 새로운 엔티티로 간주합니다.

ID가 Number 타입인 경우, ID의 값이 0이면 새 엔티티로 간주합니다.

persistmergeSessionImplPersistEventMergeEvent를 통해서 각 EventListener에서 로직을 처리합니다.

merge

merge를 사용할 때 INSERT 또는 UPDATE쿼리가 발생하는 경우가 있습니다.

INSERT 쿼리가 발생하는 경우

merge 메서드를 호출할 때 INSERT 쿼리가 발생하는 경우는 다음과 같습니다.

  1. 엔티티가 비영속 상태이고, 데이터베이스에 존재하지 않는 엔티티인 경우
  2. 엔티티의 식별자(Primary Key)가 설정되지 않은 경우

UPDATE 쿼리가 발생하는 경우

  1. 엔티티가 비영속 상태이지만, 데이터베이스에 해당 엔티티가 이미 존재하는 경우
  2. 엔티티의 식별자(Primary Key)가 설정되어 있고, 데이터베이스에 해당 엔티티가 존재하는 경우

' > Spring' 카테고리의 다른 글

[JPA] 영속성 컨텍스트  (0) 2024.09.01
(Spring) 2. MariaDB와 Mybatis 연동  (0) 2020.04.27
(Spring) 1. 스프링 설정  (0) 2020.04.26