JPA 시작
JPA를 사용하기 위해서는 JPA 구현체인 하이버네이트와 DB를 추가해야한다.
메이븐 환경에서 xml을 이용해 JPA 하이버네이트와 H2 데이터베이스를 추가한다.
[라이브러리 추가 - xml]
<?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.0</version>
<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>
</project>
추가로 xml등을 이용해 JPA를 설정해주어야 한다.
[JPA 설정 - xml]
<?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>
● persistence로 시작. XML 네임스페이스와 사용할 버전을 지정한다.
● persistence-unit 으로 이름 지정
● DB, 사용자 이름, 비밀번호, DB url 지정
● hibernate로 시작하는 속성은 하이버네이트만의 전용 속성이다.
● hibernate.dialect로 데이터베이스 방언 설정(JPA는 특정 데이터베이스에 종속되지 않는다.)
● hibernate.show_sql : 하이버네이트가 실행한 SQL을 출력한다.
● hibernate.format_sql : 하이버네이트가 실행한 SQL을 출력할 때 보기 쉽게 정리한다.
● hibernate.use_sql_comments : 쿼리를 출력할 때 주석도 함께 출력한다.
● hibernate.hhbm2ddl.auto : 엔티티에 맞춰 DB 테이블을 생성해주고 애플리케이션 종료시 모든 테이블을 drop한다.
1. 객체 매핑
JPA를 사용해서 객체를 매핑하려면, @Entity를 사용해서 객체를 엔티티로 지정해주어야 한다.
[객체 매핑]
@Entitiy
@Table(name="MEMBER")
public class Member {
@Id
@Column(name = "ID")
private String id;
@Column(name = "NAME")
private String username;
}
● @Entity : 해당 클래스를 테이블과 매핑한다고 JPA에게 선언한다. 이렇게 @Entity가 사용된 클래스를 엔티티 클래스라 한다.
● @Table : 엔티티 클래스에 매핑할 테이블 정보를 선언한다. name 속성을 사용해서 테이블 이름을 정할 수 있다. 이 어노태이션을 생략하면 클래스 이름을 테이블 이름으로 매핑한다.
● @Id : 엔티티 클래스 필드를 테이블의 기본 키(PK)에 매핑한다.
● @Column : 필드를 컬럼에 매핑한다. name 속성을 사용해서 컬럼의 이름을 정할 수 있다.
2. JPA 기본 흐름
JPA사용 흐름은 다음과 같이 나눌 수 있다.
● 엔티티 매니저 설정
● 트랜잭션 관리
■ 엔티티 매니저 설정
[엔티티 매니저 생성 과정]
□ 엔티티 매니저 팩토리 생성
JPA를 시작하려면 설정 정보를 사용하여 엔티티 매니저 팩토리를 생성해야 한다.
Persistence 클래스를 사용해서 엔티티 매니저 팩토리를 생성할수 있는데 JPA 구현체에 따라서는 이 때 데이터베이스 커넥션 풀도 생성하므로 엔티티 매니저 팩토리를 생성하는 비용은 아주 크다.
따라서 엔티티 매니저 팩토리는 어플리케이션 전체에서 딱 한번만 생성하고 공유해서 사용해야 한다.
[엔티티 매니저 팩토리 생성]
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
□ 엔티티 매니저 생성
엔티티 매니저 팩토리에서 엔티티 매니저를 생성할 수 있다.
[엔티티 매니저 생성]
EntityManager em = emf.createEntityManager();
JPA의 기능 대부분은 엔티티 메니저가 제공한다. 대표적으로 엔티티 매니저를 사용해서 엔티티를 데이터 베이스에 등록/수정/삭제/조회(CURD)할 수 있다.
엔티티 매니저는 내부에 데이터소스(데이터베이스 커넥션)를 유지하면서 데이터베이스와 통신한다.
따라서 애플리케이션 개발자는 엔티티 매니저를 가상의 데이터베이스로 생각할 수 있다.
※ 엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간 공유하거나 재사용하면 안 된다.
사용이 끝난 엔티티 매니저와 팩토리는 반드시 종료해야 한다.
■ 트랜잭션 관리
JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야 한다.
엔티티 매니저에서 트랜잭션 API를 받아와 트랜잭션을 실행할 수 있다.
[트랜잭션 사용]
tx.begin(); //트랜잭션 시작
logic(em); //로직 실행
tx.commit(); //트랜잭션 커밋
트랜잭션 API를 사용해서 비즈니스 로직이 정상 작동하면 트랜잭션을 커밋한다.
만약 예외가 발생했다면 tx.rollback()을 사용해서 트랜잭션을 롤백해야 한다.
'Spring > JPA' 카테고리의 다른 글
#6 다양한 연관관계 매핑 (0) | 2021.08.28 |
---|---|
#5 연관관계 매핑 기본 (0) | 2021.08.27 |
#4 엔티티 매핑 (0) | 2021.08.27 |
#3 영속성 관리 (0) | 2021.08.25 |
#1 JPA 소개 (0) | 2021.08.25 |
댓글