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를 다시 영속 상태로 만들기 위해 사용
- 파라미터로 넘어온 entity가 영속성 컨텍스트 1차 캐시에 있는지 확인
- (없을 경우) DB에 id를 기준으로 select query를 날려서 조회
- (조회시 있을 경우) DB에 이미 있는 entity와 트랙잭션 커밋 시점에 파라미터 entity의 값과 비교하여 update query 발생
- (조회시 없을 경우) DB에 추가하기 위해 insert query 발생
참고자료
'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 |