티스토리 뷰

Spring JPA 영속성 컨텍스트

EntityManager

영속성 컨텍스트

엔티티 생명주기

  • 영속성 컨텍스트란, 애플리케이션과 데이터베이스 사이에서 엔티티를 저장하고 관리하는 논리적인 환경이다.
  • EntityManager가 생성되면 논리적 개념인 영속성 컨텍스트가 1:1로 생성되고 EntityManager를 통해 접근할 수 있게 된다.
  • 처음에 객체를 new 메서드로 생성을 하면 영속성 컨텍스트와 관계가 없는 비영속 상태이다.
  • entitymanager를 생성하고 persist(객체) 를 하면 영속 상태가 되면서 영속성 컨텍스트 에 객체가 올라간다. 이 때 DB에 저장되는 것이 아니라 커밋이나 flush를 해야 DB에 저장되고 그 전까지는 영속성 컨텍스트에만 존재한다.
  • 영속성 컨텍스트의 주요 역할로는 1차 캐시쓰기 지연 저장소 , 그리고 변경감지 가 있다.
  • 먼저 1차 캐시의 역할로는, 조회 요청 시 JPA는 영속성 컨텍스트의 1차 캐시를 먼저 확인하고 있다면 DB까지 가지 않고 바로 반환을 하고, 없다면 DB를 조회해서 값을 가져온 후 1차 캐시에 저장을 한다.
  • 그리고 1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 DB가 아닌 애플리케이션 차원에서 제공하여 엔티티의 동일성을 보장한다.
  • 그리고 SQL을 생성할 때마다 DB에 전송하는 것이 아니라 쓰기 지연 저장소 에 모아두었다가 트랜잭션이 커밋되는 순간 한 번에 DB에 전송한다.
  • 또한 JPA는 1차 캐시에 저장을 할 때 저장되는 시점의 스냅샷 또한 보관을 하는데 커밋되는 시점엔티티와 스냅샷을 비교 하여 변경이 있다면 이를 감지하여 update 쿼리를 실행한다.

트랜잭션 격리 수준

  • 트랜잭션에서 일관성 없는 데이터를 허용하는 수준
  • 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 막는데(locking) 무조건적인 locking은 DB의 성능을 떨어지게 한다. 따라서 적정한 locking 방법을 적용하는 것이 필요!
  • 종류
    • Read Uncommitted(레벨 0)
      • 트랜잭션이 처리중이거나 아직 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
      • DB의 일관성을 유지하는 것이 불가능
    • Read Committed(레벨 1)
      • Commit이 이루어진 데이터만 접근 가능
      • 트랜잭션이 수행되는 동안 다른 트랜잭션은 대기
    • Repeatable Read(레벨 2)
      • 트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장함
      • 다른 사용자는 트랜잭션 영역에 해당되는 데이터 수정 불가능
    • Serializable(레벨 3)
      • 완벽한 읽기 읽관성 모드
      • 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력 불가능

연관자료

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함