영속성 컨텍스트
JPA 동작 과정을 이해하려면 영속성 컨텍스트에 대한 이해가 필요하다.
영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 뜻이다.
또한 논리적인 개념이며 눈에 보이지 않는다.
우리는 EntityManager를 통해 영속성 컨텍스트에 접근할 수 있다.
엔티티의 생명주기
엔티티의 생명주기는 다음과 같다.
비영속 (new/transient)
영속성 컨텍스트와 전혀 관계가 없는 객체를 새로 생성한 상태
영속 (managed)
영속성 컨텍스트에 관리되는 상태
준영속 (detached)
영속성 컨텍스트에 저장되었다가 분리된 상태
삭제 (removed)
삭제된 상태
영속

객체 생성 후 객체를 영속 컨텍스트에 저장한 상태이다.
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(member);
이렇게 EntityManager의 persist()를 사용하여 저장한다.
persist()를 호출한다고 해서 바로 DB에 저장이 되는건 아니니 유의하자!
영속 컨텍스트 구조
1차 캐시
1차 캐시는 Entity 영속 시 Entity의 PK와 Entity를 저장한다.
이후 Entity 조회를 할 때 1차적으로 1차 캐시에서 조회를 한 후 1차 캐시에 없다면 그 떄 DB에서 조회를 한 후 1차 캐시에 저장하고 반환을 해준다.
이로써 영속 엔티티의 동일성을 보장해준다.
쓰기 지연 SQL 저장소
아까 persist()를 호출한다고 해서 바로 DB에 저장되는게 아니라고 했다.
엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 하기 때문에 쓰기 지연 SQL 저장소에 저장해놨다가
transaction.commit()을 호출하면 flush가 실행되며 DB에 저장이 된다.
이로써 트랜잭션을 지원하는 쓰기 지연이 가능하다.
스냅샷
영속 Entity의 데이터를 수정할 때는 수정 후 persist()를 호출해 줄 필요가 없다.
memberA.setUsername("hi");
memberA.setAge(10);
단순히 이렇게 persist() 나 따로 update를 해주는 메서드가 없어도 된다!
어떻게 이게 가능할까?
바로 스냅샷 덕분인데 스냅샷은 Entity가 처음 만들어졌을때 저장을 해두고 1차 캐시의 현재 Entity와 비교를 한다.
만약 값이 달라졌다면 UPDATE SQL 쿼리를 생성해 쓰기 지연 SQL 저장소에 보내고 flush를 실행해 DB에 반영을 해준다.
위의 그림을 보면 더 잘 이해가 될 것이다.
이로써 자동으로 변경을 감지해주는 이점까지 있는 것이다!
Flush
flush는 영속성 컨텍스트의 변경내용을 데이터베이스에 반영해주는 것이다.
(영속성 컨텍스트를 비우는 것은 아니다)
트랜잭션 작업 단위를 위해 사용한다.
Flush는 다음과 같을 때 발생한다.
1. 변경 감지
2. 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록할 때
3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송할 때(등록, 수정, 삭제 쿼리)
영속성 컨텍스트를 flush 하는 방법은 다음과 같다.
직접 호출
- em.flush()
자동 호출
- 트랜잭션 커밋
- JPQL 쿼리 실행 (쿼리를 실행하기 전에 flush를 DB에 선 적용을 해줘야 해야 문제가 발생하지 않음)
준영속
영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)되는것을 말하고 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.
준영속 상태로 만드는 방법은 다음과 같다.
- em.detach(entity) - 특정 엔티티만 준영속 상태로 전환
- em.clear() - 영속성 컨텍스트를 완전히 초기화
- em.close() - 영속성 컨텍스트를 종료
'Back-end > Java&Spring' 카테고리의 다른 글
Spring Boot - 핵심 기능 (0) | 2024.10.02 |
---|---|
Spring JPA (3) - 매핑 (0) | 2024.09.29 |
Spring JPA (1) - JPA 이해 (0) | 2024.09.23 |
Spring JDBC (4) - 예외 처리 (2) | 2024.09.12 |
Spring JDBC (3) - 트랜잭션 (0) | 2024.09.11 |