자바 ORM 표준 JPA 프로그래밍(인프런)

Ch03. 영속성 관리(내부 동작 방식) - 영속성 컨텍스트

webmaster 2021. 12. 9. 09:31
728x90

EntityManagerFactory와 EntityManager

  • EntityManagerFactory에서 고객의 요청이 올 때마다 Entitymanager를 준다.
  • Entitymanager가 DB와 커넥션을 발생시켜 연결한다.
  • 영속성 컨택스트
    • JPA를 이해하는데 가장 중요한 용어
    • “엔티티를 영구 저장하는 환경”이라는 뜻
    • EntityManager.persist(entity);
    • 엔티티 매니저를 통해서 영속성 콘텍스트에 접근

엔티티의 생명주기

엔티티의 생명주기

비영속 (new/transient)

비영속 상태

  • 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
  • JPA와 연관 없이 객체만 생성한다.

영속 (managed) 

영속 상태

  • 영속성 컨텍스트에 관리되는 상태
  • 영속성 컨택스트에 영속된다고 바로 쿼리가 실행되는 것이 아니다.
  • 쿼리는 트렌젝션이 커밋 시점에 발생된다.

준영속 (detached) , 삭제 (removed) 

//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);
//객체를 삭제한 상태(삭제)
em.remove(member);
  • 영속성 컨텍스트에 저장되었다가 분리된 상태 
  • 삭제된 상태

영속성 콘텍스트의 이점

1차 캐시

1차 캐시 기능을 사용할 수 있다.
1차 캐시에서 조회
DB에서의 조회
1차 캐시에서 조회하기 때문에 find를 실행하여도 Select 쿼리가 실행되지 않는다.
초기 조회에 영속성 컨택스트에 101 ID가 없기 때문에, DB에서 조회한 뒤, 1차 캐시에 등록한 뒤, 후에 해당 아이디로 조회 시 1차 캐시에서 반환한다.

  • 영속화가 되면 Key가 PK, 값이 Member객체로 테이블로 1차 캐시에 저장한다.
  • 1차 캐시를 통해 같은 트랜잭션 내에서의 같은 ID를 통한 조회는 1차 캐시에서 값을 꺼내 돌려준다(실제 DB에 쿼리 X)
  • 1차 캐시에 값이 없다면 DB에 조회를 해서 Data를 가지고 와, 1차 캐시에 등록해주고, 반환해준다. 1차케시 없는 데이터 조회

동일성(identity) 보장

1차 캐시로 반복 가능한 읽기(REPEATABLE READ) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공

동일성 보장

  • 결과는 TRUE
  • 해당 동일성이 가능한 이유가 1차 캐시가 있기 때문이다.

트랜잭션을 지원하는 쓰기 지연 (transactional write-behind) 

JPA는 Insert쿼리를 쌓아두다가 commit 시점에 데이터베이스에 Insert SQL을 실행시킨다.

실제 Commit 시점에 InsertSQL을 전송
실제 Commit직전까지 쓰기 지연 SQL 저장소에 SQL을 저장한다.
트랜잭션 커밋 시점에 실제 flush가 발생하고, 쓰기 지연 SQL 저장소에 저장된 SQL이 실제 DB에 실행

변경 감지(Dirty Checking)

JPA의 변경감지

  • 영속성 컨택스트에 들어온 순간을 스냅샷을 찍어 둔 뒤, flush() 시점에 변경된 부분을 찾아 변경되었다면 updateSQL을 실행시켜 준다.

지연 로딩(Lazy Loading)

  • 엔티티를 실제 사용할 때까지 DB 조회를 최대한 미룰 수 있다
728x90