티스토리 뷰

BackEnd/JPA 스터디

[JPA 스터디 1주차] - JPA 시작

영지는 달리는중 2021. 6. 24. 22:50

개요

예제 프로젝트를 통해 Hibernate를 사용해보자

 

Persistence.xml 설정

: 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="study">
        <properties>
            <!-- H2 필수 속성 -->
            <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/C:/Users/evo/Database/h2/study"/>
            <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.jdbc.batch_size" value="10"/>
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>
    </persistence-unit>
</persistence>
    </persistence-unit>
</persistence>

속성을 보면 java 표준 속성(javax.persistence), 하이버네이트 속성(hibernate)로 나뉜다.

하이버네이트에서는 데이터베이스의 방언을 설정하게 된다.

데이터베이스 방언(=dialect)란? SQL 표준을 지키지 않거나, 특정 데이터베이스만의 고유한 기능

 

2. 애플리케이션에서 사용하기

public class JpaMain {

    public static void main(String[] args) {

        //엔티티 매니저 팩토리 생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
        EntityManager em = emf.createEntityManager(); //엔티티 매니저 생성

        EntityTransaction tx = em.getTransaction(); //트랜잭션 기능 획득

        try {


            tx.begin(); //트랜잭션 시작
            logic(em);  //비즈니스 로직
            tx.commit();//트랜잭션 커밋

        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback(); //트랜잭션 롤백
        } finally {
            em.close(); //엔티티 매니저 종료
        }

        emf.close(); //엔티티 매니저 팩토리 종료
    }

    public static void logic(EntityManager em) {

        String id = "id1";
        Member member = new Member();
        member.setId(id);
        member.setUsername("지한");
        member.setAge(2);

        //등록
        em.persist(member);

        //수정
        member.setAge(20);

        //한 건 조회
        Member findMember = em.find(Member.class, id);
        System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());

        //목록 조회
        List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
        System.out.println("members.size=" + members.size());

        //삭제
        em.remove(member);

    }
}

EntityManagerFactory

: JPA 구현체에 따라 데이터베이스 커넥션 풀도 생성하므로 생성 비용이 크다. 그러므로 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한번만 생성되고 공유해서 사용해야 한다.

커넥션 풀이란? 데이터베이스와 연결된 커넥션을 미리 만들어 풀 속에 저장해 두었다가 필요할 떄 커넥션을 풀에서 쓰고 다시 반환하는 기법 또는 미리 생성한 커넥션을 모아놓은 집합

EntityManager

: 데이터베이스에 등록/수정/삭제/조회를 할 수 있다. 엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용될 수 없다. 또한 트랜잭션을 시작할 때 커넥션을 획득한다. 트랜잭션이 수행된 후에는 반드시 닫고 DB 커넥션을 반환한다

Transaction

: 데이터의 모든 변경은 트랜잭션 안에서만 실행 가능하다.

  EntityTransaction tx = em.getTransaction(); //트랜잭션 기능 획득

        try {


            tx.begin(); //트랜잭션 시작
            logic(em);  //비즈니스 로직
            tx.commit();//트랜잭션 커밋

        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback(); //트랜잭션 롤백
        } finally {
            em.close(); //엔티티 매니저 종료
        }

        emf.close(); //엔티티 매니저 팩토리 종료

정상 동작 후에는 트랜잭션을 커밋, 예외가 발생하면 롤백한다.

BuisnessLogic

: 엔티티를 하나 생성한 다음 엔티티 매니저를 통해 데이터베이스에 등록, 수정, 삭제, 조회 한다. 수정 시 update()와 같은 메소드를 호출 할 필요 없이 값을 변경하면 알아서 데이터베이스에 반영된다. 추후 영속성 컨텍스트에서 자세히 알아보자

3. JPQL

: JPA는 SQL을 추상화한 Java Persistence Query Language라는 객체지향 쿼리 언어를 제공한다.

  • JPQL : 엔티티 객체를 대상으로 쿼리 실행, JPQL은 데이터베이스 테이블을 알지 못함
  • SQL : 데이터베이스 테이블을 대상으로 쿼리 실행
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함