BACKEND/JAVA & SPRING

JpaRepository save()

이-프 2023. 6. 11. 20:15

save() 역할은 무엇일까?

스프링 단에서 알아서 데이터를 DB안에 넣어주는 기능

⇒ JpaRepository를 확장하는 인터페이스만 만들어서 Repository로 사용하면 됨

 

 

JPA 심층 분석

ORM 프레임워크인 JPA와 Spring 프레임워크를 연계하여 사용 ⇒ JPARepository 인터페이스를 자주 사용

  • 실제 동작하는 구현체 = SimpleJpaRepository
  • @Repository 어노테이션이 붙어있기 때문에, Spring이 실행될 때 AnnotationApplicationContext에 의해 스프링 컨테이너에 Bean으로 등록이 된다.

 

Exmaple

**SimpleJpaRepository.save(S entity)**

@Transactional
@Override
public <S extends T> S save(S entity) {

    if (entityInformation.isNew(entity)) {
        em.persist(entity);
        return entity;
    } else {
        return em.merge(entity);
    }
    }

새로운 entity ? or not ?

새로운 entity : entity의 식별자(ID) 상태가 0일 경우

  • @GenerateValue
  • DB에 식별자 생성을 위임하기에 save를 호출하는 시점에 새로운 entity로 인식 ⇒ persist()호출
  • @Id
  • save() 호출 시점에 새로운 entity가 아니므로 merge() 호출
  • 파라미터로 넘어온 entity가 새로운 entity인 경우 : EntityManger에서 persist()를 호출
  • 새로운 entity가 아닌 경우 : EntityManger에서 merge()를 호출

 

 

merge()

detach된 entity를 다시 영속 상태로 만들기 위해 사용

  1. 파라미터로 넘어온 entity가 영속성 컨텍스트 1차 캐시에 있는지 확인
  2. (없을 경우) DB에 id를 기준으로 select query를 날려서 조회
  3. (조회시 있을 경우) DB에 이미 있는 entity와 트랙잭션 커밋 시점에 파라미터 entity의 값과 비교하여 update query 발생
  4. (조회시 없을 경우) DB에 추가하기 위해 insert query 발생

 

 

 

 

참고자료

[JPA] JpaRepository save() 메서드 주의 사항

'BACKEND > JAVA & SPRING' 카테고리의 다른 글

Annotation이란?  (1) 2023.09.18
[JAVA] 입출력Stream이란?  (0) 2023.08.16
DAO DTO Repository  (0) 2023.05.19
Servlet(서블릿)  (0) 2023.05.18
JPA  (1) 2023.05.08