본문 바로가기
책을 읽어봅시다/자바 ORM 표준 JPA 프로그래밍

[자바 ORM 표준 JPA 프로그래밍] JPA 시작 1

by upswp 2022. 2. 15.

데이터베이스 방언

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

  • 데이터 타입 : 가변 문자 타입으로 MySQL은 VARCHAR, 오라클은 VARCHAR2를 사용합니다.
  • 다른 함수명 : 문자열을 자르는 함수로 SQL 표준은 SUBSTRING()를 사용하지만 오라클은 SUBSTR()을 사용합니다.
  • 페이징 처리 : MySQL은 LIMIT를 사용하지만 오라클은 ROWNUM을 사용합니다.

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

위의 그림을 보면 개발자는 JPA가 제공하는 표준 문법에 맞추어 JPA를 사용하면 되고, 특정 데이터베이스에 의전족인 SQL은 데이터베이스 방언이 처리해 줍니다. 따라서 데이터베이스가 변경되어도 애플리케이션 코드를 변경할 필요없이 데이터 베이스 방언만 교체하면 됩니다. 참고로 데이터베이스 방언을 설정하는 방법은 JPA에 표준화되어 있지 않습니다.

하이버네이트는 다양한 데이터베이스 방언을 제공합니다. 대표적으로

  • H2 : org.hibernate.dialect.H2Dialect
  • 오라클 10g : org.hibernate.dialect.Oracle10gDialect
  • MySQL : org.hibernate.dialect.MySQL5InnoDBDialect

엔티티 매니저 설정

  • 엔티티 매니저 팩토리 생성

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

  EntityManagerFactory emf = 
          Persistence.createEntityManagerFactory("jalsalda")

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

  • 엔티티 매니저 생성엔티티 매니저 팩토리에서 엔티티 매니저를 생성합니다. JPA의 기능 대부분은 이 엔티티 매니저가 제공합니다. 대표적으로 엔티티 매니저를 사용해서 엔티티를 데이터베이스에 등록/수정/삭제/조회할 수 있습니다. 엔티티 매니저는 내부에 데이터소스(데이터베이스 커넥션)를 유지하면서 데이터베이스와 통신합니다. 따라서 애플리케이션 개발자는 엔티티 매니저를 가상의 데이터베이스로 생각할 수 있습니다.
    참고로 엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용하면 안됩니다.
  • EntityManager em = emf.createEntityManager();
  • 종료
  • em.close(); // 엔티티 매니저 종료
  • 마지막으로 사용이 끝난 엔티티 매니저는 다음 처럼 반드시 종료해야 합니다.
  • emf.close(); // 엔티티 매니저 팩토리 종료