[JPA] JPA란

신창호·2023년 3월 16일
0

jpa

목록 보기
2/2

  • Java Persistence API
  • 자바 진영의 ORM 기술 표준

ORM

  • Object-Relational Mapping(객체 - 관계형 매핑)
  • 객체는 객체대로 설계, RDB는 RDB대로 설계
  • ORM 프레임워크가 중간에서 매핑
  • 대중적인 언어는 대부분 ORM 기술이 존재함.

JPA

  • JPA는 애플리케이션과 JDBC 사이에서 동작한다.
  • 아래 그림만 봐서는 SQL Mapper와 다를게 없어 보인다.

저장

  • member객체를 저장한다고 하면,
    • JPA에 EntityObject만 던저주면 Entity 분석을 해준다.
    • 분석한 내용을 토대로 INSERT SQL를 만들어 준다.
    • JDBC API를 활용하여 DB와 연결하고
    • 패러다임의 불일치를 해결

조회

JPA란?

  • 오픈소스에서 출발한 기술(실용적인 기술)
  • JPA는 표준명세 인터페이스의 모음이다.
  • 표준명세를 구현한 3가지 구현체
    • 하이버네이트, EclipseLinke, DataNucleus

JPA를 사용하는 이유

  • SQL 중심적인 개발에서 객체 중심으로 개발
  • 생산성
  • 유지보수
  • 패러타임의 불일치 해결
  • 성능
  • 데이터 접근 추상화와 벤더 독립성

생산성

  • 저장, 조회, 수정, 삭제 기능을 jpa로 해결 가능하다
jpa.persist()
jpa.find()
member.setName()
jpa.remove()

유지보수

  • sql문 변경없이 필드만 추가하거나 수정해주면 됨.

패러다임의 불일치 해결

  • jpa 상속/연관관계 /객체 그래프 탐색 /비교하기 다 가능

성능 최적화 기능

  • 1차 캐시와 동일성을 보장
    • 같은 트랜잭션 안에서는 같은 엔티티를 반환한다.

    • SQL문 한번만 실행

      String memberId = "100";
      Member m1 = jpa.find(Member.class, memberId); //SQL
      Member m2 = jpa.find(Member.class, memberId); //캐시
      
      println(m1 == m2) //true
  • 트랜잭션을 지원하는 쓰기 지연
    • 트랜잭션을 커밋할 때까지 Insert SQL을 모은다.

    • JDBC BATCH SQL기능을 사용해서 한번에 SQL전송

      transaction.begin(); // [트랜잭션] 시작
      em.persist(memberA);
      em.persist(memberB);
      em.persist(memberC);//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
      //커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
      transaction.commit(); // [트랜잭션] 커밋
    • Update/ Delete의 경우 로우 락 시간을 최소화해준다.

      transaction.begin(); // [트랜잭션] 시작
      changeMember(memberA);
      deleteMember(memberB);
      비즈니스_로직_수행(); //비즈니스 로직 수행 동안 DB 로우 락이 걸리지 않는다.
      //커밋하는 순간 데이터베이스에 UPDATE, DELETE SQL을 보낸다.
      
      transaction.commit(); // [트랜잭션] 커밋
  • 지연로딩
    • 지연로딩 : 객체가 실제 사용될 때 로딩

    • 즉시로딩 : Join SQL로 한번에 연관된 객체까지 미리 조회

      → 즉시로딩의 경우 한번에 조회를 하기때문에 평소에는 지연로딩상태로 두는 편이다.

      → 하지만, 어차피 모든 데이터가 필요하다면 간혹 즉시로딩도 사용한다.

profile
한단계씩 올라가는 개발자

0개의 댓글