JPA 구동 방식과 JPQL

Hyeon·2023년 6월 14일
0

Server

목록 보기
3/5

JPA 구동 방식

애플리케이션이 실행되면 단 1개의 EntityManagerFactory 가 생성되고, 종료되면 없어진다.

하나의 트랜잭션(쓰레드)가 생성될 때마다 EntityManagerFactory 가 EntityManager을 생성해준다.
JPA의 모든 데이터 변경은 트랜잭션 안에서 실행된다.
EntityManager는 쓰레드 간에 공유하면 안된다. 사용하고 버려야 한다.

JPQL이란?

JPA를 사용하면 SQL 이 아닌 엔티티를 중심으로 개발하게 된다.
JPA는 SQL을 추상화한 객체지향 쿼리언어 JPQL을 제공한다.
SQL과 문법은 유사하다.

JPQL는 엔티티 객체를 대상으로, SQL은 데이터베이스 테이블을 대상으로 쿼리를 날린다.

실습

JPA persistence 설정

src/main/resources/META-INF에 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"/>
            <!-- 옵션 -->
            <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>

각 속성의 의미

javax.persistence.jdbc.~
jdbc url 및 password 등을 설정하는 속성이다.

JPA는 특정 데이터베이스에 종속하지 않는다.
hibernate.dialect 로 H2, MySQL, Oracle 등 각각에 해당하는 데이터베이스 방언을 지정해줄 수 있다.

hibernate.show_sql 는 데이터베이스로 쿼리가 나가는 모습을 터미널을 통해 보여줄 지 설정하는 옵션이다.

hibernate.format_sqlhibernate.show_sql 와 같이 사용되는 옵션으로, 쿼리를 보기 좋게 만들어주는 옵션이다.

hibernate.use_sql_comment 는 쿼리 앞에 /* */ 로 쿼리에 대한 설명을 추가적으로 붙여준다.

hibernate.hbm2ddl.auto 는 데이터베이스 스키마를 애플리케이션 실행 시점에서 자동으로 생성할 수 있도록 설정하는 옵션이다.

  • 설정 가능한 값
    • none : 기본 값이며 아무 일도 일어나지 않는다.
    • create-only : 데이터베이스를 새로 생성한다.
    • drop : 데이터베이스를 drop 한다.
    • create : 데이터베이스를 drop 한 후, 데이터베이스를 새로 생성한다 (기능적으로는 drop + create-only와 같다)
    • create-drop : SessionFactory가 시작될 때 스키마를 drop하고 재생성하며, SessionFactory가 종료될 때도 스키마를 drop 한다.
    • update : 데이터베이스 스키마를 갱신 한다.
    • validate : 데이터베이스 스키마를 검증 한다.

Member Entity 생성

@Entity
@Getter @Setter
public class Member {

    @Id
    private Long id;

    private String name;
}

트랜잭션 코드

public class JpaMain {
    public static void main(String[] args){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();

        EntityTransaction transaction = em.getTransaction();

        transaction.begin();

        try{
            Member member = new Member();
            member.setId(1L);
            member.setName("JPA");

            em.persist(member);

            transaction.commit();
        }catch(Exception e){
            transaction.rollback();
        }finally {
            em.close();
        }
        emf.close();
    }
}

결과

조회

Member member = em.find(Member.class, 1L);

삭제

em.remove(member)

원하는 SQL 작성하기

List<Member> result = em.createQuery("select m from Member m where m.id >= 2", Member.class)
          .setFirstResult(0)
          .setMaxResults(3)
          .getResultList();

참고 자료

김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 을 공부하며 정리한 내용입니다.

profile
컴공학부생입니다.

0개의 댓글