JPA는 엔티티(Entity)를 영속성 컨텍스트(Persistence Context) 를 통해 관리한다.
엔티티는 생성부터 삭제까지 다음과 같은 4가지 상태를 가진다.
비영속(Transient)
↓
영속(Persistent)
↓
준영속(Detached)
↓
삭제(Removed)
비영속 상태는 영속성 컨텍스트가 관리하지 않는 새로운 객체이다.
Product product = new Product();
이 객체는 단순히 JVM 메모리에만 존재하며 DB와는 아무런 관계가 없다.
영속 상태는 영속성 컨텍스트가 엔티티를 관리하는 상태이다.
Product product = productRepository.findById(1L).get();
또는
productRepository.save(product);
이후부터 해당 엔티티는 영속성 컨텍스트의 관리 대상이 된다.
예를 들어
@Transactional
public void update() {
Product product = productRepository.findById(1L).get();
product.setPrice(30000);
}
save()를 호출하지 않아도 Dirty Checking으로 인해 UPDATE SQL이 자동으로 실행된다.
준영속 상태는 영속성 컨텍스트가 더 이상 엔티티를 관리하지 않는 상태이다.
예를 들어
entityManager.detach(product);
를 호출하면 해당 엔티티는 준영속 상태가 된다.
삭제 상태는 삭제가 예약된 상태이다.
productRepository.delete(product);
또는
entityManager.remove(product);
를 호출하면 삭제 상태가 되며,
트랜잭션이 Commit되면 DELETE SQL이 실행된다.
DELETE
FROM product
WHERE id = 1;
| 상태 | 설명 |
|---|---|
| 비영속(Transient) | 단순히 생성된 객체로 영속성 컨텍스트가 관리하지 않는다. |
| 영속(Persistent) | 영속성 컨텍스트가 관리하는 상태이며 Dirty Checking, 1차 캐시 등을 사용할 수 있다. |
| 준영속(Detached) | 영속성 컨텍스트가 더 이상 관리하지 않는 상태이다. |
| 삭제(Removed) | 삭제가 예약된 상태이며 Commit 시 DELETE SQL이 실행된다. |
new로 생성한 객체JPA
↓
Hibernate
↓
@Transactional
↓
영속성 컨텍스트
↓
Entity(영속 상태)
↓
1차 캐시
↓
Dirty Checking
↓
Write Behind
↓
Flush
↓
Commit
↓
Database