영속성 컨텍스트

w1nd0·2024년 4월 26일

JPA

목록 보기
4/18

영속성 컨텍스트

"엔티티를 영구 저장하는 환경"

EntityManager.persist(entity);

DB에 저장한다는 코드가 아니라 영속성 컨텍스트에 저장한다는 뜻

영속 / 비영속 상태?

영속 상태란?

User user = new User();
user.setId(1L);
user.setName("userA");

현재 객체를 생성만 하고 영속성 컨텍스트에 저장하지 않은 상태이기에 비영속성이다.

EntityManager em = emf.createEntityManager();
...
User user = new User();
user.setId(1L);
user.setName("userA");

em.persist(user);

em(영속 컨텍스트)에 persist(영속성 컨텍스트에 저장)하여 user는 영속성 객체가 됨, 이제부터 JPA가 관리하는 객체라는 것이다.

하지만 영속성 컨텍스트에 저장한다고 바로 DB에 저장되지 않는다.

tx.commit();

트랙젝션이 종료하는 시점에 커밋이되어 DB에 insert문이 날라가 저장된다.

즉 em.pserist는 DB에 저장하는 save메서드가 아니다.

영속성 컨텍스트 1차 캐시

em.persist(user);

User findUser = em.find(User.class, user.getId);

persist하면 1차캐시에 저장된다.

find로 user를 찾게 되면 먼저 DB에서 찾지 않고 1차 캐시를 먼저 확인한다.

만약 캐시에 값이 없는 경우 DB에서 1차캐시로 가져온 후 반환한다.

단 애플리케이션 전체에서 공유하는 캐시X 하나의 트랙젝션에서만 유지하기에 굉장히 짧은시간 유지하는 캐시이다.

영속성 엔티티 동일성 보장

User A = em.find(User.class, 1L);
User B = em.find(User.class, 1L);

A == B = true

같은 트랙젝션 안에서 userA와 userB는 같은 객체로 동일성을 보장한다.

쓰기 지연

EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();

엔티티 매니저는 데이터 변경시 트랜잭션 안에서 이뤄져야 한다.

tx.begin(); //트랜잭션 시작

em.persist(userA);
em.persist(userB);

persist는 영속성 컨텍스트에 저장하는 거지 DB에 커밋하여 저장하는 메서드가 아니다.

tx.commit(); 

커밋(commit)으로 DB 반영 동시에 트랙잭션 종료가 된다.

변경 감지

플러시 발생(flush();)

변경하고 싶은 엔티티 조회 하여 영속석 컨텍스트에 가져온 후, 변경 점 체크
-> 변경 감지
-> 쓰기 지연 SQL 저장소 등록
-> 변경 사항 commit (이때 Query문이 나간다.)

JPA 변경 감지 정리 글... 이게 맞나..? 나중에 수정될 수 있음

출처 / 참고: Iflearn 김영한 강사님 강의

profile
eozzeo_lago_

0개의 댓글