-Java Persistence API
자바 진영의 ORM 기술 표준
JAVA application 과 JDBC 사이에서 동작.
JPA 동작
Entity Object(멤버 객체) 맴버 객체를 J
진짜 중요한 부분은 패러다임의 불일치를 해결해준다는 것이다!!!
JPA는 객체를 보고 적절한 sql문을 매핑해줌.
과거에도 ORM이 있었다. EJB라는 엔티티 빈이 있었지만 너무 성능도 안나오고 구려서 **하이버네이트(오픈소스)**를 개발자가 개발했고, 많은 사람들이 동참하면서 하이버 네이트가 커졌다. 그래서 이것을 JAVA에서 가져와서 만든 것이 JPA이다.

-Object-relational mapping(객체 관계 매핑)
한마디로 말하자면, rdb와 자바를 매핑해주는 프레임워크
1차 캐시와 동일성(identity)보장
같은 트랜잭션 안에서는 같은 엔티티를 반환한다. → 약간의 조회 성능 향상
DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장.
크게 중요하지 않으니 그냥 참고하고 넘어가라
트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
transaction.begin(); //트랜잭션 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//여기까지 INSERT SQL을 DB에 보내지 않고 있다가
//커밋하는 순간 DB에 보낸다.
transaction.commit();
→ 옵션 하나만 켜주면 알아서 최적화를 해준다.
지연 로딩(Lazy Loading)
Member member = memberDAO.find(memberId);// 1 SELECT * FROM MEMBER
Team team = member.getTeam(); // 2
String teamName = team.getName();// 3 SELECT * FROM TEAM
//member와 team이 연관된 객체일때, memberDAO.find()를 사용하여
//member와 team을 가져오는 것을 보장하지만
//사용되는 시점인 3번에서 SELECT를 통해서 Team을 가져온다.
Member member = memberDAO.find(memberId);
Team team = member.getTeam();
String teamName = team.getName();
//지연로딩의 경우 쿼리를 2번 쓰는데, 만약 코딩을 해봤더니
//높은 확률로 member와 team을 조인해서 같이 쓴다면
//member를 조회할때 항상 team을 가져올 수 있도록 하는 옵션이 있다.
//이 옵션을 껐다켜서 해결이 가능하다.
지연로딩으로 먼저 다 짜놓고 최적화를 통해서 즉시 로딩을 섞어주는 방식으로 저자는 코딩을 하였다.