Open tonykang22 opened 1 year ago
일반적인 웹 애플리케이션
엔티티 매니저 팩토리
엔티티 매니저
영속성 컨텍스트
엔티티를 영구 저장하는 환경
em.persist(member)
회원 엔티티를 저장 한다
엔티티 매니저를 사용해 회원 엔티티를 영속성 컨텍스트에 저장한다.
엔티티의 생명주기
비영속
영속
준영속
삭제
em.persist() 호출 전
em.persist() 호출 후
em.detach();
em.close();
em.clear();
flush
1차 캐시
@Id
em.find()
트랜잭션을 지원하는 쓰기 지연
회원 A를 영속화한 상태
회원 B도 영속화한 상태, 쓰기 지연 SQL 저장소에 쿼리가 쌓인다.
커밋했을 때
변경 감지
스냅샷
em.remove(A)
em.flush()
javax.persistence.FlushModeType
FlushModeType.AUTO
FlushModeType.COMMIT
em.detach(A)
em.clear()
em.close()
merge()의 동작 방식
3장. 영속성 관리
엔티티 매니저 팩토리와 엔티티 매니저
엔티티 매니저 팩토리
는 생성 비용이 매우 크기 때문에 애플리케이션에서 하나의 데이터베이스를 사용한다면 단 한 개만 생성한다.엔티티 매니저
는 생성 비용이 거의 들지 않는다.엔티티 매니저 팩토리
는 여러 스레드가 동시에 접근해도 안전하므로 서로 다른 스레드 간에 공유해도 된다.엔티티 매니저
는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하기 때문에 스레드 간에 절대 공유하면 안된다.엔티티 매니저
는 데이터베이스 연결이 꼭 필요한 시점까지 커넥션을 얻지 않는다.영속성 컨텍스트란?
영속성 컨텍스트
(Persistence Context)라는 용어가 JPA를 이해하는데 가장 중요한 키워드라 할 수 있다.엔티티를 영구 저장하는 환경
이라는 뜻으로 번역할 수 있다.영속성 컨텍스트
에 엔티티를 보관하고 관리한다.em.persist(member)
는회원 엔티티를 저장 한다
라고 생각하면 정확한 이해는 아니다.엔티티 매니저를 사용해 회원 엔티티를 영속성 컨텍스트에 저장한다.
이다.엔티티의 생명주기
비영속
(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 상태영속
(managed): 영속성 컨텍스트에 저장된 상태준영속
(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태삭제
(removed): 삭제된 상태비영속
영속
준영속
em.detach();
호출을 하면 된다.em.close();
), 영속성 컨텍스트를 초기화해도 (em.clear();
) 관리되던 엔티티는 준영속 상태가 된다.삭제
영속성 컨텍스트의 특징
flush
라 한다.엔티티 조회
1차 캐시
라 한다.@Id
로 매핑한 식별자, 값은 엔티티 인스턴스라고 생각하면 된다.em.find()
를 호출하면 먼저 1차 캐시에서 엔티티를 찾아보고, 없다면 데이터베이스에 조회하게 된다.엔티티 등록
트랜잭션을 지원하는 쓰기 지연
(transactional write-behind)이라고 한다.flush
: 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 작업이다.트랜잭션을 지원하는 쓰기 지연이 가능한 이유
엔티티 수정
변경감지
변경 감지
(dirty checking): 엔티티의 변경 사항을 데이터베이스에 자동으로 반영하는 기능스냅샷
이라 한다.엔티티 삭제
em.remove(A)
를 호출한 순간 A는 영속성 컨텍스트에서 제거된다.플러시
em.flush()
를 직접 호출한다.플러시 모드 옵션
javax.persistence.FlushModeType
을 통해 엔티티 매니저의 플러시 모드를 직접 지정할 수 있다.FlushModeType.AUTO
: 커밋이나 쿼리를 실행할 때 플러시 (기본값)FlushModeType.COMMIT
: 커밋할 때만 플러시준영속
em.detach(A)
: 특정 엔티티(A)만 준영속 상태로 전환한다.em.clear()
: 영속성 컨텍스트를 완전히 초기화한다.em.close()
: 영속성 컨텍스트를 종료한다.준영속 상태의 특징
병합: merge()