DB에 엔티티를 저장하기 전에 메모리에 엔티티 인스턴스를 저장하는 환경이다.
DB에 엔티티를 저장하거나 조회할 때 사용되며, 영속성 컨텍스트에 저장된 엔티티를 모니터링하며 변경된 부분에 대해 DB에 동기화한다.
영속성 컨텍스트는 물리적으로 메모리에서 관리되므로 휘발성이다.
즉, 애플리케이션을 종료하면 영속성 컨텍스트는 소멸된다.
엔티티 매니저를 통해 영속성 컨텍스트에 엔티티를 저장하면 1차 캐시 공간에 저장된다.
이 후 해당 엔티티에 대한 조회, 수정이 이루어질 경우 1차 캐시 공간에 있는 엔티티를 반환함으로서 DB에 불필요한 쿼리를 보내지 않고 성능을 향상시킬 수 있다.
DB에서 조회한 데이터로 새로운 객체를 만드는 것이 아닌, 영속성 컨텍스트에서 엔티티 객체를 추출함으로서 똑같은 데이터에 대한 동일한 객체를 반환한다.
영속성 컨텍스트에 엔티티 객체를 저장할 때
쓰기 지연 SQL 저장소
에 해당 쿼리도 함께 저장한다. 이 후 트랜잭션 커밋을 통해 모아두었던 쿼리를 한번에 실행시킬 수 있다.
이를 통해, db 접근 횟수를 줄이고 성능을 향상시킬 수 있다.
jpa를 사용하여 엔티티를 수정할 때 따로 update같은 메서드가 없다.
영속성 컨텍스트의 1차 캐시 저장공간에는 엔티티를 저장하는 공간과 해당 엔티티가 처음 들어왔을 때의 상태를 저장하는 스냅샷 공간 2개가 있다. 영속성 컨텍스트에서는 이 두 공간의 엔티티 차이를 파악하여 update 쿼리를 생성한다. 이 후 트랜잭션 커밋이 동작할 때 해당 update 쿼리를 db로 보내게 된다.
데이터베이스의 상태를 변경하는 여러 작업을 묶어 하나의 논리적인 작업 단위로 만들어 데이터의 무결성과 일관성을 보장하는 것
트랜잭션에 의해 수행된 모든 작업이 정상적으로 완료되어 데이터베이스에 반영되는 것
JPA 사용에 있어서 가장 중요한 작업은 엔티티와 테이블을 매핑하는 것이다.
@Entity
, @Table
@Id
@Column
@ManyToOne
, @JoinColumn
기본 키 생성을 DB에 위임하므로, DB에 값이 저장되어야 기본 키 값을 구할 수 있다.
엔티티는 식별자가 있어야지 영속 상태가 될 수 있다. 하지만, IDENTITY
전략은 DB에 값이 저장되어야 식별자인 기본 키가 생성된다. 따라서 엔티티 객체를 생성한 후 영속성 컨텍스트에 저장 시 바로 DB까지 INSERT 쿼리가 실행되게 된다. 이 전략은 트랜잭션이 지원하는 쓰기 지연을 사용 못함.