<JPA>JPA 프로젝트 시작하기

H2 데이터베이스 설치 및 실행

JPA를 위한 메이븐 프로젝트 생성하기

  • InteliJ를 사용합니다.
  • 이번에는 메이븐을 통해 JPA 프로젝트를 생성합니다.
  • 자바의 경우 8버전 이상을 권장합니다.
  • 생성후, pom.xml의 의존관계를 다음과 같이 설정해줍니다.
  • 아래의 javax.xml.bind의 경우, 자바 11버전 사용시 추가해줘야하는 의존관계이다. 추가 안할경우 생기는 에러는 깃헙 코멘트로 남겨놓았습니다.
  • h2DB의 의존관계는 첫번째 과정에서 로컬에 설치한 DB의 버전과 의존관계 설정시 h2의 버전이 동일해야 잘 동작합니다.
<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.200</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
  • 이후 의존관계들을 모두 다운로드 받으면 아래와 같이 External Library에 다운받은 관계들이 주르륵 나옵니다.

JPA 사용을 위한 persistence.xml 설정하기

  • Gradle에서 사용하던 application.yml과 동일한 역할을 수행하는 파일이라고 이해하면 될것 같습니다.
  • 다만 resources/META_INF 디렉토리 아래에 생성해줘야 합니다.
  • jdbc:h2:tcp://localhost/~/test는 h2 DB에 접속하기 위한 url입니다.
  • hibernate.dialect는 JPA가 각각의 RDB 벤더마다 문법은 상이하지만 기능은 동일한 쿼리들을 해석하기위해 넣어두는 설정입니다.아래의 그림을 보면 금방 이해가 되실겁니다.
  • 즉, JPA는 RDB에 종속적이지 않다는 것을 의미합니다.
<?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>

JPA 사용해보기

  • 기본적으로 JPA는 다음과 같은 구동방식을 취하고 있습니다.
  • JPA를 통해 쿼리를 날리기 전에 h2에 MEMBER 테이블을 생성합니다.
create table Member ( 
 id bigint not null,
 	name varchar(255),
 	primary key(id)
);
  • 간단한 테이블을 생성한 뒤, hellojpa 패키지 내에 Member 클래스를 생성합니다.이후 아래와 같이 Entity를 생성해줍니다.
@Getter
@Setter
@Entity
public class Member {

    @Id //primary key 설정
    private Long id;
    private String name;
}

  • 이후 JPAMain이라는 클래스에 psvm을 통해서 실행가능한 함수를 만들고, 아래 코드를 통해 JPA를 사용해봅시다.
  • 아래 코드에 눈여겨볼만한 부분은 em.getTransaction()메서드인데 이는 JPA의 모든 데이터 변경(CRUD)는 트랜잭션 내에서 일어나야하기에 트랜잭션을 생성하는 메서드입니다.
  • 사실 EntityManagerFactory, EntityTransaction 같은 것들은 스프링을 사용할 경우 스프링에서 알아서 설정해줍니다.그래도 순수 JPA를 위해서는 알아두는게 좋습니다
public class JpaMain {
	public static void main(String[] args) {
        EntityManagerFactory emf = 	Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
		Member member = new Member();
        member.setId(1L);
        member.setName("helloJPA");
        em.persist(member);
		tx.commit();
		em.close();
		ef.close();
}
  • 아래와 같이 멤버가 생성되는 것을 확인 할 수 있습니다.
  • 로그를 보시면 Insert 쿼리가 DB로 날라간것을 볼 수 있을 겁니다.
  • 이번에는 해당 멤버의 이름을 수정해보겠습니다.
  • 아래와 같은 코드를 실행하면 마법같이 해당 멤버가 수정되어 있습니다.
  • 수정을 한 경우, Entity Manager를 통해 다시 persist할 필요는 없습니다.
		Member findMember = em.find(Member.class, 1L);
        findMember.setName("updatedName");

JPQL 사용해보기

  • 먼저 JPQL 이란? 우리가 생성한 Entity Object(해당 예제에서는 Member)를 대상으로 하는 쿼리문이라고 보면됩니다. 흔히 배우는 SQL과 비슷한 문법을 가지지만, SQL은 쿼리의 대상이 TABLE이라는 것이 차이점입니다.
  • 아래의 createQuery 메서드를 통해 생성 가능하며, 아래 JPQL은 Member 테이블의 모든 멤버를 가져오라는 의미를 가지고 있습니다.
	List<Member> findAllMember = em.createQuery("select m from Member as m",Member.class)
                    .getResultList();

    for (Member member : findAllMember) {
            System.out.println("member= " + member.getName());
        }

Refer

  • <김영한>님의 자바 ORM 표준 JPA 프로그래밍 - 기본편