영속성
객체의 생명이나 공간을 자유롭게 유지하고 이동할 수 있는 객체의 성질
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 저장
영속성 컨텍(택X)스트라는 것을 이미지 다 찍고 나서야 알았다.. 다시 하긴 상당히 번거로워서.. 이해하고 봐주길 바란다..
Entity 조회
- 이미 영속성 컨텍스트의 1차 캐시에 있으면 DB에 Select문을 보내지 않는다.
- 장점
- 데이터 베이스 조회 횟수를 줄인다 - (1차 캐시에 등록이 되어있으면, DB를 조회 안해도 된다.)
- 객체 동일성을 보장해준다.
객체 동일성?
Entity 두 객체가 동일한 객체 (DB에선 Row를 의미) 를 가지고 있다면
객체를 == 비교 연산자로 비교 했을 때 True가 나온다.
Entity 삭제
쓰기 지연 저장소
DB에 대한 변경 사항들을 즉시 DB에 전달하지 않고 영속성 컨텍스트 내부의 쓰기 지연 저장소에 쿼리 문을 쌓아뒀다가
flush() 메서드가 나오면 쿼리를 한꺼번에 보낸다.
- flush() 메서드
- flush 메서드가 호출되면 쓰기 지연 저장소에 있는 쿼리문을 DB에 전달한다.
- commit 메서드에 flush 메서드가 내장되어 있다.
- flush 메서드가 호출되면 쓰기 지연 저장소에 있는 쿼리문을 DB에 전달한다.
변경감지
JPA에서는 영속선 컨텍스트에 Entity가 저장 될 때 그 상태를 스냅샷을 저장한다.
이 스냅샷은 Entity의 최초 상태 (Loaded State)를 나타낸다.
- commit 시 flush가 호출
- 현재 상태와 최초 상태 비교
- 변경 내용이 있다면 SQL 생성
- 없다면 미생성
- 쓰기 지연 저장소에 SQL 저장
- 쓰기 지연 저장소에 있는 모든 SQL을 DB에 요청
- 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 컨테이너 (0) | 2023.11.07 |
TIL 2023-11-06 개인프로젝트 완성 및 3 레이어 아키텍처 (0) | 2023.11.06 |
TIL 2023-11-03 다형성 업 캐스팅 다운 캐스팅 참조 변수 완벽 이해 (0) | 2023.11.03 |