의존성 정의
。hibernate / jpa / h2
implementation 'org.hibernate.orm:hibernate-core:7.3.2.Final'
implementation 'jakarta.persistence:jakarta.persistence-api:3.2.0'
implementation 'com.h2database:h2:2.4.240'
DB Entity 정의
。Entity Class는 @Entity 선언하여 생성 및 PK 역할의 @Id 필드를 정의해야한다.
▶ 추가적으로 필요 시 @ManyToOne 등을 선언하여 FK를 설정
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
private String name;
}
JPA 설정 파일( persistence.xml ) 정의
。persistence.xml : DB 연결정보 ( URL, Username, Password )와 Entity Class의 Mapping 설정을 정의하는 JPA 설정 파일
。정의된 DB에 매핑할 Entity Class들을 <persistence-unit> 태그 내 <class> 태그에서 정의
▶ 이후 Hibernate가 등록된 Entity Class를 기반으로 ddl-auto에 의해 DB에 DDL을 전달하여 매핑할 DB Table을 자동으로 생성
。어플리케이션에서 Persistence.createEntityManagerFactory("식별자");를 통해 해당 설정파일의 <persistence-unit>을 기반으로 EntityManagerFactory를 생성
。src/main/resources/META-INF/persistence.xml로 경로 지정
。<persistence> -> <persistence-unit> -> <properties> 순으로 전개
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="hibernate-exp-5">
<class>model.s01.Member</class>
<properties>
<property name="jakarta.persistence.jdbc.url" value="jdbc:h2:mem:test-db;" />
<property name="jakarta.persistence.jdbc.user" value="sa" />
<property name="jakarta.persistence.jdbc.password" value="" />
<property name="jakarta.persistence.schema-generation.database.action" value="create" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.highlight_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="elipselink.logging.level" value="INFO"/>
<property name="elipselink.logging.level.sql" value="FINE"/>
<property name="elipselink.logging.parameters" value="true"/>
</properties>
</persistence-unit>
</persistence>
<persistence> :
。전체 JPA 설정을 묶는 역할의 컨테이너 태그
。하나 이상의 <persistence-unit> 태그를 포함
<persistence-unit>
。매핑할 Entity 클래스와 DB 연결을 정의하는 태그
▶ <persistence> 내 여러 <persistence-unit>를 정의하여 여러 DB 연결을 가질 수 있다.
▶ Mybatis의 <Evironment>에 대응
name="식별자" 속성을 지정하여 식별
▶ 어플리케이션에서 Persistence.createEntityManagerFactory("식별자");를 통해 해당 설정파일의 <persistence-unit>을 기반으로 EntityManagerFactory를 생성
<class>Entity클래스</class>
。매핑할 Entity Class를 등록하는 태그
▶ 등록된 Entity Class는 컴파일 시점에서 Hibernate에 의해 식별 및 ddl-auto를 통해 자동으로 DDL을 생성 및 DB에 전달하여 DB Table을 생성
。src/main/java 이하 디렉토리경로.엔티티클래스명을 입력
ex ) <class>model.s01.Member</class>
。일반 JPA는 자동으로 Entity Class를 확인하지 못하므로, 해당 태그를 통해 매핑 대상의 Entity Class를 정의해야한다.
▶ 단 Spring JPA는 @Component를 통해 Spring Context에 등록된 Entity Class를 자동으로 식별하여 Hibernate에 의해 매핑된 DB Table을 생성
<properties>
。JPA 구현체( Hibernate ) 및 DB 접속정보를 포함하는 <property> 태그를 포함하는 태그
▶ <property name="옵션명" value="설정값">을 통해 각 설정을 정의
ex ) JDBC URL 정의 : <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:mem:test-db" />
。 JPA에서 DB 접속정보 정의 시 URL / USERNAME / PASSWORD만 정의해도 된다.
▶ JPA가 자동으로 build.gradle에 정의한 DB에 대한 의존성을 기반으로 DB 드라이버를 식별하여 적용하므로.
ddl-auto
<property name="jakarta.persistence.schema-generation.database.action" value="create" />
。JPA에서 등록된 DB Entity의 Schema를 언제 생성/삭제할 것인지 지정하는 설정 Spring JPA
create : 기존 DB Table을 전부 DROP 후 DB Entity 기반으로 생성
▶ 개발 / 테스트 환경에서 초기화 시 유용
create-drop : create와 동일하나 어플리케이션 종료 시점에서 모든 DB Table을 Drop
▶ 모든 데이터가 삭제되는 위험성이 존재하므로 테스트 환경에서만 사용
update : DB Table과 DB Entity의 변경사항을 검사하여 DB Table에 반영
▶ 단 Entity가 삭제되더라도 DB Table 또는 Column의 Drop은 수행하지 않는다.
▶ 주로 개발 / 로컬환경에서 사용
validate : DB Table과 DB Entity 간 서로 일치하는지 검사만 수행
▶ 불일치하는 경우 예외를 발생하여 어플리케이션이 구동되지 않도록 설정
▶ 주로 운영환경에서 사용
none : 아무런 작업도 수행하지 않는다.
EntityManagerFactory / EntityManager 를 활용한 작업 정의
。EntityManager를 통한 작업 수행 시 해당 EntityManager의 Transaction 객체를 생성하여 TCL을 적용
。JPA에서는 하나의 작업 당 하나의 EntityManager 객체를 생성 및 할당하여 활용
▶ 해당 작업이 모두 종료된 경우 EntityManager 객체를 종료 및 다음 작업에 대한 새로운 EntityManager 객체를 생성하여 할당
public class EntityManagerTest {
private static final EntityManagerFactory emf;
static{
emf = Persistence.createEntityManagerFactory("hibernate-exp-5");
}
public static void main(String[] args) {
EntityManager entityManager = emf.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
try{
transaction.begin();
Post post = new Post(1, "title", "contents");
entityManager.persist(post);
entityManager.remove(post);
transaction.commit();
}catch (Exception e){
transaction.rollback();
} finally{
entityManager.close();
}
}
}