1. 영속성 컨텍스트

    1. JPA가 엔티티(객체)를 관리하는 “임시 저장소” 같은 공간
    EntityManager em = entityManagerFactory.createEntityManager();
    //이때 영속성 컨텓스트가 생성됨 (보이지 않는 공간 em)
    
    1. 특징

      1. 1차 캐시
      @Transactional
      public void example(){
      	User user1 = em.find(User.class, 1L); //DB에서 조회 -> 영속성 컨텍스트에 저장
      	User user2 = em.find(User.class, 1L); //DB 안 가고 영속성 컨텍스트에서 가져옴
      	
      	System.out.println(user1==user2); // true! 같은 객체
      }
      
      1. 장점

        1. DB접근 횟수 줄어서 성능 향상
      2. 단점

        1. 메모리 사용량 증가
      3. 동일성 보장

        1. 위의 예시인user1과 user2는 완전히 동일한 객체 (주소값까지 같음)
      4. 쓰기 지연

        1. 예시
        @Transactional
        public void saveUsers(){
        	User user1 = new User("홍길동");
        	User user2 = new User("김길수");
        	
        	em.oersist(user1); //이것도 아직 DB에 안감! 영속성 컨텍스트에만 저장
        	em.persist(user2); //이것도 당연히 DB에 안감
        	
        	//트랜잭션이 커밋될 때 한번에 DB로 전송됨
        }
        
      5. flush()

        1. 영속성 컨텍스트에서 강제로 DB에 저장
        2. 원래는 메서드가 끝날때 발동되는데 대상을 지정하면 그때마다 적용이 가능 JPQl 실행 전에 발동되지도 함
      6. clear()

        1. 영속성 컨텍스트 완전 비움
        2. flush와 조합하면 메모리 효율적인 대용량 처리가 가능함
  2. 트랜잭션

    1. 정의
      1. DB의 상태를 변경시키는 작업의 단위
      2. 작업중에 하나라도 에러가 나타나면 작업들이 롤백됨
    2. 특징
      1. 원자성
        1. 전부다 반영이 되거나 안된다.
      2. 일관성
        1. DB의 제약조간을 위해하는 작업을 트랜잭션 과정에서 수행할 수 없다.
      3. 독립성
        1. 둘 이상의 트랜잭션이 동시에 변행 실행할때 , 어떤 트랜잭션도 다른 트랜잭션 연산에 관여 불가능하다.
      4. 지속성
        1. 트랜잭션이 성공적으로 완료되었으면, 결과는 영주적으로 반영 되어야 한다.
      5. Commit 연산
        1. 트랜잭션이 성공적으로 수행되었음을 선언하는 연산 → DB에 반영
      6. Rollback연산
        1. 트랜잭션 수행이 실패했음을 선언하고 작업을 취소하는 연산