티스토리 뷰
JPA에서 핵심 2가지
- ORM ( 개체와 관계형 데이터베이스 매핑)
- 영속성 컨텍스트
EntityManagerFactory는 요청이 올 때마다 EntityManager를 생성한다.
영속성 컨텍스트 : 엔티티를 영구 저장하는 환경
EntityManager.persist(entity);
엔티티 매니저를 통해 영속성 컨텍스트에 접근
엔티티의 생명주기
비영속(new / transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 형태 - 새로운 객체 생성
영속(managed) 영속성 컨텍스트에 관리되는 상태 - em.persist(entity)
준영속(detached) 영속성 컨텍스트에 저장되었다가 분리된상태 - em.detach(entity)
삭제(removed) 삭제된 상태 - em.remove(entity)
하지만 em.persist(entity) 때 쿼리가 실행되는 것이 아니고
tx.commit(); 가 실행될 때 entityManager에 들어있던 entity의 쿼리가 실행된다.
영속성 컨텍스트의 장점
- 1차캐시
- 동일성 보장
- 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
- 변경 감지(Dirty Checking)
- 지연 로딩(Lazy Loading)
1차캐시 : 한 번의 트랜잭션 안에서만 효과가 있다, 전체 서비스에서 공유하는 캐시가 아님.
어떤 조회쿼리에서 하나의 트랜잭션에서 먼저 entityManager의 1차 캐시에서 찾아본 후 있으면 반환, 없으면 데이터베이스에서 결과를 받아와서 1차캐시에 저장후 반환한다.
동일성 보장 : 하나의 트랜잭션에서 같은 객체를 찾으면 둘은 같은 객체를 반환한다.