JPA = 자바의 표준 ORM(Object Relational Mapping)
Java 진영의 ORM 기술에 대한 API 표준 명세이고 사용하기 위해서는 JPA를 구현한 ORM 프레임워크(하이버네이트, EclipseLink등)를 선택해야한다.
DB에 매핑될 객체
Entity들을 관리하는 인터페이스
Entity Manger를 생성
Entity를 관리하는 공간
영속성 컨텍스트와 DB와 연결 해줌
데이터베이스 연결을 위한 설정
e.g. JDBC 드라이버, URL, 사용자 이름, 비밀번호등
원래 persistence.xml로 설정해야하나
스프링에서는 properties나 yml로 설정가능
spring:
datasource:
url: jdbc:mysql://localhost:3306/bookmoa?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username:
password:
driver-class-name: com.mysql.cj.jdbc.Driver

영속성 컨텍스트는 엔티티 인스턴스를 효율적으로 관리하는 공간이다
엔티티와 그 식별자가 Map 형태로 저장되어 있는 캐시
1차 캐시에 엔티티가 있다면 DB 접근 없이 연산을 수행할 수 있다
Entity instence에 대한 쿼리를 바로 DB로 보내지 않고
1차 캐시에만 변경을 반영하고 쿼리는 쓰기 지연 저장소에 모아둔다
이렇게 되면 '1차 캐시 - DB'간에 불일치가 발생하는데
이를 동기화(flush) 시켜줄 때 모아두었던 쿼리를 한번에 DB로 보낸다
자동으로 변경을 감지해주는 것
JPA는 Entity가 영속성 컨텍스트에 처음 들어올 때 그 상태를 복사해 저장한다.(스냅샷)
flush를 하기전, 스냅샷과 현재 상태를 비교해서 UPDATE 쿼리를 쓰기 지연 저장소에 추가한다.
영속성 컨텍스트를 통해 DB접근을 줄여주는 것이 ORM의 주요 역할 중 하나이다