본문 바로가기
Spring/JPA

#2 JPA 시작

by 히포파타마스 2021. 8. 25.

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

댓글