간단히 말해서 영속성 컨텍스트는 JPA가 관리하는 "엔티티를 저장하는 가상 공간"이예요. 여기서 "가상 공간"이란, 메모리 상에서 엔티티(객체)를 관리하는 영역을 뜻합니다. 데이터베이스(DB)와 직접적으로 소통하기 전에 JPA가 엔티티를 임시로 관리하는 역할을 해요.
- 1차 캐시
영속성 컨텍스트는 엔티티를 1차 캐시에 저장해요.
→ 동일한 엔티티를 여러 번 조회하더라도 데이터베이스를 반복해서 조회하지 않고, 1차 캐시에 있는 데이터를 사용해 성능을 높여줘요.
- 변경 감지(Dirty Checking)
엔티티의 값을 변경하면 JPA가 자동으로 감지해서 데이터베이스에 반영해 줘요.
→ 별도의 쿼리를 작성하지 않아도 변경된 내용을 업데이트할 수 있어요.
- 동일성 보장
같은 트랜잭션 안에서는 동일한 엔티티를 반환해요.
→ 객체의 일관성을 유지할 수 있어요.
- 비영속 (Transient)
아직 영속성 컨텍스트에 관리되지 않는 상태예요.
예: new 키워드로 객체를 생성한 직후.
- 영속 (Persistent)
영속성 컨텍스트에서 관리되는 상태예요.
예: EntityManager.persist()를 호출한 후.
- 준영속 (Detached)
영속성 컨텍스트에서 분리된 상태예요.
예: EntityManager.detach()를 호출한 경우.
- 삭제 (Removed)
영속성 컨텍스트와 데이터베이스에서 삭제 예정인 상태예요.
예: EntityManager.remove()를 호출한 경우.
만약 영속성 컨텍스트가 없다면, 데이터베이스와 매번 직접 소통해야 해요. 동일한 엔티티를 여러 번 조회하거나 수정할 때 성능이 떨어지고, 변경 사항을 반영하기 위해 번거롭게 SQL 쿼리를 작성해야 할 거예요. 영속성 컨텍스트 덕분에 우리는 더 간편하고 효율적으로 객체를 관리할 수 있답니다!
액션 큐는 영속성 컨텍스트에서 발생한 데이터 변경 작업(insert, update, delete 등)을 모아두는 일종의 작업 대기열이예요. 트랜잭션이 커밋되거나 flush()
가 호출될 때, 이 큐에 저장된 작업들이 데이터베이스에 순차적으로 반영됩니다.
📖해답
commit은 영속성 컨텍스트의 데이터를 지우지 않고, 데이터베이스에 반영해요.
영속성 컨텍스트는 여전히 데이터를 관리하고 있으므로 이후에도 데이터를 조회하거나 수정할 수 있습니다 :)
📖해답
flush(): 영속성 컨텍스트의 변경사항을 데이터베이스에 반영하지만 트랜잭션은 유지되어요!
commit(): flush()를 호출하고 트랜잭션을 종료해요!