H E L L O    W O R L D !
...

0명

총 방문자 수

...

51 개

총 포스팅

JPA - 영속성 컨텍스트

2024. 8. 22. 20:49·Spring
목차
  1. 정의
  2. 상태
  3. 특징
  4. 영속성 컨텍스트의 식별자 값
  5. 영속성 컨텍스트와 데이터베이스 저장
  6. 영속성 컨텍스트의 장점

정의

영속성 컨텍스트란 엔티티를 영구 저장하는 환경을 말한다.

상태

영속성 컨텍스트의 상태는 비영속, 영속, 준영속, 삭제 네 가지가 있다.

비영속

영속성 컨텍스트와 전혀 관계가 없는 상태


      
Member member = new Member();
member.setName("이름");

영속

영속성 컨텍스트에 관리되는 상태


      
em.getTransaction().begin() // em: EntityManager
Member member = new Member();
member.setName("이름");
em.persit(member); // 이 때 영속성 컨텍스트의 1차 캐시에 저장된다.

준영속

영속성 컨텍스트에 저장되었다가 분리된 상태


      
Member member = new Member();
member.setName("이름");
em.persist(member); // id = 1로 저장
Member member2 = new Member3();
member3.setId(member.getId()); // 이 때에도 준영속 상태라고 한다.
em.detach(member); // 영속성 컨텍스트에서 분리

삭제

삭제된 상태


      
em.remove(member); // 삭제

특징

영속성 컨텍스트의 주요 특징을 알아보자.

영속성 컨텍스트의 식별자 값

영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. 따라서 영속 상태의 객체는 식별자 값이 반드시 존재해야 한다.

엔티티 클래스에서 @Id로 지정한 필드가 식별자 값이 된다.

영속성 컨텍스트와 데이터베이스 저장

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

flush를 한다고해서 1차 캐시가 비워지지 않는다. 1차 캐시를 비우려면 clear를 호출해야 한다.


      
Member member = new Member();
member.setName("테스트");
member.setAge(22);
em.persist(member); // 영속 상태가 될 뿐 SQL이 날아가지 않는다.
em.flush(); // 이 때 DB에 쿼리를 날린다.

영속성 컨텍스트의 장점

영속성 컨텍스트의 장점은 다음과 같다.

  • 1차 캐시
  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연
  • 변경 감지
  • 지연 로딩

1차 캐시

영속성 컨텍스트 내부에는 영속 상태의 엔티티를 저장하는 1차 캐시라 불리는 저장소가 있다. 1차 캐시의 키는 식별자 값이고 값은 엔티티의 인스턴스이다.

동일성 보장

영속성 컨텍스트는 엔티티의 동일성을 보장해준다.

 
 
동일성과 동등성 비교

동일성은 주소값을 비교하는 것이고, 동등성은 그 내부의 값이 동등한지 비교하는 것이다.


      
Member member = new Member();
member.setName("test");
em.persist(member);
Member find = em.find(Member.class, 1);
// 여기서 find와 member는 동일하다.
// find.equals(member) -> true

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

find()를 사용해 엔티티를 저장해도 바로 INSERT 쿼리가 DB에 보내지지 않는다. 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 쓰기 지연 SQL 저장소라는 곳에 모아둔다. 나중에 flush가 될 때 모아둔 쿼리를 모두 DB에 날리며 이를 쓰기 지연이라고 한다.

변경 감지

자세한 내용은 여기를 참고하자.

간단하게 정리하면 영속성 컨텍스트 내의 스냅샷과 엔티티를 비교하여 변경된 엔티티가 있으면 UPDATE 쿼리를 날린다.

지연 로딩

연관 관계가 매핑되어 있는 엔티티를 조회 시 우선 프록시 객체를 반환하고, 실제로 필요할 때 쿼리를 날려 가져오는 기능이다.

'Spring' 카테고리의 다른 글

JPA - 영속성 컨텍스트의 변경 감지와 병합  (0) 2024.08.22
  1. 정의
  2. 상태
  3. 특징
  4. 영속성 컨텍스트의 식별자 값
  5. 영속성 컨텍스트와 데이터베이스 저장
  6. 영속성 컨텍스트의 장점
'Spring' 카테고리의 다른 글
  • JPA - 영속성 컨텍스트의 변경 감지와 병합
nameless1004
nameless1004
nameless1004
Nameless
nameless1004
전체
오늘
어제
  • 분류 전체보기 (64)
    • DB (4)
      • MySQL (1)
    • Web (1)
    • CS (0)
    • 알고리즘 (1)
    • JAVA (4)
      • 문법 (0)
      • 디자인 패턴 (1)
    • Spring (2)
    • 트러블 슈팅 (6)
    • 부트캠프 (37)
      • Dev (25)
      • DB (6)
      • 데일리 미션 (5)
    • 도커 (3)
    • 사이드 프로젝트 (5)
      • 쿠키톡 (5)
    • 회사 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

스프링 슬랙
인터넷강의
레디스 센티넬 도커
스프링 슬랙 알림
DTO
부트캠프
자바 싱글톤 패턴
유데미
인프런
java
자바
DAO
슬랙
singleton
자바 싱글톤
스프링 레디스 센티넬
db
dbeaver
spring
레디스 센티넬
sql

최근 댓글

hELLO· Designed By정상우.v4.5.3
nameless1004
JPA - 영속성 컨텍스트

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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