JPA Start

jyKim·2023년 3월 21일
0

JPA

목록 보기
3/7

데이터베이스 방언(Dialect)

  • DB 별로 제공하는 SQL 문법 과 기능은 차이가 있다.

    • ex) MySQL VARCHAR, Oracle VARCHAR2
    • MySQL AutoIncrement, Oracle Sequence etc..
  • 방언(Dialect) -> SQL 표준을 지키지 않는 특정 DB만의 고유한 기능

  • JPA는 특정 데이터베이스에 종속되지 않는다. -> Dialect를 통해 지정한 DB의 SQL 생성

  • 이는 hibernate.dialect 속성에서 지정할 수 있다.

    • H2 : org.hibernate.dialect.H2Dialect
    • Oracle 19c : org.hibernate.dialect.Oracle12cDialect
    • MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
    -> 같은 DB 일지라도 버전에 따라 Dialect가 다르니 주의가 필요.

  • JPA Dialect Architecture

  • persistence.xml

    <?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="sa"/>
                <property name="javax.persistence.jdbc.password" value=""/>
                <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
                <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
    
                <!-- JPA SQL 표현 옵션 -->
                <property name="hibernate.show_sql" value="true"/>
                <!-- format 보기 쉽도록 -->
                <property name="hibernate.format_sql" value="true"/>
                <!-- SQL 주석 표현 옵션 -->
                <property name="hibernate.use_sql_comments" value="true"/>
            </properties>
        </persistence-unit>
    </persistence>

JPA 동작 방식

  • Persistence 설정 정보를 읽은 후 EntityManagerFactory를 생성하고 필요에 따라서 EntityManager를 생성하여 작업 수행. (각 구성요소는 이후 별도 포스팅)
  • JPA Architecture

주의점

  • 엔티티 매니저 팩토리는 하나만 생성하여 애플리케이션 전체에서 공유
  • 엔티티 매니저는 쓰레드간에 공유해선 안된다 (사용 후 버려야 한다.)
  • JPA의 모든 데이터 변경은 트랙잭션 안에서 실행해야한다.
// 사용 예시
public static void main(String[] args) {
	EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    
    // transaction start
    tx.begin();
    try {
    	// select
        Member findMemeber = em.find(Member.class, 1L);
        // JPQL select
        List<Member> result = em.createQuery("SELECT m from Member as m", Member.class)
        							.getResultList();
        // update
        findMember.setName("HelloJpa");
        // insert
        Member m2 = new Member();
        m2.setId(2L);
        m2.setName("Member2");
        em.persist(m2);
		
        tx.commit();
    } catch (Exception e){
        tx.rollback();
    } finally {
        em.close();
    }
    emf.close();
}
profile
백엔드애옹

0개의 댓글