Spring Boot Data JPA
에서 persist
와 merge
는 둘 다 엔티티 객체를 데이터베이스에 저장하거나 갱신하는 데 사용 되는 메서드 입니다.
save
메서드를 실행하게 되면 Spring Boot Data JPA
의 JpaRepository
인터페이스의 기본 구현체인 SimpleJpaRepository
에서 신규 Entity
여부 확인 후 persist
혹은 merge
을 실행합니다.
persist는 새로운 엔티티를 영속화 할 때 사용하며 EntityManager의 영속성 컨텍스트에 추가합니다.
merge는 기존의 엔티티를 업데이트 하거나 데이터베이스에 없는 엔티티를 저장할 때 사용합니다. 만약 엔티티가 영속성 컨텍스트에 없으면 새로운 영속 상태를 생성하고, 존재하면 기존 엔티티를 갱신합니다.
SimpleJpaRepository
에서 EntityInformation
의 구현체인 AbstractEntityInformation
의 isNew
메서드를 통해 엔티티가 새로운 엔티티인지 여부를 판단하여 persist
혹은 merge
실행합니다.
isNew
메서드는 엔티티의 ID를 가져와 원시타입이 아닌 경우, ID가 null 이면 새로운 엔티티로 간주합니다.
ID가 Number 타입인 경우, ID의 값이 0이면 새 엔티티로 간주합니다.
persist
와 merge
는 SessionImpl
의 PersistEvent
와 MergeEvent
를 통해서 각 EventListener
에서 로직을 처리합니다.
merge
merge를 사용할 때 INSERT
또는 UPDATE
쿼리가 발생하는 경우가 있습니다.
INSERT 쿼리가 발생하는 경우
merge 메서드를 호출할 때 INSERT 쿼리가 발생하는 경우는 다음과 같습니다.
- 엔티티가 비영속 상태이고, 데이터베이스에 존재하지 않는 엔티티인 경우
- 엔티티의 식별자(Primary Key)가 설정되지 않은 경우
UPDATE 쿼리가 발생하는 경우
- 엔티티가 비영속 상태이지만, 데이터베이스에 해당 엔티티가 이미 존재하는 경우
- 엔티티의 식별자(Primary Key)가 설정되어 있고, 데이터베이스에 해당 엔티티가 존재하는 경우
'웹 > Spring' 카테고리의 다른 글
[JPA] 영속성 컨텍스트 (0) | 2024.09.01 |
---|---|
(Spring) 2. MariaDB와 Mybatis 연동 (0) | 2020.04.27 |
(Spring) 1. 스프링 설정 (0) | 2020.04.26 |