Spring Boot 환경에서는 application.properties를 통해 JPA 설정을 하면, Spring Boot가 EntityManagerFactory와 EntityManager를 자동으로 생성하고 관리한다.
이 때문에 개발자가 직접 EntityManagerFactory를 생성할 필요 없이, @PersistenceContext를 통해 EntityManager를 주입받아 사용할 수 있다.
spring.datasource.url=jdbc:h2:tcp://localhost/~/testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
참고로
spring.datasource.url=jdbc:h2:mem:testdb를 사용하면 In-Memory로 실행할 수 있다.
@Service
@Transactional
public class MyService {
@PersistenceContext
private EntityManager em;
public void saveEntity() {
Member member = new Member();
member.setName("JPA");
member.setId(1L);
em.persist(member);
}
}
persistence.xml은 JPA 표준 사양에 따라 Persistence Unit(영속성 단위)을 정의하는 설정 파일로 EntityManagerFactory를 초기화할 때 사용한다.
아래 코드와 같이 EntityManagerFactory를 생성하기 위한 설정을 해야 한다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2" 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">
<persistence-unit name="hello">
<properties>
<!-- 필수 속성 -->
<property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="jakarta.persistence.jdbc.user" value="sa"/>
<property name="jakarta.persistence.jdbc.password" value=""/>
<property name="jakarta.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.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<!-- <property name="hibernate.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
</persistence>
JPA 표준만 사용하거나 Spring Boot 없이 순수 JPA를 사용할 때는 EntityManagerFactory와 EntityManager를 직접 생성해야 한다.
개발자가 수동으로 이를 통해 EntityManager를 생성하고 관리하며,
트랜잭션 관리 및 영속성 컨텍스트 생명주기를 직접 처리해야 한다.
public class MyJpaApp {
public static void main(String[] args) {
// persistence.xml에 정의된 persistence-unit 사용
EntityManagerFactory emf = Persistence.createEntityManagerFactory("examplePU");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin(); // 트랜잭션 시작
MyEntity entity = new MyEntity();
entity.setName("Sample");
em.persist(entity); // EntityManager 사용
em.getTransaction().commit(); // 트랜잭션 커밋
em.close(); // EntityManager 수동 종료
emf.close(); // EntityManagerFactory 수동 종료
}
}