![[JPA] 비영속 엔티티 -> 영속 엔티티 변경 과정 (old1)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrLgkl%2FbtsCJhqZmzb%2FqseGMkyJ9O1Ks1S6BlEbTK%2Fimg.png)
[JPA] 비영속 엔티티 -> 영속 엔티티 변경 과정 (old1)legacy/JPA2023. 12. 28. 23:21
Table of Contents
EntityManager를 통해 비영속 상태의 Entity를 영속 상태의 Entity로 변경할 수 있습니다. 이때 사용되는 메서드는 merge()입니다.
그렇다면 비영속 -> 영속 상태로 변경하는 과정은 어떻게 될까요? 차근차근 알아봅시다.
준영속 상태
준영속 상태란 EntityManager가 관리하지 않는 Entity라고 생각하면 됩니다. 관리되지 않기 때문에 해당 엔티티의 값을 변경하더라도 DB에 반영되지가 않습니다. 준영속 상태의 특징은 다음과 같습니다.
- 비영속 상태에 가깝다
- 영속성 컨텍스트에 의해 관리되지 않으므로 1차 캐시, 쓰기 지연 SQL, 변경 감지 등을 지원하지 않습니다
- 식별자 값을 가지고 있다
- 준영속 상태가 되기 전에 영속 상태이었기 때문에 식별자 값을 가지고 있습니다. 이 식별자 값은 1차 캐시에 저장될 때 사용됩니다
- 지연 로딩을 할 수 없다
이 글에서 핵심 포인트는 식별자 값을 가지고 있다 입니다. 영속 상태 -> 비영속 상태가 된 것이기 때문에 영속 상태였을 때의 식별자 값을 가지고 있습니다.
병합
준영속 상태 -> 영속 상태로 변경하기 위해서는 EntityManager의 merge() 메서드를 호출해야 합니다. merge() 메서드가 호출되었을 때 과정은 다음과 같습니다.
- merge() 메서드를 호출합니다
- 준영속 상태의 엔티티가 가지고 있는 식별자 값으로 1차 캐시에서 엔티티를 조회합니다
- 1차 캐시에서 조회가 되지 않는다면 DB에 접근하여 엔티티를 조회합니다
- 조회한 엔티티에 준영속 상태의 엔티티가 갖고 있는 값을 저장합니다(병합)
- 3번 과정을 거친 엔티티를 반환합니다
준영속 상태의 엔티티는 식별자 값을 가지고 있기 때문에 1차 캐시와 DB에서 엔티티를 조회할 수 있습니다.
위 과정을 다음 사진으로 정리할 수 있습니다.