영속성 컨텍스트

minisoo·2023년 4월 27일
0
post-thumbnail

이 글은 인프런 김영한님의 자바 ORM 표준 JPA 프로그래밍 강의를 참고하여 작성하는 글입니다!

🏷️ 영속성 컨텍스트란?

✔️ 엔티티를 영구 저장하는 환경

✔️ 엔티티 매니저를 통해서 영속성 컨텍스트에 접근

  • 엔티티 매니저란?
    • 영속성 컨텍스트에 접근하여 엔티티에 대한 DB작업을 제공하는 관리자
    • find, persist, remove 등의 메서드를 제공

✔️ 엔티티의 생명주기

1️⃣ 비영속

  • 객체를 생성한 상태
  Member member = new Member();
  member.setId("member1");
  member.setName("사용자1");

2️⃣ 영속

  • 객체를 저장한 상태
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(member);

3️⃣ 준영속

  • 엔티티를 영속성 컨텍스트에서 분리
em.detach(member); //특정 엔티티만 준영속 상태로 전환
em.clear(); //영속성 컨텍스트를 완전히 초기화
em.close(); //영속성 컨텍스트를 종료

4️⃣ 삭제

  • 객체를 삭제
em.remove(member);

🏷️ 영속성 컨텍스트의 이점

✔️ 1차 캐시

Member findMember = em.find(Member.class, "member1");
Member findMember = em.find(Member.class, "member1");

✔️ 동일성 보장

Member member1 = em.find(Member.class, "member1");
Member member2 = em.find(Member.class, "member2");

System.out.println(member1 == member2);
=> true

✔️ 쓰기 지연

EntityTransaction transaction = em.getTransaction();
transaction.begin();

em.persist(member1);
em.persist(member2);
//insert 쿼리가 발생하지 않음

transaction.commit();
//커밋하는 순간 데이터베이스에 insert 쿼리를 보낸다.

✔️ 변경 감지

EntityTransaction transaction = em.getTransaction();
transaction.begin();

em.persist(member1);
em.persist(member2);
//insert 쿼리가 발생하지 않음

transaction.commit();
//커밋하는 순간 데이터베이스에 insert 쿼리를 보낸다.

🏷️ 플러시

  • 영속성 컨텍스트의 변경내용을 DB에 반영
  • 반영 후 영속성 컨텍스트를 비우지 않음
  • 플러시 하는 방법
    • em.flush() ▶️ 직접 호출
    • 트랜잭션 커밋, JPQL 쿼리 실행 ▶️ 자동 호출
    • JPQL 쿼리 실행 시 플러시가 자동으로 호출되는 이유?
      • JPQL은 쿼리문을 DB에 직접 실행 한다.
      • 영속성 컨텍스트에 보관한 데이터는 DB에 반영되지 않은 상황인데 DB에 쿼리를 보낼 때 실제 저장한 데이터와 일치하지 않을 수 있기 때문에 JPA는 JPQL 쿼리문 날라가기 전 플러시를 실행하게 된다. (옵션을 통해 설정할 수 있음)

[참고자료]

김영한님의 JPA 강의

profile
코딩하는 돌멩이 👻

0개의 댓글