
Java Persistence APIObject-relational Mapping
저장
1. DAO 를 통한 저장 요청 (Persist)
2. @Entity 어노테이션 확인 및 매핑 정보 확인
3. SQL 생성, JDBC API 사용, 패러다임 불일치 해결
4. DB 로 INSERT SQL 전송
조회
1. 객체 그대로 EntityManager 를 통해 find()
2. SELECT SQL 생성, JDBC API 를 사용, ResultSet 매핑, 패러다임 불일치 해소
3. SQL 을 전송하고 결과 반환, 객체 그대로 받음
벤더 독립성 ?
추상화된 접근으로 인해 DB 제공사가 바뀌더라도 (문법이 바뀌더라도) 독립성을 유지하여 코드의 변화가 없음을 의미함.
객체 중심, List 사용과 비슷하게 구현
Create Read Update Delete SQL 중심의 개발은 모든 문장을 수정했어야함 -> JPA 는 필드만 추가하거나 수정하면 모든 SQL 에 반영됨
객체 중심 개발에서의 상속이라는 행위가 DB 에서 구현하기가 힘듦 (슈퍼-서브 타입, SQL 문이 복잡해짐)
JPA 에서는 이러한 객체-RDB 간의 패러다임 불일치를
해소해줌으로써 개발자는 객체 다루듯 데이터를 다룰 수 있게됨.
RDB 에서는 객체 자체의 저장이 불가하나 JPA 는 테이블 안에 객체로 구현한 데이터 안에 객체를 다시 집어넣을 수 있게
자동으로 구현해줌
(예를 들어 Member 객체 안에 Team 객체가 존재하여 member.getTeam() 으로 객체를 불러올 수 있도록 만들어줌)
이렇게 자유로운 객체 그래프 탐색이 가능하게 됨.
슈퍼-서브 타입 데이터 모델링
공통적인 부분을 슈퍼 테이블로 지정하고 다르게 나눠지는 부분을 서브 테이블로 구성하여 DB 에서 상속 기능을 구현한 데이터 모델링 기술이다. 3가지 구현 전략이 있으며 이는 위의 링크에서 확인해보자
JDBC Batch SQL 기능을 통해 한 번에 SQL 처리 (커밋, 플러시 하지 않으면 처리 X)JOIN SQL 로 연관된 객체를 미리 로딩함./META-INF/persistence.xmlpersistence-unit name 속성으로 이름 지정<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>
SQL 표준이 아닌 특정 DB 만의 문법


@Entity : JPA 객체@Id : PK 매핑 (DB) Entity Manager Factory 는 하나만 생성Entity Manager 는 쓰레드 간 공유 XTransaction 안에서만 데이터 작업테이블이 아닌 객체대상으로 검색 (객체 지향 쿼리, 추후 학습)