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);


영속성 컨텍스트의 이점

1. 1차 캐시

2. 동일성 (identity) 보장

 

3. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind) - 엔티티 등록

 

4. 변경 감지 (Dirty Checking) - 엔티티 수정

 

5. 엔티티 삭제

 

 

 

[출처] : https://ict-nroo.tistory.com/130