영속성 컨텍스트란 엔티티를 영구 저장하는 환경
으로 엔티티 객체들을 관리하는 일종의 메모리상의 공간을 의미한다. 영속성 컨텍스트는 데이터베이스와 자바 애플리케이션 사이에서 객체의 상태를 관리하고 동기화하는 역할을 한다.
엔티티 생명주기
- 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계 없는 새로운 상태
- 영속(managed) : 영속성 컨텍스트에 관리하는 상태
- 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제(removed) : 삭제된 상테
//영속성 컨텍스트 실습
//비영속성
Member member = new Member();
member.setId((100L));
member.setName("HelloJPA");
//영속
em.persist(member);
//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member); //특정 엔티티만 준영속 상태로 전환
em.clear() //영속성 컨텍스트를 완전히 초기화
em.clse() // 영속성 컨텍스트를 종료
//객체를 삭제한 상태(삭제)
em.remove(member);
영속성 컨텍스트 이점
- 1차 캐시
- 조회 시 1차 캐시(영속 컨텍스트(entityManager))에서 조회
- 1차 캐시로 REPEATABLE READ(반복 가능한 읽기) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
- 동일성(identity) 보장
//영속 엔티티의 동일성 보장 Member a = em.find(Member.class, "member1"); Member b = em.find(Member.class, "member1"); System.out.println(a == b) //동일성 비교 true`
- 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
transaction.begin(); //트랜잭션 시작 em.persist(memberA); em.persist(memberB); //아직 INSERT SQL을 데이터베이스 보내지 않음 //커밋하는 순간 데이터베이스에 INSERT SQL을 보냄 transaction.commit()
- 변경 감지(Dirty Checking)
- 지연 로딩(Lazy Loading)
플러시(Flush)
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화
- 데이터베이스 commit이 일어나면 자동적으로 플러시 발생
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
- 영속성 컨텍스트를 플러시하는 방법
- 직접 호출(em.flush())
- 플러시 자동 호출
- 트랜잭션 커밋
- JPQL 쿼리 실행
Member member = new Member(200L, "member200");
em.persist(member);
em.flush();
tx.commit();
'웹 > Spring' 카테고리의 다른 글
[JPA] Persist와 Merge (0) | 2024.09.03 |
---|---|
(Spring) 2. MariaDB와 Mybatis 연동 (0) | 2020.04.27 |
(Spring) 1. 스프링 설정 (0) | 2020.04.26 |