Post

[자바 ORM 표준 JPA 프로그래밍 - 기본편] 섹션 03. JPA 시작하기

[자바 ORM 표준 JPA 프로그래밍 - 기본편] 섹션 03. JPA 시작하기

1. Hello JPA - 프로젝트 생성


1. H2 데이터베이스 설치와 실행

https://www.h2database.com/html/main.html에서 OS에 맞는 H2 데이터베이스 설치


강의처럼 DB 접속이 안돼서 JDBC URLjdbc:h2:file:tcp://localhost/~/test로 설정해줬다.


2. 설정 파일 작성

pom.xml

  • H2 데이터베이스와 버전 맞추기
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
32
33
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>jpa-basic</groupId>
    <artifactId>ex1-hello-jpa</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>6.4.2.Final</version>
        </dependency>

        <!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>2.4.240</version>
        </dependency>
    </dependencies>

</project>


persistence.xml

  • resources/META-INF 밑에 만들기
  • H2 데이터베이스와 경로 맞추기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="jakarta.persistence.jdbc.user" value="sa"/>
            <property name="jakarta.persistence.jdbc.password" value=""/>
            <property name="jakarta.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>

2. Hello JPA - 애플리케이션 개발


JPA의 구동 방식은 Persistence라는 클래스가 META-INF/persistence.xml 설정 정보를 읽어서 EntityManagerFactory 클래스를 만든다. EntityManagerFactory는 필요할 때마다 EntityManager를 생성한다.


H2에서 Member 테이블을 먼저 생성해준다.

1
2
3
4
5
create table Member (
    id bigint not null,
    name varchar(255),
    primary key (id)
);


멤버 엔티티를 만들어준다. @Entity 애너테이션으로 JPA에 엔티티로 관리할 클래스임을 알리고, @Id 애너테이션으로 PK를 지정해준다.


엔티티 매니저 팩토리를 만들고 엔티티 매니저 팩토리로부터 엔티티 매니저를 만든다. 엔티티 매니저에서 persist 메서드로 저장을 할 수 있는데, 이때 트랜잭션 내에서만 가능해서 트랜잭션을 먼저 시작 후 persist 후 커밋을 해준다.

엔티티 매니저 팩토리는 애플리케이션 로딩 시점에 딱 하나만 만들고 DB 커넥션을 얻어서 쿼리 처리를 하는 것은 엔티티 매니저를 생성해서 사용하면 된다. 엔티티 매니저는 쓰레드간에 공유하면 안된다.


실행하면 로그로 쿼리가 날라가는게 보이며 H2에서 조회하면 잘 저장된 것을 볼 수 있다. 멤버 엔티티와 필드들이 JPA 관례를 따라서 작성됐기 때문에 H2의 멤버 테이블에 맞게 잘 삽입되었다.


기존의 삽입 코드는 문제가 생겼을 때, close 메서드가 호출이 안되는 안 좋은 형태로 try ~ catch 문을 활용해 성공시 커밋하고 실패시 롤백을 하도록 리팩토링 할 수 있다.


find 메서드로 테이블에서 조회도 간단하게 할 수 있다.


remove 메서드로 삭제도 간단하게 할 수 있다.


수정은 persist 메서드가 없어도 멤버 필드를 변경하는 것으로 UPDATE 쿼리가 나가는 것을 볼 수 있다. JPA를 통해 엔티티를 가져오면 JPA가 트랜잭션을 커밋하는 시점에 변경 사항을 감지해서 UPDATE 쿼리를 날린다.


H2에서 조회해보면 수정이 잘 된 것을 볼 수 있다.


JPQL을 활용하면 원하는 쿼리를 직접 작성할 수 있다. JPQL은 객체를 대상으로 하는 쿼리로 특정 데이터베이스에 종속적이지 않다는 큰 장점이 있다.


Ref



This post is licensed under CC BY 4.0 by the author.