영속성 컨텍스트(Persistence Context)란?
- JPA를 이해하는데 가장 중요한 용어
- "엔티티를 영구 저장하는 환경"이라는 뜻
EntityManager.persist(entity);
이 코드는 DB에 저장하는게 아니라 영속성 컨텍스트라는 곳에 저장하게된다.
즉, persist() 메서드는 엔티티 매니저로 entity를 영속성 컨텍스트에 저장한다는 의미이다.
이 영속성 컨텍스트는 엔티티 매니저를 생성할 때 만들어진다.
(여러 엔티티 매니저가 같은 영속성 컨텍스트에 접근 가능)
JPA는 기본적으로 트랜잭션 단위로 영속성 컨텍스트가 부여되어 사용된다.
(트랜잭션을 선언하지 않았을 때, 스프링 데이터 JPA를 사용한다면 JPA repository 코드 내부에서 트랜잭션을 별도로 사용한다.)
위 처럼 J2SE 환경에서는 개발자가 직접 엔티티 매니저를 생성하고 트랜잭션을 관리한다.
J2EE, 스프링 프레임워크 같은 컨테이너 환경에서는 컨테이너가 트랜잭션과 영속성 컨텍스트를 관리한다.
이 때 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용하는데,
트랜잭션이 같으면 영속성 컨텍스트도 같이 쓰고, 트 랜잭션이 다르면 다른 영속성 컨텍스트를 쓰게된다.
결국 J2EE 또는 스프링 컨테이너 환경의 장점은 트랜잭션과 복잡한 멀티 쓰레드 상황을 컨테이너가 처리해주는 것이다.
- J2SE (Java Standard Edition) : 일반 개발자가 사용하는 자바 표준 배포판
- J2EE (Java Enterprise Edition) : 기업용 애플리케이션을 개발하는데 필요한 여러 도구 및 라이브러리를 모은 것
엔티티의 생명주기
엔티티에는 4가지 상태가 존재한다.
- 비영속(new/transient) : 영속성 컨텍스트와 관계 없는 새로운 상태
- 영속(managed) : 영속성 컨텍스트에 저장(관리)된 상태
- 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제(removed) : 삭제된 상태
비영속
// 객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
JPA랑 관계없이 엔티티 객체를 생성하고 아무것도 하지않은 상태
영속
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
EntityManager em = EntityManagerFactory.createEntityManager();
em.getTransaction().begin(); // 트랜잭션 시작
// 객체를 저장한 상태 (영속)
em.persist(member);
엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장했다.
(persist() 메서드는 DB에 저장하는 것이 아니라 영속성 컨텍스트에 저장하는 것이다.)
(커밋(Commit)하는 시점에 영속성 컨텍스트 안에 있는 것들이 DB에 보내지게 된다.)
영속성 컨텍스트가 관리하는 엔티티를 영속 상태라고 한다.
EntityManager.find() 또는 JPQL을 사용해서 조회한 엔티티도 영속성 컨텍스트가 관리하는 영속 상태이다.
준영속
// 영속성 컨텍스트가 관리하던 영속 상태인 엔티티를 분리 (준영속 상태)
em.detach(member);
영속성 컨텍스트가 관리하던 영속 상태 엔티티를 관리하지 않으면 준영속 상태가 된다.
특정 엔티티를 준영속 상태로 만들려면 EntityManager.detach(entity) 를 사용하면 된다.
또는 EntityManager.close()로 영속성 컨텍스트를 닫거나 EntityManager.clear()로 영속성 컨텍스트를 초기화해도 관리하던 엔티티는 준영속 상태가 된다.
삭제
//객체를 삭제한 상태 (삭제)
em.remove(member);
엔티티를 영속성 컨텍스트와 DB에서 삭제한다.
영속성 컨텍스트 특징
- 1차 캐시
- 동일성(identity) 보장
- 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
- 변경 감지 (Dirty Checking)
- 지연 로딩 (Lazy Loading)
자바 ORM 표준 JPA 프로그래밍 / 김영한 지음 / 에이콘출판주식회사 출판
자바 ORM 표준 JPA 프로그래밍 - 기본편 / 김영한 / 인프런 강의
'Spring > JPA' 카테고리의 다른 글
JPA 플러시(flush())란? (0) | 2022.02.21 |
---|---|
영속성 컨텍스트(Persistence Context) #2 (0) | 2022.02.21 |
EntityManagerFactory와 EntityManager (0) | 2022.02.18 |
JPA 구동 방식 (0) | 2022.02.16 |
hibernate.dialect 란? (0) | 2022.02.16 |