본문 바로가기

Dev/JPA

RS) JPA(Java Persistence API)

  1. 자바 진영의 ORM 기술 표준
  2. JPA를 구현하는 대표적인 구현체 하이버네이트, EclipseLink, DataNucleus -> 하이버네이트가 대표적이므로 구현체로 하이버네이트를 쓴다고 생각하자!

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

  • 객체는 객체대로 설계
  • 관계형 데이터베이스는 관계형 데이터베이스대로 설계
  • 중간에서 ORM 프레임워크가 매핑 작업

  • 개발자가 직접 JDBC를 사용하는 것이 아니라 JPA가 중간에서 이 역할을 대신한다.

JPA 저장 동작

  • MemberDAO에서 데이터를 저장할 경우
    • JPA에게 Member 객체를 넘긴다.
    • JPA가 Member 객체를 분석해서 적절한 INSERT쿼리를 생성
    • JPA가 JDBC API를 사용하여 DB에 보내고 결과(ResultSet)를 받는다.

JPA 조회 동작

  • MemberDAO에서 조회를 할 경우
    • JPA에 찾으려는 id값을 보낸다.
    • JPA는 SELECT 쿼리를 작성해서 DB에서 결과를 반환해온다.
    • 패러다임 불일치를 해결한다.

JPA를 사용하는 이유?

  • Java Persistence 에 넣어주면 알아서 튀어나온다!

생산성

  • 저장 : jpa.persist(member)
  • 조회 : Member member = jpa.find(memberId)
  • 수정 : member.setName("변경할 이름")
  • 삭제 : jpa.remove(member)

유지보수

  • 쿼리를 따로 손댈 필요없이 컬럼이 추가되거나 삭제되어도 해당 컬럼만 수정해주면 된다.
  • JPA에 필드만 추가하면 되고, SQL은 JPA가 처리한다.

패러다임의 불일치 해결

  • JPA와 상속 - 저장
    • 개발자가 할일 : jpa.persist(album);
    • 나머진 JPA가 처리
      • INSERT INTO ITEM ...
      • INSERT INTO ALBUM ...
  • JPA와 상속 - 조회
    • 개발자가 할일 : Albeum album = jpa.find(Album.class, albumId);
    • 나머진 JPA가 처리
      • SELECT I. *, A. *
      • FROM ITEM I
      • JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID
  • JPA와 연관관계, 객체 그래프 탐색
    • JPA는 지연로딩이라는 기능이 있어서 자유롭게 객체를 탐색 할 수 있다.
    • JPA를 통해 가져오는 데이터는 믿을 수 있는 데이터가 된다.

  • JPA에서는 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.
  • 즉, 같은 트랜잭션에서 조회할 경우에는 자바 컬렉션을 통해서 꺼내오는 것처럼 member1 == member2가 같다는 것이 보장된다는 뜻

JPA의 성능 최적화 기능

  • 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 조회 성능 향상

  1. 첫번 째로 조회 호출할 경우 SQL을 통해 디비에 들려서 값을 가져온다.
  2. 동일한 호출이 있을 경우 캐싱을 통해 데이터를 보관하고 있고, 따로 디비에 들리지않고 바로 값을 반환해준다.
  3. SQL을 1번만 실행한다.
  4. DB Isolation Level을 한단계 낮춰준다.

트랜잭션을 지원하는 쓰기 지연(버퍼링 기능)

  • 트랜잭션을 커밋할 때까지 INSERT SQL을 모아둔다.
  • 커밋하는 순간 JDBC BATCH SQL을 기능을 사용하여 한번에 SQL을 전송한다.

 

지연 로딩과 즉시 로딩

  • 지연 로딩 : 객체가 실제 사용될 때 로딩
  • 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
  • ex) 쿼리를 따로 보내서 실제 사용되는 경우에만 내보낼 경우 지연로딩
  • ex) Member를 사용할 때 Team을 같이 사용해야 하는 경우가 99% 이상이다 일 경우 즉시 로딩을 사용한다.

JPA에서는 스위치 끄고 켜듯이 옵션을 통해 제어할 수 있다.

JPA를 잘 쓰기 위해서는 ORM만 잘 알아야한다기 보다는 RDB도 놓지말고 지속적인 학습이 필요하다


그림 출처

'Dev > JPA' 카테고리의 다른 글

RS) 영속성 컨텍스트  (0) 2022.02.01
RS) JPA 어플리케이션 실습  (0) 2022.02.01
RS) SQL 중심적인 개발의 문제점  (0) 2022.02.01
JPA의 사용  (0) 2021.04.09
프록시와 연관관계 관리  (0) 2020.08.08