TIL
[TIL] 영속성 컨텍스트
yeonny_do
2025. 2. 24. 23:16
Entity Manager Factory, Entity Manager
- JPA는 스레드가 하나 생성될 때마다(매 요청마다) EntityManagerFactory에서 EntityManager를 생성한다.
- EntityManager는 내부적으로 DB 커넥션 풀을 사용해 DB에 붙는다.
영속성 컨텍스트 (Persistence Context)
- 엔티티를 영구적으로 저장하는 환경
- EntityManager.persist(entity);
- persist()로 DB에 실제로 객체를 저장하는 것이 아니라, 영속성 컨텍스트를 통해 엔티티를 영속화한다.
- 정확히, persist() 시점에는 영속성 컨텍스트에 저장을 한다. DB 저장은 이후이다.
- 영속성 컨텍스트는 논리적인 개념이다.
- Entity Manager를 통해 영속성 컨텍스트에 접근한다.
- Spring에서 EntityManager를 주입 받아서 쓰면, 같은 트랜잭션의 범위에 있는 EntityManager는 동일한 영속성 컨텍스트에 접근한다.
엔티티의 생명 주기
- 비영속 (new/transient)
- 영속성 컨텍스트와 전혀 관계가 없는 상태
- 객체를 생성만 한 상태
Member member = new Member(); member.setId("memberId"); member.setUsername("member");
- 영속 (managed)
- 영속성 컨텍스트에 저장된 상태
- 엔티티가 영속성 컨텍스트에 의해 관리
- 이때 DB에 저장되지 않음. 영속 상태가 된다고 DB에 쿼리가 날라가지 않음.
- 트랜잭션의 커밋 시점에 영속성 컨텍스트에 있는 정보들이 DB에 쿼리로 날라감.
// 객체만 생성한 상태 (비영속) Member member = new Member(); member.setId("memberId"); member.setUsername("member"); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); // 객체를 저장한 상태 (영속) em.persist(member);
- 준영속 (detached)
- 영속성 컨텍스트에 저장되었다가 분리된 상태
// 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태 em.detach(member);
- 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제 (removed)
- 삭제된 상태. DB에서도 날림
// 객체를 삭제한 상태 em.remove(member);
- 삭제된 상태. DB에서도 날림
영속성 컨텍스트의 이점
1. 1차 캐시
2. 동일성 (identity) 보장
3. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind) - 엔티티 등록
4. 변경 감지 (Dirty Checking) - 엔티티 수정
5. 엔티티 삭제