자바 진영의 ORM 기술 표준
객체와 관계형 DB를 매핑한다는 뜻한다는 뜻
Application과 DB와의 동작에서의 JPA

ORM 프레임워크는 객체와 테이블을 Mapping해서 패러다임의 불일치를 개발자 대신 해결해줌
<?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>
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);
}
}