728x90
영속성 컨텍스트
JPA에서 가장 중요한 2가지
- 객체와 관계형 데이터베이스 매핑하기 (Object Relational Mapping)
- 영속성 컨텍스트
엔티티 매니저 팩토리와 엔티티 매니저
영속성 컨텍스트
- JPA를 이해하는데 가장 중요한 용어
- "엔티티를 영구 저장하는 환경"이라는 뜻
- EntityManager.persist(entity); -> DB에 저장한다는 의미가 아니라 영속성 컨텍스트에 저장한다는 의미
엔티티 매니저? 영속성 컨텍스트?
- 영속성 컨텍스트는 논리적인 개념
- 눈에 보이지 않는다.
- 엔티티 매니저를 통해서 영속성 컨텍스트에 접근
엔티티의 생명주기
- 비영속(new/transient) - 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- 영속(managed) - 영속성 컨텍스트에 관리되는 상태
- 준영속(detached) - 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제(removed) - 삭제된 상태
영속성 컨텍스트의 이점
- 1차 캐시
- 동일성(identity) 보장
- 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
- 변경 감지(Dirty Checking)
- 지연 로딩(Lazy Loading)
엔티티 조회, 1차 캐시
영속 엔티티의 동일성 보장
1차 캐시로 반복 가능한 읽기(REPEATABLE READ) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
엔티티 등록
트랜잭션을 지원하는 쓰기 지연
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); //[트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
//여기까지는 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); //[트랜잭션] 커밋
여기까지는 SQL INSERT을 데이터베이스에 보내지 않음.
commit시에 보냄
엔티티 수정
변경 감지(dirty checking)
Member memberA = em.find(Member.class, "memberA")l
//영속성 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
//em.update(member) 이런 코드가 있어야 하지 않을까??
transaction.commit(); //[트랜잭션] 커밋
엔티티 삭제
//삭제 대상 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
em.remove(memberA); //엔티티 삭제
플러시
영속성 컨텍스트의 변경내용을 데이터베이스에 반영
플러시 발생
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)
영속성 컨텍스트를 플러시하는 방법
- em.fluch() - 직접 호출
- 트랜잭션 커밋 - 플러시 자동 호출
- JPQL 쿼리 실행 - 플러시 자동 호출
플러시는!
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화하면 됨.
준영속 상태
- 영속 -> 준영속
- 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
- 영속성 컨텍스트가 제공하는 기능을 사용 못함
member.setName("AAAA");
em.detach(member);
tx.commit(); // set으로인한 쿼리가 나가지 않음
준영속 상태로 만드는 방법
- em.detach(entity) - 특정 엔티티만 준영속 상태로 전환
- em.clear() - 영속성 컨텍스트를 완전히 초기화
- em.close() - 영속성 컨텍스트를 종료
참고 강의 : https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'Back-End > Inflearn 강의' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 연관관계 매핑 기초 (0) | 2022.09.06 |
---|---|
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 엔티티 매핑 (0) | 2022.09.06 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] JPA 시작하기 (0) | 2022.09.06 |
[스프링 핵심 원리 - 기본편] 빈 스코프 (0) | 2022.09.05 |
[스프링 핵심 원리 - 기본편] 빈 생명주기 콜백 (0) | 2022.09.05 |