김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 정리
영속성 컨텍스트는 "엔티티를 영구 저장하는 환경"입니다. 정확히는 다음과 같은 특징을 갖는 논리적 개념입니다:
EntityManager를 통해 접근EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Member member = new Member("member1", "회원1");
em.persist(member);
위 코드에서 persist() 호출은 DB에 바로 insert하는 것이 아니라, 영속성 컨텍스트에 저장하는 작업입니다.
JPA 엔티티는 아래 네 가지 상태를 가질 수 있습니다:
| 상태 | 설명 |
|---|---|
| 비영속(new) | 객체만 생성된 상태. JPA와 전혀 무관 |
| 영속(managed) | persist() 후 컨텍스트에 의해 관리되는 상태 |
| 준영속(detached) | detach() 등으로 컨텍스트에서 분리된 상태 |
| 삭제(removed) | remove() 호출로 삭제 예정 상태 |
Member member = new Member(); // 비영속
em.persist(member); // 영속
em.detach(member); // 준영속
em.remove(member); // 삭제
JPA는 persist() 시점에 DB에 insert 쿼리를 날리지 않습니다. 실제 쿼리는 트랜잭션 커밋 시점에 발생합니다.
em.getTransaction().commit(); // 이 시점에 insert 쿼리 실행
이러한 방식은 쓰기 지연(Write-Behind) 또는 트랜잭션 단위의 배치 처리라 부르며, 성능 최적화에 매우 유리합니다.
1차 캐시
find() 시 DB를 다시 조회하지 않음동일성(identity) 보장
== 비교 가능)쓰기 지연 (Transactional Write-Behind)
변경 감지(Dirty Checking)
지연 로딩(Lazy Loading)