Dev/Spring

영속성 컨텍스트란

oxdjww 2023. 11. 20. 11:54
728x90
반응형

Overview

JPA의 '영속성 컨텍스트'라는 논리적인 개념에 대해 다룬다.

JPA의 2요소

JPA에서 가장 중요한 2가지라 하면,

  • 객체와 RDBMS를 매핑하는 연관관계
  • 영속성 컨텍스트

이 두가지가 있다.


웹 어플리케이션에서 사용자는 EntityManager를 할당받고, Database에 접근하기 위해 EntityManager로 엔티티를 영속성 컨텍스트에 집어 넣는다.
즉, 영속성 컨텍스트엔티티를 영구 저장하는 환경이라는 뜻이다.
일반적으로 EntityManager.persist(entity);구문을 통해 엔티티는 영속성 컨텍스트에 들어간다.

엔티티의 생명주기

  • 비영속
    • 영속성 컨텍스트와 연관이 없는 상태. 그저 생성만 된 객체를 의미한다.
  • 영속
    • 영속성 컨텍스트가 관리하는 객체
  • 준영속
    • 영속성 컨텍스트가 관리했던 객체. 즉, Database에 한번 들어갔다 나온 객체 (식별자 존재)
  • 삭제
    • Database에서 삭제된 객체

예제를 통한 영속성 컨텍스트 감 잡기

//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");

이렇게 member 객체를 생성하고 아무것도 하지 않았을 때, 이 상태를 비영속 상태라 한다.

//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername(“회원1”);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//객체를 저장한 상태(영속)
em.persist(member);

하지만 그 이후에 persist(member);를 통해 객체를 영속성 컨텍스트에 넣으면, 이 member는 이제 영속성 컨텍스트 상태인 것이다.

/회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);
//객체를 삭제한 상태(삭제)
em.remove(member);

이렇게 분리하여 준영속 상태로 만들거나, 아예 삭제할 수도 있다.

영속성 컨텍스트 = Database에 들어가는 것?

반은 맞고 반은 틀린 말이다.

EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername(“회원1”);
em.getTransaction().begin();
//객체를 저장한 상태(영속)
System.out.println("---");
em.persist(member);
System.out.println("---");
tx.commit();

위와 같은 코드를 실행하면, '---' 사이에 쿼리가 위치하지 않는다.
실제로 쿼리가 나가는 부분은 tx.commit(); 에 의해 생성된다.

즉, 영속성 컨텍스트는 웹 어플리케이션과 데이터베이스 사이의 그 어딘가에 존재하는,
중간 매개체라고 볼 수 있는 것이다.

데이터베이스에 연관된 일련의 작업을 모아두었다가, 커밋 시점에 데이터베이스에 한 번에 접근하는 개념으로 이해해볼 수 있겠다.

이렇게 중간에서 프록시 역할을 하며 얻을 수 있는 이점은 다음과 같다.

  • 1차 캐시
  • 동일성(identity) 보장
  • 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
  • 변경 감지(Dirty Checking)
  • 지연 로딩(Lazy Loading)

감사합니다.

728x90
반응형

'Dev > Spring' 카테고리의 다른 글

변경 감지(Dirty Checking)  (0) 2023.11.20
JPA를 왜 쓸까?  (0) 2023.11.20
준영속과 변경감지  (0) 2023.10.25
[스프링 핵심 원리] Bean Scope  (0) 2023.09.30
[스프링 핵심 원리] @Qualifier, @Primary와 Bean 우선순위  (0) 2023.09.26