JPA 원리

TopOfTheHead·2026년 4월 23일

MyBatis / JPA

목록 보기
7/10

의존성 정의
hibernate / jpa / h2

implementation 'org.hibernate.orm:hibernate-core:7.3.2.Final' // Hibernate
implementation 'jakarta.persistence:jakarta.persistence-api:3.2.0' // JPA
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 ClassMapping 설정을 정의하는 JPA 설정 파일

。정의된 DB매핑Entity Class들을 <persistence-unit> 태그<class> 태그에서 정의
▶ 이후 Hibernate가 등록된 Entity Class를 기반으로 ddl-auto에 의해 DBDDL을 전달하여 매핑DB Table을 자동으로 생성

어플리케이션에서 Persistence.createEntityManagerFactory("식별자");를 통해 해당 설정파일<persistence-unit>을 기반으로 EntityManagerFactory를 생성

src/main/resources/META-INF/persistence.xml로 경로 지정

<persistence> -> <persistence-unit> -> <properties> 순으로 전개

<!-- Mybatis의 <Configuration>에 대응 -->
<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">
<!--   Mybatis의 <Evironment>에 대응  -->
    <persistence-unit name="hibernate-exp-5">
  <!-- 매핑할 Entity Class를 정의 -->
        <class>model.s01.Member</class>
        <properties>
<!-- DB 접속정보 정의 -->
            <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="" />
<!-- DB Schema의 생성 / 삭제 시점을 지정 -->
            <property name="jakarta.persistence.schema-generation.database.action" value="create" />
<!-- 콘솔에 SQL문 출력하는 용도 -->
            <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 EntitySchema를 언제 생성/삭제할 것인지 지정하는 설정 Spring JPA

    • create : 기존 DB Table을 전부 DROPDB Entity 기반으로 생성
      개발 / 테스트 환경에서 초기화 시 유용

    • create-drop : create와 동일하나 어플리케이션 종료 시점에서 모든 DB TableDrop
      ▶ 모든 데이터가 삭제되는 위험성이 존재하므로 테스트 환경에서만 사용

    • update : DB TableDB Entity의 변경사항을 검사하여 DB Table에 반영
      ▶ 단 Entity가 삭제되더라도 DB Table 또는 ColumnDrop은 수행하지 않는다.
      ▶ 주로 개발 / 로컬환경에서 사용

    • validate : DB TableDB Entity 간 서로 일치하는지 검사만 수행
      ▶ 불일치하는 경우 예외를 발생하여 어플리케이션이 구동되지 않도록 설정
      ▶ 주로 운영환경에서 사용

    • none : 아무런 작업도 수행하지 않는다.

EntityManagerFactory / EntityManager 를 활용한 작업 정의
EntityManager를 통한 작업 수행 시 해당 EntityManagerTransaction 객체를 생성하여 TCL을 적용

JPA에서는 하나의 작업 당 하나의 EntityManager 객체를 생성 및 할당하여 활용
▶ 해당 작업이 모두 종료된 경우 EntityManager 객체를 종료 및 다음 작업에 대한 새로운 EntityManager 객체를 생성하여 할당

 public class EntityManagerTest {
	// EntiyManagerFactory 생성
	private static final EntityManagerFactory emf;
	static{
		// xml 파일 정보를 통해 초기화
		emf = Persistence.createEntityManagerFactory("hibernate-exp-5");
	}
	public static void main(String[] args) {
		// EntityManager 생성
		EntityManager entityManager = emf.createEntityManager();
		// JPA에서는 하나의 작업단위 당 하나의 EntityManager 객체를 생성하여 활용
		// Transaction 자바객체 생성
		EntityTransaction transaction = entityManager.getTransaction();
		try{
			// 트랜잭션 시작
			transaction.begin();
			// Transient : 비영속
			Post post = new Post(1, "title", "contents");
			// Managed : 영속
			entityManager.persist(post);
			// Removed : 삭제
			entityManager.remove(post);
			// 트랜잭션 종료
			transaction.commit();
		}catch (Exception e){
			// 트랜잭션 실패 시 rollback.
			transaction.rollback();
		} finally{
			entityManager.close();
			// EntityManager는 기능 하나당 EntityManager 객체를 사용하므로,
			// 기능 수행이 모두 끝난 경우 객체를 종료
		}
	}
}
profile
공부기록 블로그

0개의 댓글