JPA는 특정 데이터베이스에 종속적이지 않은 기술이다. 따라서 다른 데이터베이스로 손쉽게 교체할 수 있다.
SQL은 표준 SQL인 ANSI SQL이 있으며, ANSI SQL 이외에 각 DBMS Vendor인 MS-SQL, Oracle, MySQL, PostgreSQL에서 자신만의 기능을 추가한 SQL이 있다. ANSI SQL이 모든 DBMS에서 공통적으로 사용가능한 핵심 표준 SQL이지만, 여러 제품의 DBMS에서는 자신만의 독자적인 기능을 위해 추가적인 SQL을 만들었다. 즉, 각 데이터베이스가 제공하는 SQL 문법과 함수가 조금씩 다르다는 문제점이 있다. 예를 들면 다음과 같은 차이점들이 존재한다.
- 데이터 타입 : 가변 문자 타입으로 MySQL은 VARCHAR, 오라클은 VARCHAR2를 사용한다.
- 다른 함수명 : 문자열을 자르는 함수로 SQL 표준은 SUBSTRING()을 사용하지만 오라클은 SUBSTR()을 사용한다.
- 페이징 처리 : MySQL은 LINIT를 사용하지만 오라클은 ROWNUM을 사용한다.
- 기본키 할당 : MySQL은 AUTO_INCREMENT 오라클은 SEQUENCE 를 사용한다.
이처럼 SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 JPA에서는 방언(Dialect)라고 한다. 데이터 베이스에 종속되는 기능을 많이 사용하게 되면 나중에 데이터베이스를 교체하기 힘들다. JPA는 직접 SQL을 작성하고 실행하는 형태이기 때문에 별도 Dialect 설정을 해주면 JPA가 DBMS에 맞는 쿼리를 생성한다.
따라서 JPA가 제공하는 표준 문법에 맞추어 JPA를 사용하면 되고, 특정 데이터베이스에 의존적인 SQL은 데이터베이스 방언이 처리해 준다. 따라서 데이터베이스가 변경되어도 애플리케이션 코드를 변경할 필요 없이 데이터베이스 방언만 교체하면 된다. JPA에서는 Dialect라는 추상화된 방언 클래스를 제공하고, 각 벤더에 맞는 구현체를 제공하고 있기 때문이다.
JPA에서는 설정에 맞게 Dialect만 설정해주면 해당 Dialect를 참고하여 그에 알맞은 쿼리를 작성해 준다. 따라서 개발 시에 Oracle DB에 맞게 설정하고 애플리케이션을 개발하다가 실제 고객의 환경이 SQL SERVER를 사용 중이라면 설정만 SQLServerDialect로 변경해 줌으로써 불필요한 변경에 대한 자원 소모를 줄일 수 있다.
하이버네이트 Dialect 설정과 종류
- Maven ( META-INF/persistence.xml)
프로젝트를 Maven으로 설정할 경우, Maven에서 설장 파일 기본 템플릿은 다음과 같다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence">
<persistence-unit name="이름">
<properties>
</properties>
</persistence-unit>
</persistence>
설정파일인 persistence.xml의 hibernate.dialect 설정값만 바꾸어 주면 된다.
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
이 부분이 Dialect 를 설정해준 부분인데 데이터베이스 dialect를 H2로 설정한 것이다. 이밖에도 JPA를 사용할 때 필수적으로 설정해야 하는 정보는 다음과 같다. ( H2 데이터베이스 사용한다고 가정. )
<!-- 필수 속성 -->
<!--데이터베이스 접근 정보-->
<property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="jakarta.persistence.jdbc.user" value="sa"/>
<property name="jakarta.persistence.jdbc.password" value=""/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
그리고 만약, H2가 아니라, 다른 DB를 사용한다면, 아래와 같이 속성값을 변경하면 된다.
- H2 : org.hibernate.dialect.H2Dialect
- Oracle 10g : org.hibernate.dialect.Oracle10gDialect
- MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
하이버네이트의 경우 설정 파일인 persistence.xml의 설정값을 다음과 같이 설정했다.
H2 데이터베이스를 사용했기 때문에 다음과 같이 hibernate.dialect 속성을 org.hibernate.dialect.H2 Dialect로 설정했다
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
Hibernate 전용 속성
참고로, 하이버네이트를 사용할 경우, 다음과 같은 속성들이 존재한다.
hibernate.show_sql : 하이버네이트가 실행한 SQL을 출력
hibernate.format_sql : 하이버네이트가 실행한 SQL을 출력할 때 보기 쉽게 정렬
hibernate.use_sql_comments : 쿼리를 출력할때 주석도 함께 출력
hibernate.id.new_generator_mappings : JPA 표준에 맞춘 새로운 키 생성 전략을 사용
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="create" />
-Gradle ( application.properties )
gradle을 사용한다면 JPA 방언 설정은 주로 프로퍼티 파일이나 설정 클래스를 통해서 할 수 있다. ( application.yml, application.properties 파일 )
gradle 프로젝트에서 src/main/resources 디렉토리 하위에 application.properties 파일을 생성하고,
다음과 같이 spring.jpa.properties.hibernate.dialect 를 설정할 수 있다.
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
만약 application.yml 파일을 사용한다면 다음과 같이 설정할 수 있다.
spring:
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.H2Dialect
dialect 예시
Dialect는 보통 데이터베이스 이름 + 버전으로 이루어져 있다
H2 : org.hibernate.dialect.H2Dialect.
오라클 10g : org.hibernate.dialect.Oracle10gDialect.
MySQL : org.hibernate.dialect.MySQL55Dialect // 5.5 버전
MySQL : org.hibernate.dialect.MySQL57Dialect //5.7 버전
Reference
[1] https://055055.tistory.com/83
JPA Dialect
김영한님의 강의 내용 정리, oracle dialect 상속 및 사용자 함수 추가 Dialect? 표준 SQL인 ANSI SQL외에, DBMS인 Oracle, MySQL, MS-SQL, PostgreSQL마다 문법과 함수가 조금씩 다른 경우가 있다. 이러한 SQL 표준을
055055.tistory.com
[2] https://dololak.tistory.com/465
[JPA - Hibernate] Dialect(방언)이란? 하이버네이트 Dialect 종류
Dialect(방언)이란? 표준 ANSI SQL과 방언 SQL SQL은 다음과 같이 표준 SQL인 ANSI SQL이 있으며, ANSI SQL 이외에 각 DBMS Vendor(벤더, 공급업체)인 MS-SQL, Oracle, MySQL, PostgreSQL 에서 자신만의 기능을 추가한 SQL이
dololak.tistory.com
데이터베이스 방언 설정 - 인프런
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]자바 ORM 표준 JPA 프로
www.inflearn.com
[4] https://velog.io/@security-won/JPA-Dialect-DB-%EB%B0%A9%EC%96%B8-%EC%84%A4%EC%A0%95
JPA Dialect, DB 방언 설정
JPA는 특정 데이터베이스에 종속되어있지 않다. 그ㄹ래서 DB를 MySQL을 사용하다가 Oracle로 변경을 해도 문제가 없어야한다. 그렇게 때문에 JPA를 사용할때 사용할 DB의 방언으로 설정을 해줘야한다.
velog.io
[5] 인프런 김영한 님의 강의 - https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
'JPA' 카테고리의 다른 글
[JPA] 영속성 관리, 영속성 컨텍스트 (0) | 2024.05.03 |
---|---|
[JPA] Entity와 EntityManager, EntityManagerFactory (0) | 2024.05.03 |