Java Persistence API 기초

개붕이·2024년 12월 31일

JavaPersistenceAPI

목록 보기
1/6
post-thumbnail

JPA란?

  • Java Persistence API
  • 자바 ORM 표준 (객체 관계 매핑)

ORM

  • Object-relational Mapping
  • 객체는 객체대로 RDB 는 RDB 대로

동작 방식

저장
1. DAO 를 통한 저장 요청 (Persist)
2. @Entity 어노테이션 확인 및 매핑 정보 확인
3. SQL 생성, JDBC API 사용, 패러다임 불일치 해결
4. DBINSERT SQL 전송

조회
1. 객체 그대로 EntityManager 를 통해 find()
2. SELECT SQL 생성, JDBC API 를 사용, ResultSet 매핑, 패러다임 불일치 해소
3. SQL 을 전송하고 결과 반환, 객체 그대로 받음

장점

  • SQL 중심 개발 -> 객체 중심
  • 생산성
  • 유지보수
  • 패러다임 불일치 해결
  • 성능
  • 데이터 접근 추상화
  • 벤더 독립성 (DB 회사에 구애 X)
  • 표준

벤더 독립성 ?

추상화된 접근으로 인해 DB 제공사가 바뀌더라도 (문법이 바뀌더라도) 독립성을 유지하여 코드의 변화가 없음을 의미함.

생산성

객체 중심, List 사용과 비슷하게 구현

  • Create
    • em.persist(Object)
  • Read
    • Object obj = em.find(ID)
  • Update
    • Object.setXXX(Data)
  • Delete
    • em.remove(Object)

유지 보수

SQL 중심의 개발은 모든 문장을 수정했어야함 -> JPA 는 필드만 추가하거나 수정하면 모든 SQL 에 반영됨

패러다임 불일치 해소

객체 중심 개발에서의 상속이라는 행위가 DB 에서 구현하기가 힘듦 (슈퍼-서브 타입, SQL 문이 복잡해짐)

JPA 에서는 이러한 객체-RDB 간의 패러다임 불일치
해소해줌으로써 개발자는 객체 다루듯 데이터를 다룰 수 있게됨.

RDB 에서는 객체 자체의 저장이 불가하나 JPA 는 테이블 안에 객체로 구현한 데이터 안에 객체를 다시 집어넣을 수 있게
자동으로 구현해줌

(예를 들어 Member 객체 안에 Team 객체가 존재하여 member.getTeam() 으로 객체를 불러올 수 있도록 만들어줌)


이렇게 자유로운 객체 그래프 탐색이 가능하게 됨.

슈퍼-서브 타입 데이터 모델링

공통적인 부분을 슈퍼 테이블로 지정하고 다르게 나눠지는 부분을 서브 테이블로 구성하여 DB 에서 상속 기능을 구현한 데이터 모델링 기술이다. 3가지 구현 전략이 있으며 이는 위의 링크에서 확인해보자

성능

  1. 1차 캐싱, 동일성 보장
    • 1차 캐시에 같은 엔티티를 조회하면 캐시 속 데이터를 반납 (이중 Read X)
    • 같은 엔티티를 비교했을 경우 동일성을 보장받을 수 있음 (동일 Transaction 내에서)
  2. 쓰기 지연
    • JDBC Batch SQL 기능을 통해 한 번에 SQL 처리 (커밋, 플러시 하지 않으면 처리 X)
    • 비즈니스 로직 중에 rowLock 이 걸리지 않음 (Batch Sql)
  3. 지연 로딩
    • Entity 를 조회했을 때 객체를 조회하게 되면 사용 했을 때 객체를 조회하고 로딩하여 성능상 이점을 가짐
    • [반] 즉시 로딩: JOIN SQL 로 연관된 객체를 미리 로딩함.

JPA 구현체, Hibernate 실습 (6.6.4 Final)

  • JPA 설정 파일 path : /META-INF/persistence.xml
  • persistence-unit name 속성으로 이름 지정
  • jakarta 로 시작 : JPA 표준
  • hibernate 로 시작 : 하이버네이트 속성
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
             version="3.0">
    <persistence-unit name="jpaShop">

        <class>jpabook.jpashop.domain.Member</class>
        <class>jpabook.jpashop.domain.Order</class>
        <class>jpabook.jpashop.domain.OrderItem</class>
        <class>jpabook.jpashop.domain.Item</class>

        <properties>
            <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/jpashop"/>
            <property name="jakarta.persistence.jdbc.user" value="유저네임"/>
            <property name="jakarta.persistence.jdbc.password" value="비밀번호"/>

            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            
        </properties>

    </persistence-unit>


</persistence>

DB Dialect (DB 방언)

SQL 표준이 아닌 특정 DB 만의 문법

JPA 구동 방식

  • @Entity : JPA 객체
  • @Id : PK 매핑 (DB)
  • Entity Manager Factory 는 하나만 생성
  • Entity Manager 는 쓰레드 간 공유 X
  • Transaction 안에서만 데이터 작업

JPQL

테이블이 아닌 객체대상으로 검색 (객체 지향 쿼리, 추후 학습)

profile
based on the record

0개의 댓글