JPA ) 자바 ORM 표준 JPA 프로그래밍 - 2

GoRuth·2025년 4월 12일

JPA

목록 보기
2/8

JPA란?

  • 자바 진영의 ORM 기술 표준

    객체와 관계형 DB를 매핑한다는 뜻한다는 뜻

  • Application과 DB와의 동작에서의 JPA

  • ORM 프레임워크는 객체와 테이블을 Mapping해서 패러다임의 불일치를 개발자 대신 해결해줌

JPA Mapping Annotation

  • @Entity
    • 해당 클래스를 테이블과 매핑한다고 JPA에게 명시
    • 해당 Annotation을 사용한 클래스를 Entity Class라고 함
  • @Table
    • Entity Class에 매핑한 테이블 정보 알려줌
    • name 속성
      • name 이름으로 테이블 Mapping
    • Default
      • 클래스 이름으로 테이블 Mapping
  • @Id
    • Entity Class의 필드를 Table의 PK에 Mapping
    • 해당 Annotation이 붙은 필드를 식별자 필드라고 함.
  • @Column
    • 필드를 컬럼에 Mapping

방언

  • JPA는 특정 DB에 종속적이지 않음
  • 각 DB마다 고유한 기능 or SQL 표준 ❌
    • 이를, JPA에서는 방언이라고 함!
  • 설정 법
    • hibernate.dialect로 설정

실습!

  • XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- src/main/resources/META-INF/persistence.xml -->
    <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_2.xsd"
                 version="2.2">
		<!-- 
			엔티티 매니져 팩토리 만들 때, 사용하는 이름
			각 이름에 따라서 팩토리 생성 가능!
			-> 설정이 다른 여러 팩토리를 생성 및 사용가능!
		-->
        <persistence-unit name="myJpaUnit"> 
            <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
            <class>org.example.Member</class> <!-- 등록할 Entity 클래스 -->

            <properties>
                <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
                <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:mem:testdb;"/>
                <property name="jakarta.persistence.jdbc.user" value="sa"/>
                <property name="jakarta.persistence.jdbc.password" value=""/>

                <!-- Hibernate 설정 -->
                <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
                <property name="hibernate.hbm2ddl.auto" value="create"/>
                <property name="hibernate.show_sql" value="true"/>
                <property name="hibernate.format_sql" value="true"/>
            </properties>
        </persistence-unit>
    </persistence>
</beans>
  • JAVA 코드
package org.example.jpa_maven;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {
	public static void main(String[] args) {
    	// 엔티티 매니저 팩토리 생성 
        // 생성 비용이 Big
        // -> 는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 함
		EntityManagerFactory entityManagerFactory =
			Persistence.createEntityManagerFactory("myJpaUnit");
        // 엔티티 매니저 생성
        // 대부분의 JPA 기능 제공
        // DB connection과 밀접한 관계 -> 스레드간 공유 + 재사용 X
		EntityManager entityManager =
			entityManagerFactory.createEntityManager();
            
        // 항상 Transaction 내에서 데이터 변경을 해야 함
        // 트랜잭션 없이 데이터를 변경하면 예외가 발생
		EntityTransaction entityTransaction
			= entityManager.getTransaction();

		try {
			entityTransaction.begin();
			// 실행 로직
            logic(entityManager);
			entityTransaction.commit();
		} catch (Exception ex) {
			entityTransaction.rollback();
		} finally {
			entityManager.close();
		}

		entityManagerFactory.close();
	}
    
    private static void logic(EntityManager entityManager) {
		Long id = 1L;
		Sample sample = new Sample(id, "name", "name2");

		// 등록
		entityManager.persist(sample);

		// 수정
		sample.setName("update name");

		// 조회 및 출력
		System.out.println(entityManager.find(Sample.class, id));

		// JPQL을 사용한 조회
        // SQL문에서 from Sample은 테이블 X, 엔티티 객체 O
        // JPQL은 DB Table을 전혀 알지 못한다!
		List<Sample> sampleList =
			entityManager.createQuery("select sample from Sample sample", Sample.class)
				.getResultList();
		System.out.println(sampleList);

		// 삭제
		entityManager.remove(sample);
	}
}
profile
Backend Developer

0개의 댓글