영속성 컨텍스트
"엔티티를 영구 저장하는 환경"이란 뜻을 가진 논리적인 공간.
애플리케이션과 데이터베이스 사이에서 객체를 관리, 조작한다. 엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있다.
EntityManager.persist(entity)
엔티티 매니저를 생성하면 한 개의 영속성 컨텍스트가 생긴다.
엔티티생명주기
ex) persist(), flush() ... 등 → EntityManger에 의해 호출되는 함수
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차 캐시란?
영속성 컨텍스트 내부에 있는 공간
애플리케이션에서 저장한 객체를 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이다.
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