본문 바로가기

JPA

JPA란?

* 해당 게시글은 JPA의 공부를 위한 게시글로 JPA를 공부하며 이해했던 내용들을 정리하는 글입니다.

 

Java Persistence API의 약자로 ORM 기술에 대한 자바 표준 API입니다. ORM에 대해서 많은 프레임워크가 존재하며 대표적인 프레임워크로는 하이버네이트, 이클립스링크 등이 있습니다.

 

JPA를 구현하기 위해서는 관련 라이브러리를 추가해야하며 ORM 프레임워크로는 하이버네이트를 추가하겠습니다.

 

[pom.xml에 하이버네이트 관련 라이브러리 추가]

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.4.10.Final</version>
</dependency>

 

JPA에서 테이블과 매핑되는 자바 클래스를 엔티티 클래스라합니다. 기존의 VO 클래스가 동일한 개념입니다.

 

엔티티 클래스 작성방법

@Entity
@Data
@Table(name = "S_EMP")
public class Employee {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@Column(length = 25, nullable = false, name = "e_name")
	private String name;
}

 

 

@Entity

  • @Entity 애노테이션이 설정되면 해당 클래스가 엔티티 클래스라는 것을 나타냅니다. name 속성을 통해 엔티티 클래스의 이름을 정의할 수 있습니다. name 속성을 생략하면 엔티티 클래스의 이름이 엔티티이름이 됩니다. 

@Table

  • 해당 엔티티 클래스와 매핑할 테이블을 지정합니다. name 속성을 통해 매핑할 테이블을 지정하지만, name 속성을 생략할 경우 엔티티 이름과 동일한 테이블이 매핑됩니다.

@Id

  • 매핑할 테이블의 기본키와 매핑되는 엔티티 클래스의 식별자 변수를 표시합니다.

스프링의 다른 컨테이너와 동일하게 JPA에서 엔티티 클래스를 인식하게 하려면 Persistence가 설정파일을 로드해야합니다. 서블릿 컨테이너가 web.xml파일을 로드할 때 설정파일의 이름이 정의되어 있듯 JPA 설정파일도 정의되어 있습니다. 파일이름은 persistence.xml입니다.

 

 

다음은 작성된 persistence.xml 파일입니다.

 

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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_1.xsd"
             version="2.1">
             
             <persistence-unit name="unit">
             	<class>JAPChapter01.tested.Employee</class>
             	
             	<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.hbm2ddl.auto" value="create"/>
             	</properties>
             </persistence-unit>
             
             
</persistence>             

 

persistence.xml 파일은 META-INF 폴더 아래에 존재해야 Persistence가 로드할 수 있습니다. 다음은 설정파일에서 각 설정들의 의미를 알아보겠습니다.

 

1) <persistence-unit name ="unit"> : 영속성 유닛을 지정합니다. 지정된 영속성 유닛을 통해 EntityManagerFactory 객체를 생성할 수 있습니다.

2) <class>JAPChapter01.tested.Employee</class> : 빈을 등록하는 것처럼 엔티티 클래스를 등록합니다.

3) <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> : JDBC 드라이버 클래스를 지정합니다.

4) <property name="javax.persistence.jdbc.user" value="sa"/> : 연동하려는 DB의 user를 지정합니다.

5) <property name="javax.persistence.jdbc.password" value=""/> : 연동하려는 DB의 password를 지정합니다.

6) <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/> : JDBC url를 지정합니다.

7) <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> : JPA는 애플리케이션 운용에 필요한 SQL 구문을 자동으로 생성해주는데 특정 DB에 최적화된 SQL 구문을 생성할 수 있는 Dialect 클래스를 설정할 수 있습니다.

8) <property name="hibernate.show_sql" value="true"/> : SQL 관련 설정으로 하이버네이트가 생성한 SQL구문을 콘솔에 출력합니다.

9) <property name="hibernate.hbm2ddl.auto" value= "create" /> 테이블 생성, 변경, 삭제와 같은 DDL 구문을 자동으로 처리할 수 있습니다.

 

속성값 의미 수행되는 SQL 명령어
create 애플리케이션이 실행될 때, 기존 테이블을 삭제한 후 생성합니다.  DROP -> CREATE
ceate-drop create와 같지만 애플리케이션이 종료 될 때, 생성하였던 테이블을 삭제합니다. DROP -> CREATE -> DROP
update 기존의 테이블이 존재할 경우 생성하지 않고 사용합니다.
기존의 테이블이 존재하지 않는다면 생성합니다.
ALTER

 

출처

  • JPA 퀵스타트 책 참고