[JPA] 영속성 컨텍스트 (1)

형이·2023년 10월 12일

Spring

목록 보기
16/21
post-thumbnail

📝 JPA

🖥️ 1. 영속성 관리 - JPA 내부 구조

1-1. 영속성 컨텍스트

  • JPA를 이해하는데 가장 중요한 용어
  • 엔티티를 영구 저장하는 환경이라는 뜻
  • EntityManager.persist(entity); : "entity"에 들어가는 객체 (Team, Member ..) 등을 DB에 저장하는구나 싶지만, 좀 더 깊은 의미가 있다.
  • DB에 저장하는게 아니라 영속성 컨텍스트라는 곳에 저장한다.
  • 영속성 컨텍스트는 논리적인 개념
  • 눈에 보이지 않는다.
  • 엔티티 매니저를 통한 영속성 컨텍스트에 접근한다.
  • 엔티티 매니저를 생성하는 영속성 컨텍스트가 1:1로 생성된다.

1-2. 엔티티의 생명주기

  • 비영속 (new / transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
  • 영속 (managed) : 영속성 컨텍스트에 관리되는 상태
  • 준영속 (detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제 (removed) : 삭제된 상태

1-3. 비영속 상태 - JPA와 전혀 상관 없는 상태

          Member member = new Member();
          member.setId("member1");
          member.setUsername("회원1");

1-4. 영속 상태 - JPA에 속해있는 상태

          Member member = new Member();
          member.setId("member1");
          member.setUsername("회원1");

          EntityManager em = emf.createEntityManager();
          em.getTransaction().begin();

          // 객체를 저장한 상태 [영속]
          em.persist(member);

1-5. 준영속 상태

  • 회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태

    	em.detach(member);

1-6. 삭제

  • 객체 삭제를 요청한 상태

    	em.remove(member);

1-7. 영속성 컨텍스트의 이점

  • 1차 캐시
  • 동일성 (identity) 보장
  • 트랜잭션을 지원하는 쓰기 지연 (transactonal write-behind)
  • 변경 감지 (Dirty Checking)
  • 지연 로딩 (Lazy Loading)

1-8. 엔티티 조회 - 1차 캐시

  • 영속성 컨텍스트와 식별자 값
    ✔️ 엔티티를 식별자 값(@id로 테이블의 기본 키와 매핑)으로 구분
    ✔️ 영속 상태는 식별자 값이 반드시 있어야 한다.
    ✔️ 식별자 값이 없으면 예외 상황
  • 영속성 컨텍스트와 데이터베이스 저장
    ✔️ JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영
    ✔️ 플러시 (flush)

0개의 댓글