JPA

-Java Persistence API

자바 진영의 ORM 기술 표준

Untitled

![Untitled](<https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e6093da2-0a48-410e-9c7f-a9668cbaa979/Untitled.png>)

ORM

-Object-relational mapping(객체 관계 매핑)

한마디로 말하자면, rdb와 자바를 매핑해주는 프레임워크

JPA의 성능 최적화 기능

  1. 1차 캐시와 동일성(identity)보장

  2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)

    transaction.begin(); //트랜잭션 시작
    em.persist(memberA);
    em.persist(memberB);
    em.persist(memberC);
    //여기까지 INSERT SQL을 DB에 보내지 않고 있다가
    
    //커밋하는 순간 DB에 보낸다.
    transaction.commit();
    

    → 옵션 하나만 켜주면 알아서 최적화를 해준다.

  3. 지연 로딩(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을 가져올 수 있도록 하는 옵션이 있다.
    //이 옵션을 껐다켜서 해결이 가능하다.
    

지연로딩으로 먼저 다 짜놓고 최적화를 통해서 즉시 로딩을 섞어주는 방식으로 저자는 코딩을 하였다.