영속성 컨텍스트(Persistence Context)란?
- JPA를 이해하는데 가장 중요한 용어 중 하나로 엔티티를 영구 저장하는 환경이라는 뜻이다.
- 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할이다.
- 엔티티 매니저(em)를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
엔티티의 생명주기
- New → 비영속 상태: 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다. 객체를 생성한 상태라고 보면 된다.
Member member = new Member();
member.setId("Id");
member.setUsername("name");
- Managed → 영속 상태: 영속성 컨텍스트에 저장된 상태이다. 엔티티매니저를 통해 persist()로 저장을 한 상태라고 보면 된다.
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(member);
- Detached → 준영속 상태: 영속성 컨텍스트에 저장되어 있는 객체를 분리한 상태이다. 엔티티매니저를 통해 detach()한 상태.
em.detach(member);
- Removed → 삭제 상태: 영속성 컨텍스트에서 객체를 삭제한 상태이다. 엔티티매니저를 통해 remove()한 상태이다.
em.remove(member);
영속성 컨텍스트의 특징
- 영속성 컨텍스트는 엔티티를 식별자 값으로 구별한다. 영속 상태일때는 반드시 식별자 값이 있어야 한다.
- JPA는 트랜잭션을 커밋하는 순간이나 em.flush()를 하거나 JPQL 쿼리를 실행하면 영속성 컨텍스트에서 새로 저장된 엔티티를 파악하여 데이터베이스에 반영한다. → 플러시
- 플러시는 새로 저장된 엔티티를 파악할 뿐만 아니라 변경 내용을 데이터베이스의 동기화 시켜준다.
- 변경감지를 하여 스냅샷과 비교하여 수정된 엔티티를 찾는다.
- 수정된 엔티티에 대한 쿼리문을 만들고 데이터베이스에 SQL 저장소에 등록한다.
- 쓰기지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다.
장점:
- 1차캐시
- 영속성 컨텍스트에는 1차 캐시가 존재한다. 영속상태로 존재하는 엔티티를 1차 캐시에 저장하기에 엔티티를 조회할 때 1차 캐시에 그 엔티티가 존재한다면 데이터베이스를 찾아보지 않아도 된다.
- 영속 엔티티의 동일성 보장
-
동일성 vs 동등성
동일성: 주소값까지 완전히 같은 객체. ==으로 판별한다.
동등성: 주소값이 다르지만 같은 정보를 가지고 있는 객체. equals()로 판별한다.
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a==b)
-
영속 엔티티에서 꺼낸 같은 데이터를 ==연산자를 통해 비교하면 true가 나온다.
-
이는 영속 엔티티가 동일성을 보장한다는 점을 알 수 있다.
- 쓰기지연
- em.persist를 해서 객체를 저장해도 DB에 바로 Insert를 하지 않는다.
- 쿼리들을 모았다가 플러시를 할 때 쿼리를 한번에 모두 날린다.
- 이를 쓰기지연이라 한다.
- 쓰기지연이 없으면 쿼리 하나마다 매번 DB에 연결하고 해제를 해야하고 테이블에 계속 접근해야 하는데 이때 시간이 너무 걸린다. 쓰기지연은 이 시간을 단축시켜준다.
- 변경감지(더티체킹)
- 영속성 컨텍스트에 있는 엔티티를 수정하면 알아서 변경을 감지하여 수정 쿼리를 생성해준다.
- 물론 이 수정쿼리도 쓰기지연이 될 수 있다.
[JPA] 영속성 컨텍스트란?
[JPA] 영속성 컨텍스트(Persistence Context)란? - 개넘 정리 및 사용법
JPA 영속성 컨텍스트란?
아직 저와 심리적 거리가 먼 🤨 영속성 컨텍스트와 가까워질 수 있는 시간이었습니다.