티스토리 뷰
JPA에서 중요한 두 가지
- ORM
- 영속성 컨텍스트(Persistence Context)
영속성 컨텍스트
- JPA를 이해하는 데 가장 중요한 용어
- "엔티티를 영구 저장하는 환경"
- 영속성 컨텍스트는 눈에 보이지 않는 논리적인 개념
- EntityManager를 통해서 영속성 컨텍스트에 접근
엔티티의 생명주기
- 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계 없는 새로운 상태
- 영속(managed) : 영속성 컨텍스트에 관리되는 상태
- 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제(removed) : 삭제된 상태
비영속
- 객체를 생성한 상태
Member member = new Member();
member.setId("member1");
member.setName("회원1");
영속
- 객체를 저장한 상태
Member member = new Member();
member.setId("member1");
member.setName("회원1");
// 영속
EntityManger.persist(member);
준영속
- 엔티티를 영속성 컨텍스트에서 분리 em.detach(member);
삭제
- 객체를 삭제한 상태 em.remove(member);
영속성 컨텍스트의 이점
- 1차 캐시
- 동일성(identity) 보장
- 트랜잭션을 지원하는 쓰기 지연
- 변경 감지 (Dirty Checking)
- 지연 로딩 (Lazy Loading)
엔티티 조회, 1차 캐시
- JPA는 조회할 때 1차 캐시에서 조회할 수 있다
- 트랜잭션 커밋(commit)되기 전에 1차 캐시에서 조회할 수 있기 때문에 SELECT 쿼리가 안 나간다.
Member member = new Member();
member.setId("member1");
member.setName("회원1");
// 영속 1차 캐시에 저장됨
EntityManger.persist(member);
// 1차 캐시에서 조회
Member findMember = EntityManger.find(Member.class, "member1");
데이터베이스에서 조회
영속 엔티티의 동일성 보장
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b) // true
- 1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 DB가 아닌 애플리케이션 차원에서 제공
엔티티 등록 - 트랜잭션을 지원하는 쓰기 지연
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // 트랜잭션 시작
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit();
- 영속성 컨텍스트에는 쓰기 지연 SQL 저장소가 있다.
- 트랜잭션이 커밋되면 해당되는 SQL을 DB에 날린다.
- transaction.commit()
엔티티 수정 - 변경 감지(Dirty Checking)
- 엔티티 객체를 수정하고 싶으면 set으로 가능하다.
- em.update(엔티티)가 없는 이유는 1차 캐시에서 엔티티와 스냅삿을 비교해서 가져와서 update를 하기 때문이다.
엔티티 삭제
- 삭제 대상 엔티티 조회하여 삭제한다
- em.remove(Entity)
플러쉬(Flush)
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
- 변경 감지, 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
- em.flush() : 직접 호출
- 트랜잭션 커밋 : flush 자동 호출
- JPQL 쿼리 실행 : flush 자동 호출
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요
준영속 상태
- 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
- 영속성 컨텍스트가 제공하는 기능을 사용 못함
- em.detach(entity), em.clear(), em.close()
출처 : 자바 ORM 표준 프로그래밍
'Back-end Programming > JPA' 카테고리의 다른 글
JPA 고급 매핑 (0) | 2021.04.17 |
---|---|
JPA 다양한 연관관계 매핑 (0) | 2021.04.17 |
JPA 연관관계 매핑 기초 (0) | 2021.04.16 |
JPA 엔티티 매핑(Entity Mapping) (0) | 2021.04.15 |
JPA (Java Persistence API) 소개 및 시작하기 (0) | 2021.04.14 |