JPA 기본 원리
jpa 알아보기 참고하기
https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/ Hibernate, DataNucleus, EclipseLink, Spring Data JPA, OpenJPA, ObjectDB, TopLink Essential
JPA는 무엇?
- Java Persistance API
- Java 진형 ORM 기술 표준 (ORMObject-Relational Mapping : 객체과 RDB를 매핑한다) 명세
-
사용하는 이유, 필요성, 장점 그리고 어려움
- SQL에서의 자유 == productivity
- 기존 SQL 의존적 개발은 양단의 패러다임이 일치하지 않는다. 즉, 객체 지향 언어인 JAVA가 관계 지향 언어를 사용하는 RDB에 의존하고 휘둘린다.
- 끊임없이 반복되는 sql 작성 및 무의미한 반복작업 등 에서 벗어날 수 있음.
- 진정한 객체 중심 개발 가능. sql 작성은 JPA에 맞기고 객체설계와 매핑만 잘 해주면 됨.
- 유지보수의 용이(db가 바뀌어도 약 40가지 sql dielect에 대응할 수 있음.)
- 성능
- 표준(java 진영 orm 표준임.)
내부 동작 원리
기능
- 엔티티와 테이블을 매핑하는 설계 활용의 기능
- 매핑한 엔티티를 사용 기능
영속성
- 패키지 : javax.persistence.*의 EntityManager
- EntityManager : 엔티티 관리자 - 엔티티의 저장,조회,수정 과 삭제 등.
- 엔티티를 저장하는 가상의 데이터베이스로 생각해도 무방.
EntityManager
설정(maven 기준)
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="hello">
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value=""/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost:9092/~/data/test"/>
<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.use_sql_comments" value="true"/>
<!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
</persistence>
EntityManager 실 사용 코드
package my_package;
import javax.persistence.*;
import java.util.List;
public class JpaMain {
public static void main(String[] args) {
//비용이 크다
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");// db당 하나만 생성
EntityManager em = emf.createEntityManager();//요청마다 생성후 삭제되어야 함. 쓰레드간의 공유는 안돼.
EntityTransaction tx = em.getTransaction();// JPA 모든 데이터 변경은 트랜잭션 안에서 발생되어야 함.
tx.begin();
try{
//code
tx.commit();
}catch (Exception e){
tx.rollback();
}finally {
em.close();
}
emf.close();
}
}
EntityManager 생성과 db 커넥션 다이어그램 등.
영속성 컨텍스트
- 엔티티를 영구 저장하는 환경
- 엔티티 매지저는 영속성 컨텍스트에 엔티티를 보관/관리한다.
- 엔티티의 생명주기 : 비영속(new/transient), 영속(managed), 준영속(detatched), 삭제(removed)
특징
- 영속 상태는 식별자 값이 반드시 있어야 한다. 없으면 예외발생
- 트랜잭션을 커밋하는 순간에 쌓아두었던 엔티티를 데이터베이스에 반영한다.(플러시flush)
- 장점
- 1차 캐시: 이미 영속성 컨텍스에 존재하는 데이터에 대해 트랜잭션 내(內)여러번 조회하지 않음. 실무에서는 장점으로 활용되는 게 드물다고 한다.
- 동일성 보장 : 같은 데잍터에 대해 여러 엔티티라도 같은 참조값을 가지기 때문에 같은 엔티티가 된다.
- 트랜잭션을 지원하는 쓰기 지연 : 트랜잭션 전까지 ‘쓰기지연sql’을 이용한다.
- 변경감지 : 영속성컨텍스트 트랜잭션 내에 엔티티에 변경에 대해 자동으로 감지하여 update문을 날린다.
- 지연 로딩 : 간단한 설정으로 여러 db를 조인한 엔티티에 대하여 직접 해당 엔티티에 get메소드 등을 이용한 접근일 일어날 때, 조회가 발생한다.
영속상태의 영속성 컨텍스트 다이어 그램
- 순서와 상관없이 그려졌다.
- flush가 일어나는 지점 : commit, query 가 날라갈 때
Comments