해당 프로젝트는 JAVA 17, Gradle 환경에서 실습하였습니다.
JPA H2 데이터베이스 설정 파일을 작성합니다.
// setting h2
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
// setting h2 db
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
// show sql
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
// ddl auto
spring.jpa.hibernate.ddl-auto=create
PersistenceUnit vs PersistenceContext
- PersistenceUnit - EntityManagerFactory 주입 시 사용
- PersistenceContext - EntityManager 주입 시 사용
EntityManager 라이프 사이클을 수동으로 관리할 필요가 없는 경우, PersistenceContext 사용 권장
@RequestMapping("/member")
@RestController
public class MemberController {
private EntityManagerFactory emf;
@PersistenceUnit
public void setEntityManagerFactory(EntityManagerFactory emf) {
this.emf = emf;
}
@GetMapping()
public Member memberCrud() {
// 각 엑세스마다 생성된다.
EntityManager em = emf.createEntityManager();
// JPA 의 모든 데이터 변경은 트랜잭션 안에서 이루어진다.
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member newMember = Member.of("kimdoha");
em.persist(newMember);
Member findMember = em.find(Member.class, 1L);
Member updateMember = em.find(Member.class, 1L);
updateMember.update("kimdoha2");
em.persist(updateMember);
Member deleteMember = em.find(Member.class, 1L);
em.remove(deleteMember);
// SQL을 모아서 한번에 보낸다.
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
emf.close();
}
return null;
}
}
https://github.com/kimdoha/spring-playground/tree/feat/1.create-jpa-application/JPA-Study