일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 교육기획팀원
- springboot
- kusitms
- reactive operaton
- java
- JPQL
- 큐시즘
- 도메인 주도 개발 시작하기
- JPA
- 이펙티브자바
- 객체지향 쿼리 언어
- 교육기획팀
- rabbitmq-delayed-message-exchange
- delayed message plugin
- Domain Driven Design
- RESTClient
- 30기
- cicd
- scheduling messages with rabbitmq
- 한국대학생it경영학회
- 밋업프로젝트
- Spring Batch
- 자바 ORM 표준 JPA 프로그래밍
- 최범균
- 자동처리
- ddd
- jdbc
- 영속성
- Spring
- GitHub Actions
Archives
- Today
- Total
코딩은 마라톤
[자바 ORM 표준 JPA 프로그래밍] 3장. 영속성 관리 본문
엔티티 매니저 팩토리, 엔티티 매니저
- 엔티티 매니저 팩토리
// persistence.xml 코드의 <persistence-unit name = "{name}">
EntityManagerFactory emf = Persistence.createEntityManagerFactory("{name}");
- 엔티티 매니저를 만드는 공장
- 공장을 만드는 비용은 상당히 크다. -> 한 개의 엔티티 매니저 팩토리를 만들어서 전체 애플리케이션에서 공유
- 여러 스레드가 동시에 접근해도 안전 -> 서로 다른 스레드 간에 공유 가능
- 엔티티 매니저
EntityManager em = emf.createEntityManager();
- 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유 금지
영속성 컨텍스트
- 엔티티를 영구 저장하는 환경
em.persist(entity);
- 위의 메소드 실행시 entity가 영속성 컨텍스트에 저장된다.
- 엔티티 매니저 생성 시 하나의 영속성 컨텍스트 생성
- 엔티티 매니저를 통해 영속성 컨텍스트에 접근 및 관리 가능
엔티티 생명주기
비영속 : 영속성 컨텍스트와 전혀 관계가 없는 상태
Member member = new Member();
member.setId(1L);
member.setUsername("a");
- 엔티티 객체를 생성하고 아직 저장하지 않은 상태
- 영속성 컨텍스트나 DB와는 전혀 관련이 없다.
영속 : 영속성 컨텍스트에 저장된 상태
em.persist(member);
- 영속성 컨텍스트가 관리하는 엔티티
- 영속 상태 : 영속성 컨텍스트에 의해 관리
- em.find()나 JPQL을 사용하여 조회한 엔티티 또한 영속 상태이다.
준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태
// 특정 엔티티를 준영속 상태로 변경
em.detach(member);
// 영속성 컨텍스트 닫기
em.close();
// 영속성 컨텍스트 초기화
em.clear();
삭제 : 삭제된 상태
em.remove(member);
- 엔티티를 영속성 컨텍스트와 DB에서 삭제한다.
영속성 컨텍스트의 특징
- 영속성 컨텍스트와 식별자 값
- 영속성 컨텍스트는 엔티티를 식별자 값(PK)로 구분
- 영속 상태는 식별자 값이 반드시 있어야 한다.
- 영속성 컨텍스트와 DB 저장
- 트랜잭션 커밋할 때 영속성 컨텍스트에 새로 저장된 엔티티를 DB에 반영한다.(flush)
- 장점
- 1차 캐시 : 영속성 컨텍스트 내부의 캐시
- 영속성 컨텍스트 내 영속 상태인 엔티티가 있다면 이후 조회시 DB에서 조회하는 것이 아닌 1차 캐시에서 조회한다.
- 동일성 보장
- find를 통해 영속 상태 엔티티를 여러개 조회해서 동일성(==)을 비교해도 참(True)을 반환한다. (실제 인스턴스 동일)
- 트랜잭션을 지원하는 쓰기 지연
- 쓰기 지연 SQL 저장소에 쿼리를 저장해두고 트랜잭션 커밋 시 DB에 쿼리를 보낸다.
- 변경 감지 (Dirty Checking)
- 엔티티의 변경사항을 DB에 자동으로 반영하는 기능
- 영속성 컨텍스트에 보관된 엔티티와 플러시 시점의 엔티티를 비교해서 엔티티를 수정한다.
- 지연 로딩
- 1차 캐시 : 영속성 컨텍스트 내부의 캐시
플러시 : 영속성 컨텍스트의 변경 내용을 DB에 반영
플러시 방법
1. 직접 호출 : em.flush()
2. 트랜잭션 커밋 시 플러시 자동 호출
3. JPQL 쿼리 실행 시 플러시 자동 호출
병합 : merge()
- 영속 상태가 아닌 엔티티를 새로운 영속 상태로 반환
- 영속 상태가 아닌 엔티티가 영속 상태로 변경되는 것이 아닌 새로운 영속 상태의 엔티티가 되는 것이다.
출처 : 자바 ORM 표준 JPA 프로그래밍 책
'Backend > JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 5장. 연관관계 매핑 기초 (0) | 2024.02.04 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 4장. 엔티티 매핑 (0) | 2024.02.02 |
[자바 ORM 표준 JPA 프로그래밍] 2장. Java + Gradle 설정 (1) | 2024.01.28 |
[자바 ORM 표준 JPA 프로그래밍] 1장. JPA 소개 (1) | 2024.01.27 |
Entity Listener의 활용 (AuditingEntityListener) (0) | 2023.11.03 |