JPA 시작하기

김종하·2021년 3월 14일
0

JPA

목록 보기
3/10

이번 포스팅에서는 JPA를 사용해보도록 하겠다.

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 벤더에 종속적이지 않다는 것이다.

JPA 동작 원리

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 프로그래밍' 강의를 참고하여 작성된 내용입니다.

0개의 댓글