ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ORM - JPA설정
    FrameWork/ORM 2024. 2. 14. 16:14

    JPA 설정

    JPA 설정은 영속성 유닛(persistence-unit)이라는 것부터 시작하는데 일반적으로 연결할 데이터베이스당 하나의 영속성 유닛을 등록한다. 그리고 영속성 유닛에는 고유한 이름을 부여해야 하는데 

     

    application.properties

    spring.datasource.url=jdbc:h2:tcp://localhost/~/test:mem:jpausage

     

    위와 같이 url 속성에 연결해서 `mem:jpausage`와 같이 명시 해주면 된다.

     

    JPA 표준 속성

    spring.data.username : 데이터베이스 접속 아이디

    spring.datasource.password : 데이터베이스 접속 비밀번호

    spring.datasource.url : 데이터베이스 접속 URL

     

    하이버네이트 속성

    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect : 데이터베이스 방언(Dialect)설정

     

    spring.data로 시작하는 속성은 JPA 표준 속성으로 특정 구현체에 종속되지 않는다. 반면에 hibernate로 시작하는 속성은 하이버네트 전용 속성이므로 하이버네이트에서만 사용 할 수 있다.

    사용한 속성을 보면 데이터베이스에 연결하기 위한 설정이 대부분이다. 여기서 가장 중요한 속성은 데이터베이스 방언을 설정하는 hibernate.dialect다.

     

    데이터베이스 방언

    JPA는 특정 데이터베이스에 종속적이지 않은 기술이다. 따라서 다른 데이터베이스로 손쉽게 교체할 수 있다. 그런데 각 데이터베이스가 제공하는 SQL 문법과함수가 조금씩 다르다는 문제점이 있다.

    SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 JPA에서는 방언(Dialect)이라고 한다. 애플리케이션개발자가 특정 데이터베이스에 종속되는 기능을 많이 사용하면 나중에 데이터베이스를 교체하기 어렵다. 하이버네트를 포하만 대부분의 JPA 구현체들은 이런 문제를 해결하려고 다양한 데이터베이스 방언 클래스를 제공한다.

     

    개발자는 JPA가 제공하는 표준 문법에 맞추어 JPA를 사용하면되고, 특정 데이터베이스에 의존적인 SQL은 데이터베이스방언이 처리해준다. 

     

    package com.example.ormusage;
    
    import jakarta.persistence.EntityManager;
    import jakarta.persistence.EntityManagerFactory;
    import jakarta.persistence.EntityTransaction;
    import jakarta.persistence.Persistence;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    public class OrmUsageApplication {
    
        public static void main(String[] args) {
    
            //[엔티티 매니저 팩토리] - 생성
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpausage");
    
            //[엔티티 매니저] - 생성
            EntityManager em = emf.createEntityManager();
    
            //[트랜잭션] - 획득
            EntityTransaction tx = em.getTransaction();
    
            try{
    
                tx.begin(); //[트랜잭션] - 시작
                logic(em); //비즈니스 로직 실행
                tx.commit(); //[트랜잭션] - 커밋
                
            } catch (Exception e){
                //[트랜잭션] - 롤백
                tx.rollback();
            }finally {
                //[엔티티 매니저] - 종료
                em.close();
            }
    
            //[엔티티 매니저 팩토리] - 종료
            emf.close();
        }
    	
        //비지니스로직
        private static void logic(EntityTransaction em){}
    
    }

     

    코드는 크게 3부분으로 나위어 있다.

    • 엔티티 매니저 설정
    • 트랜잭션 관리
    • 비즈니스 로직

    엔티티 매니저 설정

    2.12 엔티티 매니저 생성 과정

     

    그림 2.12를 보면서 엔티티 매니저의 생성 과정을 분석해보자

     

    엔티티 매니저 팩토리 생성

    JPA를 시작하려면 우선 application.properties의 설정 정보를 사용해서 엔티티 매니저 팩토리를 생성해야한다. 이때 Persistence 클래를 사용하는데 이 클래스는 엔티티 매니저 팩토리를 생성해서 JPA를 사용할 수 있게 준비한다.

     //[엔티티 매니저 팩토리] - 생성
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpausage");

     

    이렇게 하면 META - INF/application-properties에서 이름이 jpausage인 영속성 유닛(persistence-unit)을 찾아서 엔티티매니저 팩토리를 생성한다. 이때 application.properties 설정 정보를 읽어서 JPA를 동작시키기위한 기반 객체를 만들고 JPA 구현체에 따라서는 데이터베이스 커넥션 풀도 생성하므로 엔티티 매니저 팩토리를 생성하는비용은 아주 크다. 따라서 엔티티 매니저는 팩토리애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다.

     

    엔티티 매니저 생성

      //[엔티티 매니저] - 생성
     EntityManager em = emf.createEntityManager();

     

    엔티티 매니저 팩토리를 사용해서 엔티티 매니저를 생성한다. JPA의 기능 대부분은 이 엔티티 매니저가 제공한다. 대표적으로 엔티티 매니저를 사용해서 엔티티 데이터베이스에 등록/수정/삭제 조회 할 수 있다. 엔티티 매니저는 내부에 데이터소스(데이터베이스 커넥션)을 유지하면서 데이터베이스와 통신한다.

    참고로 엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용하면 안 된다. 

     

     

    종료

    //엔티티 매니저 종료
    em.close();

     

    마지막으로 사용이 끝난 엔티티 매니저는 위 처럼 반드시 종료해야 된다. 

    //엔티티 매니저 팩토리 종료
    emf.close();

     

    트랜잭션 관리 

    //트랜잭션 API
    EntityTransaction tx = em.getTransaction();
    
    try{
      tx.begin();  //트랜잭션 시작
      logic(em);   //트랜잭션 로직 실행
      tx.commit(); //트랜잭션 커밋
    } catch (Exception e){
      tx.rollback(); //예외 발생시 트랜잭션 롤백
    }

    JPA를 사용하면 항상 트랜잭션 안에 데이터를 변경해야 한다. 트랜잭션 없이 데이터를 변경하면 예외가 발생한다. 트랜잭션을 시작하려면 엔티티 매니저(em)에서트랜잭션 API를 받아와야 한다.

     

    트랜잭션 API를 사용해서 비지니스 로직이 정상 동자가면 트랜잭션 커밋하고 예외가발생하면 트랜잭션 롤백을 한다.

     

     

    출처 - [자바 ORM 표준 JPA 프로그래밍 - 저, 김영한]

    http://www.acornpub.co.kr/book/jpa-programmig

     

    자바 ORM 표준 JPA 프로그래밍

    JPA 기초 이론과 핵심 원리, 그리고 실무에 필요한 성능 최적화 방법까지 JPA에 대한 모든 것

    www.acornpub.co.kr

     

    댓글

Designed by Tistory.