영속성 컨텍스트

노건우·2023년 10월 6일
0

Spring

목록 보기
12/22
post-thumbnail

♾️영속성 관리- JPA 내부 구조

영속성 컨텍스트

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

엔티티의 생명주기

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

비영속 - jpa와 전혀 상관없는 상태

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

영속상태 - jpa에 속해있는 상태

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

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

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

준영속

  • 회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
    	em.detach(member);

삭제

-객체 삭제를 요청한 상태

em.remove(member);

영속성 컨텍스트의 사용 이유

  • 1차캐시
  • 동일성(identity)보장
  • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
  • 변경 감지(dirty checking)
  • 지연 로딩(lazy loading)

엔티티조회 - 1차 캐시

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

✍️ 이 두 사진의 차이가 보이는가? 첫번째 사진은 1차 캐시에 MEMEBER1이 있었기에 1차 캐시만 다녀와서 캐시값을 조회하는 반면 두번째의 경우는 1차 캐시에 member2가 없기에 DB를 다녀와야 한다. db는 여기에서 최후의 수단으로 간주된다. 그렇게 DB에서 조회해 member2를 다시 1차 캐시에 저장한다. 그 후에 반환하는 원리이다. 결국에는 1차 캐시에서 모든 것을 해결하려 한다.

profile
초보 개발자 이야기

0개의 댓글

관련 채용 정보