순수하게 JavaSE 환경에서 JPA를 사용하면 개발자가 직접 엔티티 매니저를 생성하고 트랜잭션도 관리해야 하는데,
스프링이나 JavaEE 컨테이너 환경에서 JPA를 사용하면 컨테이너가 제공하는 전략을 따라야 한다.
스프링 컨테이너는
트랜잭션 범위의 영속성 컨텍스트
전략을 기본으로 사용한다.
이 전략은 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝나면 영속성 컨텍스트를 종료한다.
그리고
같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근
한다.

스프링 프레임워크를 사용하면 보통 비즈니스 로직을 시작하는 서비스 계층에
@Transactional
어노테이션을 선언해서 트랜잭션을 시작한다. 외부에서는 단순히 서비스 계층의 메소드를 호출하는 것처럼 보이지만 이 어노테이션이 있으면 호출한 메소드를 실행하기 직전에 스프링의 트랜잭션 AOP가 먼저 동작한다.

스프링 트랜잭션 AOP는 대상 메소드를 호출하기 직전에 트랜잭션을 시작하고, 대상 메소드가 정상 종료되면 트랜잭션을 커밋하면서 종료한다.
이때 트랜잭션을 커밋하면 JPA는 먼저 영속성 컨텍스트를 플러시해서 변경 내용을 DB에 반영한 후에 데이터베이스 트랜잭션을 커밋한다.
따라서 영속성 컨텍스트의 변경 내용이 DB에 정상 반영된다. 예외가 발생하면 트랜잭션을 롤백하고 종료한다.(플러시 호출 X)
//트랜잭션 범위의 영속성 컨텍스트@Controllerclass HelloController{ @Autowired HelloService helloService; public void hello(){ //반환된 member 엔티티는 준영속 상태 ...4 Member member = helloService.logic(); }}