Home JPA 시작하기
Post
Cancel

JPA 시작하기

JPA 라이브러리

  • Maven 설정
1
2
3
4
5
<dependency>
    <groupId>org.hibernate.orm</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>6.0.2.Final</version>
</dependency>
  • Persistence 설정
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" standalone="yes"?>
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
             version="3.0">
  <persistence-unit name="default"> <!-- 영속성 유닛에 고유한 이름을 부여 -->
    <properties>
      <!-- 필수 옵션 -->
      <property name="javax.persistence.jdbc.driver" value="org.h2.jdbcDriver"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:h2:~/spring-jpa;DATABASE_TO_UPPER=false;"/>
      <property name="javax.persistence.jdbc.user" value="sa"/>
      <property name="javax.persistence.jdbc.password" value=""/>

      <property name="hibernate.hbm2ddl.auto" value="create"/> <!-- 데이터베이스에 대한 스키마를 자동으로 생성 -->

      <!-- 선택 옵션 -->
      <property name="hibernate.show_sql" value="true"/> <!-- 콘솔에 SQL 쿼리를 콘솔에 출력할지 여부 -->
      <property name="hibernate.format_sql" value="true"/> <!-- SQL 쿼리를 포맷팅하여 보기 좋게 만들지 여부 -->
      <property name="hibernate.use_sql_comments" value="true"/> <!-- 출력되는 SQL 쿼리에 주석을 추가할지 여부 -->
      <property name="hibernate.id.new_generator_mappings" value="true"/> <!-- ID 생성 전략을 설정 -->
    </properties>
  </persistence-unit>
</persistence>

객체 맵핑

Table 과 Java 객체 간의 매핑하는 방법은 아래와 같다.

  • sql
1
2
3
4
5
6
7
CREATE TABLE Member
(
  id   VARCHAR(255) NOT NULL,
  name VARCHAR(255),
  age  INTEGER,
  PRIMARY KEY (Id)
)
  • Member.java
1
2
3
4
5
6
7
8
9
10
11
12
13
@Getter
@Setter
@Entity
@Table(name = "Member")
public class Member {
  @Id
  private String id;
  @Column(name = "name")
  private String userName;

  private Integer age;
}

어플리케이션 개발

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Main {
  public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("default"); // [엔티티 매니저 팩토리] - 생성
    EntityManager em = emf.createEntityManager(); // [엔티티 메니저] - 생성
    EntityTransaction tx = em.getTransaction(); // [트랜잭션] - 획득

    try {
      tx.begin(); // [트랜잭션] - 시작
      // 비지니스 로직 실행
      tx.commit(); // [트랜잭션] - 커밋
    } catch (Exception e) {
      tx.rollback(); // [트랜잭션] - 롤백
    } finally {
      em.close();// [엔티티 매니저] - 종료
    }
    emf.close();// [인티티 메니저 팩토리] - 종료
  }
}

엔티티 매니저 설정

엔티티 매니저 팩토리 생성

  • Jpa를 시작하기 앞서 persistence.xml 설정 정보를 사용해서 엔티티 매니저 팩토리를 생성해야 한다.
    • Persistence 를 통해 엔티티 매니저 팩토리를 생성할 수 있다.
  • 엔티티 매니저 팩토리의 경우 JPA를 동작시키기 위한 기반 객체를 만들고 JPA 구현체에 따라서는 데이터베이스 커넥션 풀을 생성하기 때문에 비용이 크다.
    • 그렇기 때문에 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한번만 생성하고 공유해서 사용해야 한다.

엔티티 매니저 생성

  • 엔티티 매니저 팩토리에서 엔티티 매니저를 생성한다.
  • 엔티티 매니저를 사용해서 엔티티를 데이터베이스에 CRUD 작업을 할수 있다.
  • 엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간 공유하거나 재사용해서는 안된다.

트랜잭션 관리

  • 트랜잭션은 엔티티 매니저에서 트랜잭션 API를 받아와야 한다.
  • 트랜잭션 API를 사용해서 비즈니스 로직이 정상 동작하면 트랜잭션을 커밋하고 아닐경우 롤백시킨다.
    • 트랜잭션 작업이 끝나고 나면 무조건 앤티티 매니저는 종료하여야한다.
    • 어플리케이션을 종료할 때 엔티티 매니저 팩토리를 종료한다.
This post is licensed under CC BY 4.0 by the author.