[JPA 갑자기 궁금증 해결] DataJpa 에서 save 내부 동작 방식

  • data jpa 에서의 save 메서드의 내부 로직은 이렇다
public <S extends T> S save(S entity) {
    Assert.notNull(entity, "Entity must not be null");

    if (entityInformation.isNew(entity)) {
        entityManager.persist(entity);
        return entity;
    } else {
        return entityManager.merge(entity);
    }
}
  • 주어진 엔티티가 일단 새로운 엔티티인지 아닌지를 판단한다.
    • 이는 entityInformation.isNew(entity) 를 통해 이루어진다.
      • entityInformation 은 엔티티에 대한 메타데이터를 제공하는 클래스이며
      • isNew
        • 는 엔티티가 새로운 것인지 아닌지를 판단하는 로직을 포함한다.
  • 엔티티가 새로운 엔티티라면
    • persist 를 통해 엔티티를 저장한다.
      • persist
        • 새로운 엔티티를 영속화하는 역할을 한다.
  • 엔티티가 새로운 엔티티가 아니라면
    • merge 를 통해 엔티티를 저장한다.
      • merge sms
        • 준영속 상태의 엔티티를 영속화하고, 영속성 컨텍스트가 관리하는 새로운 엔티티를 반환한다.

즉, 영속화한다고 생각하면된다.

영속화만 진행하기에 실제 트랜잭션안에서 커밋이 이루어진 경우에만 쿼리가 날아가게 되는 것이다.


Uploaded by N2T