JPA가 제공하는 기능은 크게 Entity와 Table을 매핑하는 설계 부분과 매핑한 엔티티를 실제 사용하는 부분으로 나눌 수 있다. 매핑한 엔티티를 엔티티 매니저를 통해서 다룰 수 있다. 저장/수정/삭제/조회 등 엔티티와 관련된 모든 일을 엔티티 매니저가 처리를 한다.
엔티티 매니저는 엔티티 매니저 팩토리를 이용해서 생성할 수 있다. DB를 하나만 사용하는 Application은 일반적으로 EntityManagerFactory를 하나만 생성한다. 이유는 팩토리를 생성하는데 상당히 많은 리소스를 소비해야 하기 때문이다. 엔티티 매니저를 생성하는 비용은 거의 들지 않는다. 그리고 엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하므로 서로 다른 스레드 간에 공유해도 문제가 되지 않지만, 엔티티 매니저의 경우는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대! 공유하면 안된다.
n개의 요청(스레드)이 하나의 엔티티 매니저 팩토리를 공유하하며 각각의 요청은 하나의 엔티티 매니저를 생성하고 사용한다. 생성하는 시점에서 바로 Connection Pool에서 Connection 객체를 가져와서 DB와의 연결을 맺는 것이 아니고, 트랜잭션이 시작하는 시점에 커넥션을 맺는다.(지연 연산?)
엔티티를 영구적으로 저장하는 환경을 의미한다.
아래의 코드를 보면 Memeber 객체를 member 테이블에 저장했다고 생각하고 이해할 수 있다. 하지만, 실질적으로 그렇지 않다.
em.persist(member);
영속성 컨텍스트는 논리적인 개념에 가깝고 EntityManager가 하나 생성될 때, 함께 생성된다. 그리고 일련의 작업 결과물이 영속성 컨텍스트에 저장이 되고 Flush || Commit 되는 시기에 실 DB에 반영되는 구조이다.