: 데이터베이스의 테이블에 대응하는 클래스
영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공
데이터베이스 커넥션을 사용하여 데이터베이스에 접근한다.
ex)
find() : 영속성 컨텍스트에서 엔티티를 검색하고 영속성 컨텍스트에 없을 경우 데이터베이스에서 데이터를 찾아 영속성 컨텍스트에 저장 ----->SELECT...?
persist() : 엔티티를 영속성 컨텍스트에 저장 ---->INSERT...?
remove() : 영속성 컨텍스트에서 삭제 ----> DELETE...?
flush() : 영속성 컨텍스트에 저장된 내용을 데이터베이스에 반영
엔티티 매니저 인스턴스를 관리하는 주체
애플리케이션 실행 시 한개만 만들어지며, 사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성.
비영속 : new 키워드를 통해 생성된 상태로 영속성 컨텍스트와 관련이 없는 상태
영속 : 엔티티가 영속성 컨텍스트에 저장된 상태로 영속성 컨텍스트에 의해 관리되는 상태
준영속 상태: 영속성 컨텍스트에 엔티티가 저장되었다가 분리된 상태
삭제 상태 : 영속성 컨텍스트와 데이터베이스에서 삭제된 상태
애플리케이션과 데이터베이스 사이에 영속성 컨텍스트라는 중간 계층을 만들어서 버퍼링, 캐싱 등을 할 수 있는 장점이 있다.
1차 캐시
영속성 컨텍스트에는 Map<Key,VALUE>형태의 1차 캐시가 존재한다.
entityManager.find() 메소드 호출 시 영속성 컨텍스트의 1차 캐시 조회.
앤티티 존재시 해당 엔티티 반환, 엔티티 존재 안할시 데이터베이스에서 조회 후 1차 캐시에 저장&반환
동일성 보장
하나의 트랜잭션에서 같은 키값으로 영속성 컨텍스트에 저장된 엔티티 조회 시 같은 엔티티 조회
트랜잭션을 지원하는 쓰기 지연
entityManager.persist() 호출 시 쓰기 지연 SQL문 저장
SQL 싸아두고 트랜잭션 커밋 시점에 FLUSH -> 데이터베이스 반영
성능 이점 굿
변경 감지
1차 캐시에 처음 불러온 엔티티의 스냅샷 값을 갖고 있기에 변경 사항이 있다면 , 자동으로 UPDATE SQL문을 쓰기 지연 SQL저장소에 담는다. 따라서, 따로 UPDATE문 호출 필요X