1 minute read

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