01강. JPA 소개


2. JPA 소개


JPA?


  • JPA : Java Persistence API
  • Java 진영의 ORM 표준

    💡 ORM?

    • ORM : Object-relational mapping(객체 관계 매핑)
    • 객체는 객체대로 설계(O), 관계형 데이터베이스를 관계형 데이터베이스대로 설계(R) → ORM 프레임워크가 중간에서 매핑(M)
    • 대중적인 언어에는 대부분 ORM 기술이 존재
  • JPA는 애플리케이션과 JDBC 사이에서 동작
    • 기존 : Java 애플리케이션과 DB 소통 위해 개발자가 직접 JDBC API를 개발자가 직접 씀

      → 이걸 JPA가 해줌!

  • JPA 동작 - 저장 (MyBatis와 차이)
    • 마치 Java 컬렉션에 저장하듯이 코드 한 줄만 쓰면 JPA가 패러다임 불일치 해결해줌!!



JPA 소개


  • EJB - 엔티티 빈(자바 표준) : 너무 복잡해서 개발자들이 오히려 안썼다..
  • 하이버네이트 (오픈소스)
  • JPA (자바 표준)



JPA는 표준 명세


  • JPA는 인터페이스의 모음
  • JPA 2.1 표준 명세를 구현한 3가지 구현체
    • 하이버네이트, EclipseLink, DataNucleus



JPA 버전


버전 상세
JPA 1.0(JSR 220) (2006) 초기 버전. 복합 키와 연관관계 기능이 부족
JPA 2.0(JSR 317) (2009) 대부분의 ORM 기능을 포함, JPA Criteria 추가
JPA 2.1(JSR 338) (2013) 스토어드 프로시저 접근, 컨버터(Converter), 엔티티 그래프 기능이 추가



JPA를 왜 사용해야 하는가?


  • SQL 중심적인 개발에서 객체 중심으로 개발
    • 생산성
      • JPA와 CRUD
        • 저장: jpa.persist(member)
        • 조회: Member member = jpa.find(memberId)
        • 수정: member.setName(“변경할 이름”)
        • 삭제: jpa.remove(member)
    • 유지보수
      • 기존: 필드 변경시 모든 SQL 수정
      • JPA: 필드만 추가하면 됨, SQL은 JPA가 처리
    • 패러다임의 불일치 해결

      1.JPA와 상속

      2.JPA와 연관관계

      3.JPA와 객체 그래프 탐색

      4.JPA와 비교하기

      • 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장

          String memberId = "100";
          Member member1 = jpa.find(Member.class, memberId);
          Member member2 = jpa.find(Member.class, memberId);
                    
          member1 == member2; //같다.
        
  • 성능
    • 데이터 접근 추상화와 벤더 독립성
    • 표준



JPA의 성능 최적화 기능


  • 1차 캐시와 동일성(identity) 보장
    • 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
    • DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
  • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
    • INSERT
      1. 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
      2. JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송

         transaction.begin(); // [트랜잭션] 시작em.persist(memberA);
         em.persist(memberB);
         em.persist(memberC);//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.transaction.commit(); // [트랜잭션] 커밋
        
    • UPDATE
      1. UPDATE, DELETE로 인한 로우(ROW)락 시간 최소화
      2. 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋
  • 지연 로딩(Lazy Loading)

    종류 상세
    지연 로딩 객체가 실제 사용될 때 로딩
    즉시 로딩 JOIN SQL로 한번에 연관된 객체까지 미리 조회

Leave a comment