[SPRING #10 JPA] 영속성 컨텍스트
영속성 컨텍스트
"엔티티를 영구 저장하는 환경"이란 뜻을 가진 논리적인 공간.
애플리케이션과 데이터베이스 사이에서 객체를 관리, 조작한다. 엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있다.
EntityManager.persist(entity)
엔티티 매니저를 생성하면 한 개의 영속성 컨텍스트가 생긴다.
엔티티생명주기
ex) persist(), flush() ... 등 → EntityManger에 의해 호출되는 함수
- 비영속 (new / transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태
- 영속 (managed) : 영속성 컨텍스트에 저장된 상태
- 준영속 (detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제 (removed) : 삭제된 상태
Member member = new Member();
member.setId("member1");
member.setName(eun");
EntityManager em = emf.createEntityManager(); //emf = 엔티티 매니터 팩토리
em.persist(member); //객체를 영속성 컨텍스트 내에 저장
준영속
em.detach(member); //member 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
삭제
em.remove(member); //객체를 삭제한 상태(삭제)
영속성 컨텍스트 이점
- 1차 캐시
- 동일성(identity) 보장
- 트랜잭션을 지원하는 쓰기 지연
- 변경 감지(Dirty Checking)
1차 캐시란?
영속성 컨텍스트 내부에 있는 공간
애플리케이션에서 저장한 객체를 1차 캐시에 저장. 이후 해당 객체를 DB에서 조회할 때 1차 캐시에 있는지 먼저 확인 후, 존재한다면 1차 캐시에 있는 객체 반환
DB에서 단순 조회만 해도 1차 캐시에 저장
동일성 보장?
트랜잭션을 지원하는 쓰기 지연?
위의 코드를 보면, em.persist(member)가 =====의 사이가 아닌 커밋을 만난 순간 실행되는 것을 볼 수 있다.
em.persist시 쓰기 지연 SQL 저장소에 member에 대한 Insert문이 쌓이다가 commit을 만난 순간 flush된다.
변경 감지?
Member member1 = em.find(Member.class,10);
member1.setName("updateName");
위에서 DB에서 조회만 해도 1차 캐시에 쌓인다고 했다.
위에서 member1의 이름을 바꿔주면 commit or flush를 하게 되면 1차 캐시 내에 있는 스냅샷과 저장돼있는 Entitiy를 비교하여 변경된 값에 대한 Update문을 스스로 만들어서 DB에 날리게 된다.
Spring Repository 와 Entity 영속성 컨텍스트의 관계 파악
레포지토리를 만들 때 스프링에서 JPA의 JpaRepository 인터페이스만 상속하였다. 스프링에서 기본 구현체를 제공해 주기 때문이다.
스프링 데이터 JPA에서 제공하는 JpaRepository 인터페이스의 기본 구현체는 SimpleJpaRepository이다.
Spring Repository 와 EntityManager 관계
- 하나의 서비스에서 (같은 스레드) 여러 개의 repository 를 호출한다고 해보자.
- 2개의 repository 는 1개의 EntityManager 를 공유하게 됨.
같은 스레드에서 순차적으로 호출할테니 동시성 문제가 없다.
Spring 에서 Entity 변경 시, 일어나는 과정
Controller —> Service —> Repository select, save 호출 이라고 가정.
Controller 에는 Transaction 설정이 안돼있다면 Repository.save 를 호출하는 순간 Transaction 이 만들어지고 자동으로 커밋이 이루어질 것이다.
왜냐하면 Spring Data Jpa 에서 제공해주는 JpaRepository 구현체는 SimpleJpaRepository 이며, save 메소드에는 @Transactional 이 설정돼있다.
참고자료
https://kim-solshar.tistory.com/67
https://insanelysimple.tistory.com/238
https://tosuccess.tistory.com/195
Author And Source
이 문제에 관하여([SPRING #10 JPA] 영속성 컨텍스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@eunseo2/JPAJava-Persistence-API-영속성-컨텍스트저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)