본 글은 김영한님의 <자바 ORM 표준 JPA 프로그래밍>을 읽고 공부한 내용을 정리한 글입니다.
- 엔티티 매니저 팩토리와 엔티티 매니저
- 영속성 컨텍스트란?
- 엔티티의 생명주기
- 영속성 컨텍스트의 특징
- 플러시
- 준영속
em.persist(member);
: 엔티티 매니저를 사용해서 회원 엔티티를 영속성 컨텍스트에 저장Member member = new Member();
member.setId("member1");
member.setUsername("회원1);
em.persist(member);
: 객체를 저장em.detach(member);
: 회원 엔티티를 영속성 컨텍스트에서 분리em.clear();
, em.close();
: 영속성 컨텍스트가 관리하던 엔티티 -> 준영속 상태em.remove(member);
: 객체 삭제Member member = new Member();
member.setId("member1");
member.setUsername("회원1);
//1차 캐시에 저장
em.persist(member);
//1차 캐시에서 조회
Member findMember = em.find(Member.class, "member1");
1차 캐시에 찾는 엔티티가 있으면 DB를 조회하지 않고 메모리에 있는 1차 캐시에서 엔티티를 조회한다.
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
a == b // True
1차 캐시에 있는 같은 엔티티 인스턴스를 반환하기 때문에 동일성을 보장한다.
동일성 : 실제 인스턴스가 같다.
동등성 : 인스턴스는 다를 수 있지만 인스턴스의 값이 같다.
엔티티 매니저는 트랜잭션을 커밋하기 직전까지 내부 쿼리 저장소에 SQL을 모아두고, 트랜잭션을 커밋할 때 모아둔 쿼리를 DB에 보낸다.
엔티티의 변경사항을 DB에 자동으로 반영하는 기능
변경 감지는 영속 상태의 엔티티에만 적용된다.
JPA 기본 전략은 엔티티의 모든 필드를 업데이트한다.
실제 객체 대신 프록시 객체를 로딩해두고 해당 객체를 실제로 사용할 때 영속성 컨텍스트를 이용한다.
영속 상태 -> 준영속 상태
em.detach(entity)
: 특정 엔티티만 준영속 상태로 전환한다.em.clear()
: 영속성 컨텍스트 초기화em.close()
: 영속성 컨텍스트 종료준영속 상태 -> 영속 상태
merge()
- 영속성 컨텍스트 조회 -> 데이터 베이스 조회 -> 새로운 엔티티 생성
- 준영속, 비영속을 신경쓰지 않고 병합
- save or update 기능을 수행
? : 준영속 상태가 되면 1차 캐시에 있는 엔티티 정보를 삭제하는데 왜 1차 캐시에서 엔티티를 찾아보는건지 궁금..