티스토리 뷰
영속성?
JPA에서의 영속성 이란, Entity를 영구 저장하는 어떤 환경을 뜻한다.
이전 포스팅에서 살펴봤던 EntityManager.persist(entity) 라는 것은 DB에 저장한다는 것이 아니라, 영속성 컨텍스트를 통해서 Entity를 영속화하는 것. 즉, Entity를 영속성 컨텍스트에 저장하는 것이다.
영속성 컨텍스트는 논리적인 개념이고, EntityManager를 통해서 영속성 컨텍스트에 접근할 수 있다.
일반적으로 EntityManager를 생성하면 영속성 컨텍스트라는 어떤 공간이 생겨난다. (1:1 관계)
영속성의 생명주기
-
비영속 (transient)
Entity를 생성한 상태 (객체만 생성한 상태)
-
영속 (managed)
Entitymanger 안에 있는 영속성 컨텍스트를 통해서 Entity가 관리됨. (EntityManager.persist(Entity);)
영속 상태가 되었을 때, Insert 쿼리가 날아가는 것이 아니라 Commit 시점에 날아간다.
-
준영속
엔티티를 영속성 컨텍스트에서 분리함. (EntityManager.detach(Entity);)
-
비영속
DB에서 Entity를 삭제 (EntityManager.remove(Entity);)
영속성 컨텍스트의 이점
1. Entity 조회, 1차 캐시
EntityManager.persist를 사용하면 영속성 컨텍스트 안에 해당하는 객체가 저장된다. (1차 캐시)
이때, Key - Value 형태로 저장되는데 Key는 Entity의 PK로 지정한 필드, 그리고 value 값은 Entity가 저장된다.
Key | Value |
ID (PK 필드) | Entity |
그래서 EntityManager.find를 하게 되면 DB를 조회하지 않고 이 1차 캐시를 우선적으로 조회한다. 그런데 만약, 이 1차 캐시에 그 값이 없는 경우에는 DB를 조회하여 1차캐시에 저장하고, 값을 반환한다.
그러나, EntityManager는 어떤 하나의 트랜잭션 레벨에만 존재하기 때문에, 1차 캐시가 존재하는 기간은 실제로 굉장히 짧아 성능적으로 큰 이점을 얻지는 못한다.
em.persist(entity)
em.find(entity.id)
// -> 조회 쿼리가 나가지 않음.
//---------------------------------
em.find(entity)
// -> 조회쿼리가 나감
2. 동일성 보장
같은 id값을 조회하여 각각 다른 변수에 담은 뒤에 " == " 비교를 할 경우 true를 반환한다.
마치 Java의 Collection에서 값을 꺼내와 비교하는 것과 동일하다.
3. 트랜잭션을 지원하는 쓰기 지연
Entity를 영속성에 등록하게 되면, 1차 캐시에 올라가면서 Insert Query를 작성하고 저장한다.
그리고 Commit을 하면 그제야를 날린다.
4. 변경 감지 (DirtyChecking)
값을 조회해서 객체를 받은 후, set을 통해 값을 변경하면 알아서 update 쿼리가 나간다.
최초로 영속성 컨텍스트에 들어온 값을 스냅샷으로 만들어 두고, 커밋이 되는 시점에 값을 모두 비교하고 update 쿼리를 날린다.
flush와 detach
앞에서 언급했던 영속성의 생명주기를 직접 관리할 수도 있다.
-
flush
영속성 컨텍스트의 변경 내용을 1차 캐시는데이터 베이스에 반영한다.
즉, 영속성 컨텍스트를 비우는 게 아니라, 데이터베이스에 동기화한다.
기본적으로 Commit 시점 혹은 JPQL 쿼리 실행 시점에 자동으로 flush가 진행되지만,
EntityManager.flush() 를 사용하여 직접 실행시킬 수 있다.
- detach
detach를 사용하면 영속 상태의 Entity를 영속성 컨텍스트에서 분리하는 방법이다.
앞서 소개한 EntityManager.detach(Entiy)를 사용하면 특정 Entiy 하나만 준영속 상태로 변경할 수 있지만,
EntityManger.clear() 혹은 EntityManger.close() 를 하게 되면 모든 Entity를 준영속 상태로 변경한다.
'프로그래밍 > JPA' 카테고리의 다른 글
양방향 연관관계 매핑 (0) | 2021.04.27 |
---|---|
단방향 연관관계 매핑 (0) | 2021.04.27 |
Entity 매핑하기 (0) | 2021.04.26 |
Hello JPA (0) | 2021.04.21 |
왜 JPA인가? (0) | 2021.04.21 |