영속성 컨텍스트(Persistence Context)
- 영속성 컨텍스트는 애플리케이션과 데이터베이스 사이에서 엔티티와 레코드의 괴리를 해소하는 기능과 객체를 보관하는 기능을 수행
- 엔티티 객체가 영속성 컨텍스트에 들어오면 JPA는 엔티티 객체의 매핑 정보를 데이터베이스에 반영하는 작업을 수행함
- 이처럼 엔티티 객체가 영속성 컨텍스트에 들어와 JPA의 관리 대상이 되는 시점부터는 해당 객체를 영속 객체(Persistence Object)라고 부름
- 영속성 컨텍스트는 세션 단위의 생명주기를 가짐
- 데이터베이스에 접근하기 위한 세션이 생성되면 영속성 컨텍스트가 만들어지고, 세션이 종료되면 영속성 컨텍스트도 없어짐
- 엔티티 매니저는 이러한 일련의 과정에서 영속성 컨텍스트에 접근하기 위한 수단으로 사용됨
엔티티 매니저(Entity Manager)
- 엔티티를 관리하는 객체
- 엔티티 매니저는 데이터베이스에 접근해서 CRUD 작업을 수행함
- Spring Data JPA는 리포지토리를 사용해서 데이터베이스에 접근하는데, 실제 내부 구현체인 SimpleJpaRepository를 보면 엔티티 매니저를 사용하는 것을 알 수 있음
@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID extends Serializable> implements JpaRepository<T, ID>,
JpaSpecificationExecutor<T> {
private final JpaEntityInformation<T, ?> entityInformation;
protected final EntityManager em;
private final PersistenceProvider provider;
private CrudMethodMetadata crudMethodMetadata;
/**
* Creates a new {@link SimpleJpaRepository} to manage objects of the given {@link JpaEntityInformation}.
*
* @param entityInformation must not be {@literal null}.
* @param entityManager must not be {@literal null}.
*/
public SimpleJpaRepository(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
Assert.notNull(entityInformation);
Assert.notNull(entityManager);
this.entityInformation = entityInformation;
this.em = entityManager;
this.provider = PersistenceProvider.fromEntityManager(entityManager);
}
- 엔티티 매니저는 엔티티 매니저 팩토리가 만듬
- 엔티티 매니저 팩토리는 데이터베이스에 대응하는 객체로, 스프링 부트에서는 자동 설정 기능이 있기 때문에 applicatioin.properties에서 작성한 최소한의 설정만으로 동작하지만, JPA의 구현체 중 하나인 하이버네이트에서는 persistence.xml 이라는 설정 파일을 구성하고 사용해야 함
- 엔티티 매니저 팩토리로 생성된 엔티티 매니저는 엔티티를 영속성 컨텍스트에 추가해서 영속 객체로 만드는 작업을 수행하고, 영속성 컨텍스트와 데이터베이스를 비교하면서 실제 데이터베이스를 대상으로 작업을 수행함
엔티티의 생명주기
1. 비영속(New)
- 엔티티가 아직 영속성 컨텍스트에 관리되지 않는 상태입니다.
- 엔티티는 새로 생성되었거나, 데이터베이스에서 로드되지 않았습니다.
- 엔티티 변경 사항은 데이터베이스에 반영되지 않습니다.
2. 영속(Managed)
- 엔티티가 영속성 컨텍스트에 의해 관리되는 상태입니다.
EntityManager.persist()
메서드를 사용하여 엔티티를 영속성 컨텍스트에 추가합니다.- 엔티티 변경 사항은 자동으로 데이터베이스에 반영됩니다.
3. 준영속(Detached)
- 엔티티가 영속성 컨텍스트에서 분리된 상태입니다.
EntityManager.detach()
메서드를 사용하여 엔티티를 분리하거나, 영속성 컨텍스트가 종료될 때 발생합니다.- 엔티티 변경 사항은 데이터베이스에 반영되지 않습니다.
4. 삭제(Removed)
- 엔티티가 데이터베이스에서 삭제된 상태입니다.
EntityManager.remove()
메서드를 사용하여 엔티티를 삭제합니다.- 엔티티는 더 이상 영속성 컨텍스트에 존재하지 않습니다.
상태 간의 이동
- 비영속 -> 영속:
EntityManager.persist()
메서드를 사용합니다. - 영속 -> 준영속:
EntityManager.detach()
메서드를 사용하거나, 영속성 컨텍스트가 종료됩니다. - 준영속 -> 영속:
EntityManager.merge()
메서드를 사용합니다. - 영속 -> 삭제:
EntityManager.remove()
메서드를 사용합니다.
참고 자료
- 스프링 부트 핵심 가이드 "스프링 부트를 활용한 애플리케이션 개발 실무" , 장정우, 2022
'Development > Spring' 카테고리의 다른 글
[Spring] DAO (Data Access Object), DTO (Data Transfer Object) (0) | 2024.02.18 |
---|---|
[Spring] Spring Data JPA, Repository (0) | 2024.02.17 |
[Spring] Springboot Swagger 3 적용하기 (Springdoc-OpenAPI3) (0) | 2024.01.30 |
[Spring] 엔티티 (Entity) (0) | 2024.01.24 |
[Spring] JPA (Java Persistence API), Hibernate, Spring Data JPA (1) | 2024.01.23 |