이번 포스팅에서는 JPA를 사용해보도록 하겠다.
우선, 관계형 DB가 필요할 테니 선호하는 DB를 설치하도록 하자.
(포스팅에서는 H2 DB를 사용합니다)
그리고 JPA 는 앞서 말했듯이 인터페이스이다. 사용하기 위해서는 구현체가 필요한데, 가장 많이 사용되는 JPA 구현체는 Hibernate 이다.
따라서, 하이버네이트와 사용할 DB의 드라이버 의존성을 추가해주도록 하자.
(이 부분은 JPA와 관련된 내용은 아닙니다.)
참고로, JPA 를 사용하는 많은 분들이 Spring boot 와 함께 사용하게 될텐데 스프링에서 사용하는 hibernate 의 의존성 정보는 <스프링 의존성 버전 정보> 여기서 확인할 수 있다.
스프링 부트 2.4.3 버전을 기준으로 5.4.28.Final 버전이 사용되는 것을 알 수 있다.
또, 당연한 말이지만 DB 의존성을 가져올 때 버전은 설치한 DB 의 버전에 맞춰주어야 한다.
다음으로 JPA 를 사용하기 위한 설정파일을 작성해야하는데, xml 을 사용해서 설정파일을 만들어 보도록 하겠다
설정파일을 확인해보면 결국은 JPA도 JDBC 를 사용해 RDB 와 통신한다는 사실을 추측할 수 있다. 또한 dialect(방언) 을 통해 추측할 수 있는 부분은 JPA 가 특정 RDB 벤더에 종속적이지 않다는 것이다.
Persistence 인스턴스가 설정정보를 바탕으로 EntityManagerFactory 를 생성한다.
생성된 EntityManagerFactory 는 DB 작업이 필요할때 마다 EntityManger 인스턴스를 생성해 사용하게 된다.
JPA 의 모든 데이터변경은 트랜잭션안에서 일어남으로
EntityTransaction 을 받아와 사용한다.
웹어플리케이션을 예로들어 설명하자면 (WAS 가 사용하는 DB가 1개라고 가정)
EntityManagerFactory 는 어플리케이션이 구동될때 한개가 생성되고,
(DB작업이 있는)요청이 들어올때마다 EntityManger 가 생성되어 사용되고 사용 후 버려진다.
실제 코드를 살펴보도록 하자.
// EntityMangerFactory 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// EntityManger 생성
EntityManager em = emf.createEntityManager();
// 트랜잭션 단위로 실행한다.
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try{
Member member = new Member();
member.setId(1L);
member.setName("jaden");
em.persist(member);
transaction.commit();
} catch (Exception e){
transaction.rollback();
} finally {
em.close();
}
emf.close();
로그를 살펴보면
Hibernate:
/* insert me.summerbell.hellojpa.domain.Member
*/ insert
into
Member
(name, id)
values
(?, ?)
다음과 같이 쿼리가 날라간 것을 확인할 수 있고,
DB에 정상적으로 영속화 된 것을 확인할 수 있다.
해당 포스팅은 김영한님의 '자바 ORM 표준 JPA 프로그래밍' 강의를 참고하여 작성된 내용입니다.