[Spring Data JPA] 영속성 컨텍스트

2023. 10. 14. 10:03·Web & Android/Spring Data JPA

영속성 컨텍스트

💡 엔티티를 영구 저장하는 환경, 가상의 DB 역할

엔티티 생명주기

  • 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
Member member = new Member();
member.setId("member1");
member.setUsername("홍길동");
  • 영속(managed) : 영속성 컨텍스트에 관리되는 상태
EntityManager em = EntityManagerFactory.createEntityManager();
em.getTransaction().begin();

Member member = new Member();
member.setId("member1");
member.setUsername("홍길동");

// 객체를 영속성 컨텍스트에 저장(영속)
em.persist(member);
  • 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
 //member 엔티티를 영속성 컨텍스트에서 분리(준영속)
em.detach(member);
  • 삭제(remove) : 삭제된 상태
 // 객체를 삭제한 상태(삭제)
em.remove(member);

영속성 상태의 장점

1. 1차 캐시(영속성 컨텍스트)

  • 영속성 컨텍스트 내부에 있음
  • 엔티티 매니저로 조회하거나 변경하는 모든 엔티티는 1차 캐시에 저장됨
  • 같은 트랜잭션 내에서 엔티티를 캐싱하고 재사용할 때 사용
  • Map<KEY, VALUE>로 저장. Find() 메소드 호출 시 영속성 컨텍스트의 1차 캐시 조회
  • 끄고 켤 수 있는 옵션이 아님

2차 캐시

  • 1차 캐시를 여러 곳에서 하면 데이터베이스 접근 횟수를 획기적으로 줄이지 못하니까 2차 캐시를 사용
  • 애플리케이션 전체 또는 여러 트랜잭션 간에 사용
  • 애플리케이션을 종료할 때까지 유지됨
  • 엔티티 매니저를 통해 데이터를 조회할 때 우선 2차 캐시에서 찾고 없으면 데이터베이스에서 찾음
  • 객체를 직접 반환하지 않고 복사본을 만들어서 반환함

2. 동일성 보장

Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");

System.out.println(a==b) // true

3. 쓰기 지연

  • 쓰기 지연 SQL 저장소에 SQL을 쌓아두고 트랜잭션 커밋 시점에 저장된 SQL 문 flush하여 데이터베이스 반영

4. 변경 감지

  • 1차 캐시에 데이터베이스에서 처음 불러온 엔티티의 스냅샷 저장 및 커밋 시점에 변경 내용을 반영. 즉, update문을 호출하지 않아도 됨

5. 지연 로딩

  • 연관 관계 매핑되어 있는 엔티티를 조회 시 우선 프록시 객체를 반환하고, 실제로 필요할 때 쿼리를 날려 가져오는 기SMD
  • 필요할 때 데이터를 가져오는 기능
저작자표시 비영리 변경금지 (새창열림)

'Web & Android > Spring Data JPA' 카테고리의 다른 글

[Spring Data JPA] Querydsl  (1) 2023.10.15
[Spring Data JPA] @Query  (0) 2023.10.14
[Spring Data JPA] JPA  (0) 2023.10.14
[Spring Data JPA] QueryMethod  (0) 2023.10.14
[Spring Data JPA] ORM & SQL Mapper  (0) 2023.10.14
'Web & Android/Spring Data JPA' 카테고리의 다른 글
  • [Spring Data JPA] @Query
  • [Spring Data JPA] JPA
  • [Spring Data JPA] QueryMethod
  • [Spring Data JPA] ORM & SQL Mapper
woojin._.
woojin._.
여러가지 개발을 해보며 발생하는 이야기들에 대한 블로그입니다:)
  • woojin._.
    Jin's Dev Story
    woojin._.
  • 전체
    오늘
    어제
    • 분류 전체보기 (829)
      • Tools (25)
        • eGovFrame (3)
        • GeoServer (3)
        • QGIS (2)
        • LabelImg (2)
        • Git (6)
        • GitHub (1)
        • Eclipse (7)
        • Visual Studio (1)
      • Web & Android (121)
        • SpringBoot (37)
        • Three.js (2)
        • Spring Data JPA (9)
        • 스프링 부트 쇼핑몰 프로젝트 with JPA (25)
        • Thymeleaf (4)
        • Spring Security (15)
        • Flutter (29)
      • Programming Language (61)
        • JAVA (27)
        • JavaScript (14)
        • Dart (2)
        • Python (15)
        • PHP (3)
      • Database (43)
        • PostgreSQL (32)
        • MYSQL (7)
        • Oracle (3)
        • MSSQL (1)
      • SERVER (17)
        • TCP_IP (3)
        • 리눅스 (7)
        • AWS (7)
      • Coding Test (445)
        • 백준[JAVA] (108)
        • 프로그래머스[JAVA] (260)
        • 알고리즘 고득점 Kit[JAVA] (3)
        • SQL 고득점 Kit[ORACLE] (74)
      • CS 지식 (49)
        • [자료구조] (14)
        • [네트워크] (12)
        • [데이터베이스] (10)
        • [알고리즘] (9)
        • [운영체제] (4)
      • 기타 (6)
      • 자격증 & 공부 (62)
        • 정보처리기사 (2)
        • SQLD (6)
        • 네트워크관리사 2급 (5)
        • 리눅스마스터 1급 (44)
        • 리눅스마스터 2급 (1)
        • ISTQB (3)
        • 시스템보안 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 인기 글

  • 태그

    데이터
    CS지식
    프로그래머스
    python
    자바
    백준
    데이터베이스
    리눅스마스터 1급
    플러터
    Java
    리눅스마스터
    CS
    스프링 부트 쇼핑몰 프로젝트 with JPA
    programmers
    springboot
    Spring Security
    Oracle
    시큐리티
    DB
    backjoon
    Flutter
    pcce 기출문제
    Linux
    JPA
    spring
    postgresql
    리눅스
    baekjoon
    스프링부트
    스프링
  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
woojin._.
[Spring Data JPA] 영속성 컨텍스트
상단으로

티스토리툴바