SpringDataJPA - 영속성 컨텍스트 & 엔티티의 생명주기

박민수·2023년 11월 14일
0

JPA

목록 보기
1/24

영속성 컨텍스트

JPA에서 영속성 컨텍스트란 엔티티를 영구 저장하는 환경을 뜻한다.
엔티티 매니저를 통해서 영속성 컨텍스트에 접근한다.

EntityManager.persist(entity);

영속성 컨텍스트의 이점

1차 캐시

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

//1차 캐시에 저장됨
em.persist(member);

//1차 캐시에서 조회
Member findMember = em.find(Member.class, "member1");

동일성(identity) 보장

Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //동일성 비교 true

트랜잭션을 지원하는 쓰기 지연

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // [트랜잭션] 시작

em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.

//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋

변경 감지

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

transaction.begin(); // [트랜잭션] 시작

// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");

// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);

//em.update(member) 
//이런 코드가 있어야 할 것 같은데 없어도 된다. 
//자동으로 변경을 감지하고 업데이트 쿼리를 날려줌.

transaction.commit(); // [트랜잭션] 커밋

지연 로딩

플러시란?

영속성 컨텍스트의 변경 내용을 DB에 반영해주는 기능을 한다. 플러시가 발생하면, 변경을 감지하고 변경된 내용들을 자동으로 DB에 쿼리를 날려준다. 영속성 컨텍스트를 플러시하는 방법은 3가지가 있다.

  • em.flush() - 직접 호출
  • 트랜잭션 커밋 - 플러시 자동 호출
  • JPQL 쿼리 실행 - 플러시 자동 호출

준영속 상태란?

준영속 상태란 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 상태를 뜻한다.
영속성 컨텍스트가 제공하는 기능을 사용하지 못 한다. 준영속 상태로 만드는 방법은 다음과 같다.
1. em.detach(entity) - 특정 엔티티만 준영속 상태로 전환
2. em.clear() - 영속성 컨텍스트를 완전히 초기화
3. em.close() - 영속성 컨텍스트를 종료

엔티티의 생명주기

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

비영속 상태

//단순히 객체를 생성만 한 상태(비영속)
Member member = new Member();
member.setId(1L);
member.setName("회원1");

영속 상태

//단순히 객체를 생성만 한 상태(비영속)
Member member = new Member();
member.setId(1L);
member.setName("회원1");

EntityManager em = emf.createEntityManager();

em.getTransaction().begin();

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

준영속 상태

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

삭제 상태

//객체를 삭제한 상태(삭제)
em.remove(member);

참조
https://www.inflearn.com/course/ORM-JPA-Basic

profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글