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를 사용해서 비즈니스 로직이 정상 동작하면 트랜잭션을 커밋하고 아닐경우 롤백시킨다.
- 트랜잭션 작업이 끝나고 나면 무조건 앤티티 매니저는 종료하여야한다.
- 어플리케이션을 종료할 때 엔티티 매니저 팩토리를 종료한다.