Spring Boot

[Spring Boot] JPA 영속성 컨텍스트 (Persistence Context)

dev-sunflower 2025. 2. 10. 20:17

영속성 컨텍스트란?

영속성 컨텍스트(Persistence Context)는 JPA에서 엔티티 객체를 관리하는 메모리 상의 저장소이며, 영속성 컨텍스트를 통해 엔티티 객체의 생명 주기를 관리하고, 데이터베이스와의 동기화를 효율적으로 수행할 수 있다.

영속성 컨텍스트 그림

 

  1. 1차 캐시: 동일한 트랜잭션 내에서 같은 엔티티 조회 시, DB가 아닌 메모리에서 가져와 성능을 최적한다.
  2. 변경 감지 (Dirty Checking): 엔티티 객체의 값이 변경되면 트랜잭션 종료 시 자동으로 변경 내용을 반영한다.
  3. 지연 로딩 (Lazy Loading): 필요한 시점까지 쿼리를 실행하지 않고, 프록시 객체를 통해 데이터를 가져올 수 있다.
  4. 쓰기 지연 (Write-Behind): 트랜잭션이 커밋될 때까지 SQL을 모아두고 한 번에 실행한다.

영속성 컨텍스트의 생명 주기

엔티티는 비영속(new) → 영속(managed) → 준영속(detached) → 삭제(removed) 의 생명 주기를 가진다.

1) 비영속 (Transient)

  • JPA에서 관리되지 않는 객체 상태로, 단순히 new 키워드로 생성한 상태이다.
  • 영속성 컨텍스트가 관리하지 않기 때문에 데이터베이스와 전혀 연결되지 않는다.
Member member = new Member(); // 비영속 상태
member.setName("John Doe");

2) 영속 (Managed)

  • EntityManager.persist(entity)를 호출하면 엔티티가 영속성 컨텍스트에 저장된다.
  • 1차 캐시에 저장되며, 트랜잭션이 커밋될 때 DB에 반영된다.
@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;
}

EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();

Member member = new Member();
member.setName("John Doe");
em.persist(member); // 영속 상태로 변환

em.getTransaction().commit(); // DB 반영

3) 준영속 (Detached)

  • EntityManager.detach(entity)를 호출하면 엔티티는 영속성 컨텍스트에서 분리되며, 더 이상 변경 감지가 적용되지 않는다.
em.detach(member); // 준영속 상태

4) 삭제 (Removed)

  • EntityManager.remove(entity)를 호출하면 엔티티가 삭제되며, 트랜잭션이 커밋될 때 DELETE 쿼리가 된다.
    em.remove(member); // 삭제 상태
    
    ​
     

여기까지 JPA 영속성 컨텍스트에 대해 간략하게 정리 해보았다. JPA를 사용하는데 있어 중요하다는 말씀이 많아 내가 블로그를 방문할때마다 까먹지 않고 챙겨 보려 한다.

'Spring Boot' 카테고리의 다른 글

[Spring Boot] Servlet Filter 란?  (1) 2025.02.06
[Spring] Spring Container & Bean에 대해 알아보자  (1) 2025.02.05