TIL 2023-11-08 영속성 컨텍스트, Jpa의 트랜잭션

2023. 11. 8. 22:06TIL
목차
  1. 영속성
  2. 트랜잭션
  3. JPA의 트랜잭션
  4. 영속성 컨텍스트의 기능
  5. 1차 캐시
  6. 쓰기 지연 저장소

 

영속성

객체의 생명이나 공간을 자유롭게 유지하고 이동할 수 있는 객체의 성질
 
Entity 객체들은 영속성 컨텍스트에 의해 관리가 된다.
 
Entity Manager ( = EM )
Entity Manager Factory ( = EMF )
글쓰는데 편의를 위해 위와 같이 줄여서 부르겠다.
 
EM은 Entity를 저장, 조회, 수정, 삭제 할 수 있다.
 
EM은 EMF를 통해서 생성이 가능하다.
 
EMF는 기본적으로 DB 하나에 하나만 생성되고 애플리케이션이 동작하는 동안 사용된다.
 
EMF는 persistence.xml을 읽고 이 정보를 토대로 만들어진다.
 

트랜잭션

DB 데이터들의 무결성과 정합성을 유지하기 위한 하나의 논리적 개념
 
가장 큰 특징은 여러개의 SQL이 하나의 트랜잭션에 포함될 수 있다는 것이다.
 
Commit 하기 전 까지 트랜잭션에 SQL을 보관해뒀다가
Commit 하면 DB에 반영한다.
보관 중이나, 커밋할 때 하나라도 오류가 나면 rollback이 된다.
 

JPA의 트랜잭션

영속성 컨텍스트 + 쓰기 지연 저장소
 
 

영속성 컨텍스트의 기능

 

1차 캐시

  • 영속성 컨텍스트는 내부적으로 1차 캐시를 가지고 있다.
    우리가 저장하는 Entity 객체들이 이 1차 캐시에 저장된다.
  • 이 캐시 저장소는 Map자료 구조 형태로 되어 있다.
    • Key - @로 매핑한 기본키(PK), 즉 식별자값 저장
    • Value - Entity, 즉 객체 저장
  • 영속성 컨텍스트는 캐시 저장소의 Key에 저장한 식별자 값을 사용하여 Entity 객체를 구분하고 관리한다.

 

Entity 저장

여기서 EM이 영속성 컨텍스트에 객체를 저장하려 한다.

 
영속성 컨텍(택X)스트라는 것을 이미지 다 찍고 나서야 알았다.. 다시 하긴 상당히 번거로워서.. 이해하고 봐주길 바란다..

persist(Entity) -> 1차 캐시에 Entity Key 및 Value 등록 / Entity 초기 값도 등록 ->DB에 commit

 
 

Entity 조회

find를 보낸다 -> 1차 캐시에 해당 ID의 Entity가 없으면 -> DB에 Select문을 보낸다
그 후 이렇게 1차 캐시에 등록한다.

  • 이미 영속성 컨텍스트의 1차 캐시에 있으면 DB에 Select문을 보내지 않는다.
  • 장점
    1. 데이터 베이스 조회 횟수를 줄인다 - (1차 캐시에 등록이 되어있으면, DB를 조회 안해도 된다.)
    2. 객체 동일성을 보장해준다.

 

객체 동일성?

Entity 두 객체가 동일한 객체 (DB에선 Row를 의미) 를 가지고 있다면
객체를 == 비교 연산자로 비교 했을 때 True가 나온다.
 
 

Entity 삭제

조회 까지 마친 상태에서..
remove를 하면 1차 캐시의 해당 객체가 Deleted 상태로 변경되고 commit하면 DB에 반영된다.

 

쓰기 지연 저장소

DB에 대한 변경 사항들을 즉시 DB에 전달하지 않고 영속성 컨텍스트 내부의 쓰기 지연 저장소에 쿼리 문을 쌓아뒀다가
flush() 메서드가 나오면 쿼리를 한꺼번에 보낸다.

  • flush() 메서드
    • flush 메서드가 호출되면 쓰기 지연 저장소에 있는 쿼리문을 DB에 전달한다.
      • commit 메서드에 flush 메서드가 내장되어 있다.

변경감지

JPA에서는 영속선 컨텍스트에 Entity가 저장 될 때 그 상태를 스냅샷을 저장한다.
이 스냅샷은 Entity의 최초 상태 (Loaded State)를 나타낸다.

  1. commit 시 flush가 호출
  2. 현재 상태와 최초 상태 비교
  3. 변경 내용이 있다면 SQL 생성
    1. 없다면 미생성
  4. 쓰기 지연 저장소에 SQL 저장
  5. 쓰기 지연 저장소에 있는 모든 SQL을 DB에 요청
  6. DB에 트랜잭션이 commit 되면서 반영된다.
저작자표시 (새창열림)

'TIL' 카테고리의 다른 글

TIL 2023-11-10 HttpServlet 및 쿠키 처리  (0) 2023.11.10
TIL 2023-11-09 nullable = false 설정 했는데도 빈 값이 들어갈 때  (0) 2023.11.09
TIL 2023-11-07 Bean과 IoC 컨테이너  (1) 2023.11.07
TIL 2023-11-06 개인프로젝트 완성 및 3 레이어 아키텍처  (0) 2023.11.06
TIL 2023-11-03 다형성 업 캐스팅 다운 캐스팅 참조 변수 완벽 이해  (0) 2023.11.03
  1. 영속성
  2. 트랜잭션
  3. JPA의 트랜잭션
  4. 영속성 컨텍스트의 기능
  5. 1차 캐시
  6. 쓰기 지연 저장소
'TIL' 카테고리의 다른 글
  • TIL 2023-11-10 HttpServlet 및 쿠키 처리
  • TIL 2023-11-09 nullable = false 설정 했는데도 빈 값이 들어갈 때
  • TIL 2023-11-07 Bean과 IoC 컨테이너
  • TIL 2023-11-06 개인프로젝트 완성 및 3 레이어 아키텍처
wonow_
wonow_
꾸준히 성장하는 개발자 WONOW 입니다. 🤗
wonow_
wonow_
wonow_
전체
오늘
어제
  • 분류 전체보기
    • Language
      • JAVA
    • TIL
    • 코딩테스트
      • 프로그래머스
      • 백준
    • 프로젝트
      • JAVA
      • Spring
    • 기타
    • ERROR
      • Spring
    • CS
      • 알고리즘
      • DB
      • Kafka
    • 잡담
    • 활동
      • 척척박사

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 공부열심히하자
  • 홀짝 구분하기
  • 오블완
  • 프로그래머스
  • 문자열 돌리기
  • 티스토리 꾸미기
  • 문자열 붙여서 출력하기
  • 나는바봉가봉가
  • 티스토리챌린지

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
wonow_
TIL 2023-11-08 영속성 컨텍스트, Jpa의 트랜잭션
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.