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 |