Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

잡동사니를 모아두는 서랍장

영속성 컨텍스트와 1차 캐시 본문

SQL, JPA

영속성 컨텍스트와 1차 캐시

kingkk31 2020. 2. 13. 21:13

영속성 컨텍스트(Persistence Context)

  • 엔티티를 저장한다. Entity Manager를 생성할 때 만들어진다.
  • Entity Manager entity를 저장(persist()), 조회(find(), JPQL, QueryDSL)하면 엔티티 매니저는 이 엔티티를 영속성 컨텍스트에 보관 및 관리.
  • 엔티티 식별은 @Id 필드로 한다.
  • 쓰기 지연(영속성 컨텍스트 내부의 SQL 저장소에 쿼리를 저장해뒀다가 엔티티 매니저 commit 메소드 호출 시 DB에 반영(=flush)). 

참고) entity lifecycle

비영속

  • 엔티티가 영속성 컨텍스트와 관련이 없는 상태.
  • 생성되기만한 엔티티.

영속(managed)

  • 영속성 컨텍스트에 엔티티가 저장된 상태.
  • persist, find 호출 시.

준영속(detached)

  • 영속성 컨텍스트의 1차 캐시와 SQL 저장소의 쿼리들을 제거. 즉 엔티티 매니저가 해당 엔티티를 관리하지 않음.
  • 비영속이랑 거의 비슷하나 식별자 값이 존재한다는 차이가 있음.
  • detach, clear, close(clear는 영속성 컨텍스트를 초기화하는 거고 close는 아예 종료 시키는 거).

삭제(removed)

  • 영속성 컨텍스트에서 엔티티 제거 및 DB에서도 해당 객체가 삭제됨.
  • remove.

 

JPA 캐시

  • DB에 접근하는 시간을 줄이기 위해 데이터를 메모리에 캐싱해서 접근 횟수를 줄이기 위해 존재.
  • 1차 캐시(first level cache), 2차 캐시(second level cache) 두 종류가 있음.
  • 영속성 컨텍스트가 가지고 있는 캐시는 1차 캐시이다.

1차 캐시

  • 영속성 컨텍스트 내에 있다.
  • persist, find 호출 시 해당 엔티티는 영속되어 1차 캐시에 저장.
  • 메모리에 존재하는 map 구조key : @Id로 지정된 식별자, value : entity instance.
  • disable 불가능.
  • 트랜잭션 레벨 캐시로 global이 아니다. 공유가 가능한 글로벌한 캐시는 2차 캐시.

엔티티 조회(find )

  • 엔티티가 1차 캐시에 존재하지 않으면 DB에 직접 접속하고 엔티티를 1차 캐시에 저장한다.
  • 이후 조회는 1차 캐시의 엔티티를 반환(객체 동일성 보장).

엔티티 저장(persist )

  • 엔티티를 1차 캐시에 저장하고(이것만 되도 영속 상태임) SQL 저장소에 쿼리를 저장.
  • 이후 commit 호출 시 SQL 저장소의 쿼리가 DB로 전달됨. DB에 저장되며 flush.

변경 감지(dirty checking)

  • 엔티티 매니저는 update 같은 매소드가 없다. 1차 캐시에 존재하는 엔티티는 setter를 이용한 수정이 이뤄질 시 변경 감지가 일어난다.
  • 엔티티가 1차 캐시에 최초 저장 시 상태를 복사하여 같이 저장(스냅샷). 
  • flush(영속성 컨텍스트와 DB 사이의 동기화가 이뤄지는 시기) 시 현재 엔티티의 상태와 스냅샷을 비교.
  • commit() 호출 시 엔티티에 변경이 일어났다면 UPDATE 쿼리(모든 필드를 업데이트 하는 내용이라고 한다) SQL 저장소에 저장하여 저장된 다른 쿼리들과 함께 DB로 보낸다.

 

참고) 2차 캐시

  • JPA 구현체들이 어플리케이션 전체 범위의 캐시를 지원. 애플리케이션에서 공유하는 캐시(shared cache)로 애플리케이션이 종료되기전까지 유지된다.
  • 영속성 유닛 범위의 캐시. default disable이나 1차 캐시와 다르게 enable/disable 선택이 가능하다.
  • 1차 캐시에서 조회 후 없으면 2차 캐시에서 조회하고 없으면 DB 에서 조회한 후 2차 캐시에 보관한다.
  • 1차 캐시가 엔티티 객체를 그대로 반환한다면 2차 캐시는 복사본을 만들어 그 복사본을 반환.
  • 영속성 컨텍스트가 다르면 객체 동일성을 보장하지 않는다(find 했을 때 같은 객체가 아니다).

 


참고 자료

Comments