노트코드
노트코드
노트코드

블로그 메뉴

  • 홈
  • 이력서
  • 이전 블로그
  • 글쓰기
  • 관리자페이지
  • 분류 전체보기 (57)
    • 코틀린 (2)
      • 실무 프로젝트로 배우는 Kotlin & Sprin.. (2)
    • JAVA (1)
      • 디자인패턴 (1)
      • 객체지향 5대원칙 (0)
    • SPRING (32)
      • JPA (11)
      • 스프링시큐리티 (1)
      • 스프링 (8)
      • QueryDsl (1)
      • 스프링배치 (11)
    • AZURE (0)
    • ETC (10)
      • MAVEN (0)
      • GIT (0)
      • ReMind (3)
      • Exception (1)
      • CS (6)
    • 책 (8)
      • 이것이 자바다 (8)

최근 글

최근 댓글

태그

  • 스프링
  • JPA
전체 방문자
오늘
어제
hELLO · Designed By 정상우.
노트코드

노트코드

ETC/ReMind

[JPA] 영속성 컨텍스트

2022. 2. 8. 00:35
엔티티를 영구 저장하는 환경

엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

 

특징:

- 영속성 컨텍스트는 엔티티를 식별자 값(@Id로 테이블의 기본 키와 매핑한 값)이 없으면 예외가 발생한다.
  영속 상태는 식별자 값이 반드시 있어야 한다.

- JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영하는데,
  이것을 플러시라고 한다.

 

장점:

- 1차 캐시 :

   영속성 컨텍스트는 내부에 캐시를 가지고 있고, 이것을 1차 캐시라고 한다.

   영속 상태의 엔티티는 모두 이곳에 키는 @Id로 매핑하고, 값은 엔티티 인스턴트 형태로 저장된다. 

1. 조회가 발생시, 1차 캐시에서 식별자 값으로 엔티티를 찾는다. 만약 엔티티가 있으면 데이터베이스를 조회하지
   않고 메모리에 있는 1차 캐시에서 엔티티를 조회한다.
2. 없으면 데이터베이스에서 조회해서 엔티티를 생성하고, 1차 캐시에 저장한 후에 영속 상태의 엔티티를 반환

이로인해 1차캐시에 있는 엔티티를 조회하면 매모리에서 바로 불러오기때문에 성능상 이점을 누릴 수 있다.

 

- 동일성 보장:

   영속성 컨텍스트는 1차 캐시에 있는 같은 엔티티를 반환함, 따라서 둘은 같은 인스턴스다.

동일성 : 실제 인스턴스가 같다. 따라서 참조 값을 비교하는 == 비교의 값이 같다
동등성 : 실제 인스턴스는 다를 수 있지만 인스턴스가 가지고 있는 값이 같다

- 트랜잭션을 지원하는 쓰기 지연:

   엔티티 매니저는 트랜잭션을 커밋하기 직전까지 데이터베이스에 엔티티를 저장하지 않고 내부 쿼리 저장소에 쿼리를
   차곡차곡 모아둠, 그리고 트랜잭션을 커밋할 때 모아둔 쿼리를 데이터베이스에 보내는데, 이것을 트랜잭션을 지원하는

   쓰기 지연이라 한다.

- 변경 감지:

    엔티티의 변경사항을 데이터베이스에 자동으로 반영하는 기능으로 영속성 컨텍스트가 관리하는 영속 상태의 엔티티

    만 적용된다.

1. 트랜잭션을 커밋하면 엔티티 매니저 내부에서 먼저 플러시가 호출된다.
2. 엔티티와 스냅샷을 비교해서 변경된 엔티티를 찾는다.
3. 변경된 엔티티가 있으면 수정 쿼리를 생성해서 쓰기 지여 SQL저장소에 보낸다.
4. 쓰기 지연 저장소의 SQL을 데이터베이스에 보낸다.
5. 데이터베이스 트랜잭션을 컴시한다.

- 지연 로딩

'ETC > ReMind' 카테고리의 다른 글

[GC] GC  (0) 2022.02.14
[JPA] 엔티티의 생명주기  (0) 2022.02.08
    'ETC/ReMind' 카테고리의 다른 글
    • [GC] GC
    • [JPA] 엔티티의 생명주기
    노트코드
    노트코드
    노션 블로그에서 티스토리로 이전공사중

    티스토리툴바