No-ah98
Noah
No-ah98
전체 방문자
오늘
어제
  • 분류 전체보기 (40)
    • CS (7)
      • Java (7)
    • shell (1)
    • 개발 실수 (1)
    • 웹 (1)
    • Git (1)
    • 부트캠프 (1)
    • 링크 (0)
    • 오류 (0)
    • 일정 (0)
    • 객체지향 (4)
    • CodingTest (6)
    • TIL (2)
    • JPA (7)
    • JAVA (0)
    • 기타 (0)
    • Spring (5)
    • 알고리즘 (1)
      • 백준 (1)
      • 프로그래머스 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • @RequestBody
  • 깃 정리
  • 객체지향
  • 캡슐화
  • Entity
  • 연관관계
  • 계층형 댓글
  • 멋사 백엔드
  • 연관관계 편의 메서드 필요성
  • 연관관계 편의 메서드
  • @PathVariable
  • bash shell 기본 명령어
  • 프로그래머스
  • 문자 뒤집기
  • @PathVariable vs @RequestParam
  • VO
  • 문장 뒤집기
  • 문자열
  • 멋쟁이사자처럼 백엔드 스쿨
  • @RequestBody vs @ModelAttribute
  • 양방향 연관관계
  • spring data jpa
  • 중복제거
  • 엔티티 매핑
  • 멋쟁이사자처럼
  • Javascript 공백 체크
  • @RequestBody@ModelAttribute 차이
  • @Controller
  • 해시
  • 팰린드롬
  • form 공백 체크
  • @RequestParam
  • @RestController
  • JPA데이터셋팅
  • 2xn타일링
  • 11726
  • DTOvsVO
  • 백엔드 스쿨
  • @PathVariable vs @RequestParam 차이
  • 연관관계 매핑
  • JPA
  • 영속성 관리
  • 중복문자제거
  • 대댓글
  • @ModelAttribute
  • 타일링
  • Git 정리
  • 데이터 셋팅
  • 백준
  • @Controller vs @RestController

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
No-ah98

Noah

영속성 관리
JPA

영속성 관리

2022. 3. 23. 00:56

영속성 관리

 

JPA에서 가장 중요한 2가지

  • 객체와 관계형 데이터베이스 매핑하기
  • 영속성 컨텍스트 - jpa가 실제 내부에서 동작하는 방식과 관련 

영속성 컨텍스트

"엔티티를 영구 저장하는 환경" 이라는 뜻

ex) EntityManager.persist(entity); -> DB에 저장하는 것이 아닌, 영속성 컨텍스트를 통해 entity를 영속화 시킴 

 

엔티티의 생명주기

  • 비영속(new/transient)

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

 

  • 영속(managed)

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

 

  • 준영속(detached)

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

 

  • 삭제(removed)

      삭제된 상태

 

비영속

영속

 

준영속, 삭제


영속성 컨텍스트의 이점

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

 

엔티티 조회, 1차 캐시

em.persist를 통해 member가 영속이 되며 1차 캐시에 저장이 된다. 이때는 아직 실제 DB에 반영이 안된 상태이다
위와 같이 find함수를 호출할 경우 식별자 "member1"를 통해서 1차 캐시에서 캐시값을 조회한다. 만약 없을 경우에는 아래와 같이 DB에서 조회를 한 후 1차 캐시에 저장을 한다.

 

 

영속 엔티티의 동일성 보장

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

변경 감지

다음과 같이 영속 엔티티를 수정할 경우 update와 관련 함수를 호출해야 할 거 같지만 JPA는 변경 감지(더티 체킹)를 통해서 UPDATE 쿼리를 생성해준다. 동작 방식은 아래와 같다.
Entity를 영속화 시킬 때(persist 및 find) 현 상태를 저장한 후(스냅샷),  flush()를 호출 할 때 Entity와 스냅샷을 비교하여 상태가 변경이 됐으면 Update 쿼리를 쓰기 지연 SQL 저장소에 저장을 한다

 


플러시(fulse()) : 영속성 컨텍스트의 변경내용을 데이터베이스에 반영

->실제 DB에 반영하는건 아님, commit 시점에 반영

 

플러시가 발생

  • 변경 감지 (더티 체킹)
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송

영속성 컨텍스트를 플러시하는 방법

  • em.flush() - 직접 호출
  • 트랜잭션 commit - 플러시 자동 호출
  • JPQL 쿼리 실행 -플러시 자동 호출 

플러시의 특징

  • 영속성 컨텍스트를 비우지 않음
  • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화( 실제 DB에 반영은 commit 할 때 )
  • 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 됨 

 

준영속 상태

  • 영속 -> 준영속
  • 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
  • 영속성 컨텍스트가 제공하는 기능을 사용 못함 

 

준영속 상태로 만드는 방법

  • em.detach(entity) - 특정 엔티티만 준영속 상태로 전환
  • em.clear() - 영속성 컨텍스트를 완전히 초기화
  • em.close() - 영속성 컨텍스트를 종료

 

 

 

 

'JPA' 카테고리의 다른 글

프록시  (0) 2022.04.07
고급 매핑  (0) 2022.04.05
다양한 연관관계 매핑  (0) 2022.03.31
연관관계 매핑 기초  (0) 2022.03.29
엔티티 매핑  (0) 2022.03.24
    'JPA' 카테고리의 다른 글
    • 고급 매핑
    • 다양한 연관관계 매핑
    • 연관관계 매핑 기초
    • 엔티티 매핑
    No-ah98
    No-ah98

    티스토리툴바