영속성 컨텍스트 정리

seungho choi·2022년 5월 18일
0

영속성 컨텍스트는 엔티티매니저가 엔티티를 관리하는 환경을 영속성 컨텍스트라고 한다.

엔티티 생명주기

엔티티에는 4가지 상태가 존재한다. 상태에 따라 영속성 컨텍스트가 관리하는 방식을 다르게 한다.

  • 비영속(new/transient) : 영속성 컨텍스와 관계 없는 순수 자바 객체인 상태다. 그냥 new 연산자로 엔티티를 만들면 비영속 상태이다.

  • 영속(managed) : 영속성 컨텍스트가 관리하고 있는 상태를 말한다. EntityManagerpersistfind 를 하면 영속 상태가 된다

  • 준영속(detached) : 영속성 컨텍스트가 관리하고 있다가 중간에 필요에 의해 분리된 상태를 말한다. EntityManagerdetach를 하면 된다.

  • 삭제(removed) : 삭제된 엔티티이다 EntityMangerremove를 하면 삭제 상태가 되고 실제 데이터베이스에서 삭제 된다.

영속성 컨텍스트의 특징

  • 영속성 컨텍스트는 엔티티를 식별자로 구분한다. 영속 상태는 식별자 값이 반드시 있어야 한다. (사실 식별자가 있는 사물을 엔티티라고 한다)

  • 1차 캐시

    • 영속성 컨텍스트는 내부에 Map 과 같은 캐시를 가지고 있는데 이것을 1차 캐시라고 한다. 엔티티의 @Id 를 이용해 식별한다.
    • 1차 캐시의 조회에 있어 장점이 있다. 엔티티매니저를 통해 조회를 하면 먼저 1차 캐시에서 @Id 와 같은 엔티티를 찾는다. 만약 있으면 1차 캐시에 있는 엔티티를 반환한다. 1차 캐시에 없으면 그때서 데이터베이스에서 엔티티를 조회를 한다.
  • 변경 감지 (dirty checking)

    • 처음 엔티티가 영속화 되었을 때 최초 스냅샷을 저장하는데 flush 시점에 최초 스냅샷과 변경된 엔티티를 비교해 수정 SQL을 보내주는 걸 말한다.
  • 쓰기 지연

    • 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 변경에 관련된 쿼리들을 쓰기 지연 저장소에 모아 커밋 시점에 데이터베이스에 보내는걸 쓰기 지연이라고 한다.
    • 엔티티 매니저의 flush를 이용하면 쓰기 지연 저장소에 있는 SQL를 원하는 시점에 보낼 수 있다.

플러시 (flush)

플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 플러시를 실행하면 다음과 같은 일이 일어난다.

  1. 변경 감지가 동작해 영속성 컨텍스트에 있는 모든 엔티티의 최초 스냅샷과 비교해 수정된 엔티티를 찾는다. 수정된 엔티티는 수정 쿼리를 만들어 쓰기 지연 저장소에 등록된다.

  2. 쓰기 지연 SQL은 데이터베이스 전송한다.

언제 호출 될까?

  • 엔티티 매니저의 flush 메소드를 호출하면 영속성 컨텍스트를 강제로 플러시 할 수 있다.

  • 트랜잭션 커밋 시 플러시 자동 호출 한다.

  • JPQL 쿼리 실행시 플러시 자동 호출 한다.

0개의 댓글