본문 바로가기
Back-End/Spring Data

2.JPA 시작하기

by 두두리안 2021. 1. 4.
728x90

2.JPA 시작하기

  • 목차
    • 1.JPA 프로잭트 설정
    • 2.JPA 애플리케이션 개발

1.JPA 프로잭트 설정

xml 설정

<dependencies>
        <!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.3.10.Final</version>
        </dependency>
        <!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.199</version>
        </dependency>
    </dependencies>
  • jpa 와 h2를 설정한다

persistence

<?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>
  • H2Dialect - h2의 방언
    • H2Dialect 을 변경하면 오라클 , mysql , mariadb 등등을 사용할수 있다
  • resources -> META-INF -> persistence.xml

2.JPA 애플리케이션 개발

Member

@Entity
@Table("Member")
public class Member {

    @Id
    @Column("id")
    private Long id;

    private String name;
}
  • @Entity : 이 클래스를 테이블과 매핑한다고 JPA 에게 알린다
  • @Id : 기본키
  • @Table : 테이블명
  • @Column : 필드를 컬럼에 매핑

Jpa 등록

public class JpaMain {

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();

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

            Member findMember = em.find(Member.class, 1L);
            findMember.setName("Hello");

            em.persist(member);

            tx.commit();
        }catch (Exception e){
            tx.rollback();
        }finally {
            em.close();
        }
        emf.close();
    }
}
  • persist 를 이용해서 등록한다

Jpa 조회 및 수정

public class JpaMain {

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try{
            Member findMember = em.find(Member.class, 1L);
            findMember.setName("Hello");

            tx.commit();
        }catch (Exception e){
            tx.rollback();
        }finally {
            em.close();
        }
        emf.close();
    }
}
  • find 를 이용해서 Member 를 조회한다
  • setName("Hello") 에서 내용을 바꾸어 주면 jpa 에서 변경을 감지해서 Update 가 나간다

JPQL

public class JpaMain {

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try{
            List<Member> result = em.createQuery("select m from Member m", Member.class)
                    .setFirstResult(1)
                    .setMaxResults(100)
                    .getResultList();

            for (Member member : result) {
                System.out.println("member.name = " + member.getName());
            }            
        }catch (Exception e){
            tx.rollback();
        }finally {
            em.close();
        }
        emf.close();
    }
}
  • createQuery 를 이용한다
  • select m from Member m -> Member 를 m 에 매핑 모든값을 조회
  • setFirstResult , setMaxResults 이용해서 페이징이 가능하다
  • 테이블이 아닌 엔티티 객체를 대상으로 검색

정리

  • EntityManagerFactory : 애플리케이션 전체에서 딱한번 생성하고 공유해서 사용
    • xml 의 설정을 읽어서 jpa 를 동작시키기 위한 기반객체를 만든다
    • jpa 구현체에 따라서는 데이터커네셕풀 생성 , 엔티티 매니저 팩토리 생성
  • EntityManager
    • 엔티티 데이터베이스에 등록/수정/삭제/조회를 한다
    • 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용하면 안된다
  • EntityTransaction
    • jpa 는 트랙재션 안에서 동작해야 된다
    • try/catch 이용해서 정상이면 commit 비정상은 rollback 한다
  • JPQL : SQL 을 추상화한 JPQL 이라는 객체 지향 쿼리 언어 제공 (엔티티 객체)

참고

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

image

728x90

'Back-End > Spring Data' 카테고리의 다른 글

4.엔티티 매핑  (0) 2021.01.07
3.영속성관리 - 내부동작방식  (0) 2021.01.05
1.JPA 소개  (0) 2021.01.04
9.웹 계층 개발 2(주문)  (0) 2021.01.01
8.변경감지 와 병합  (0) 2021.01.01