Dialect(방언)이란? 표준 ANSI SQL과 방언 SQL
SQL은 다음과 같이 표준 SQL인 ANSI SQL이 있으며, ANSI SQL 이외에 각 DBMS Vendor(벤더, 공급업체)인 MS-SQL, Oracle, MySQL, PostgreSQL 에서 자신만의 기능을 추가한 SQL이 있습니다. ANSI SQL이 모든 DBMS에서 공통적으로 사용가능한 핵심 표준 SQL이지만, 여러 제품의 DBMS에서는 자신만의 독자적인 기능을 위해서 추가적인 SQL을 만들었습니다.
예를 들어 MS-SQL의 T-SQL 그리고 Oracle의 PL/SQL이 대표적입니다. 또한 기본키를 할당하는 방법에도 MySQL의 경우는 AUTO_INCREMENT 라는 기능과 오라클 DB에는 시퀀스라는 기능이 있습니다. 이것은 마치 대한민국의 수도인 서울에서 사용하는 표준어가 있고 충청, 강원, 경상, 전라, 제주 등의 여러 지방에서 사용하는 방언이 있는것과 비슷하게 보입니다.
Dialect(방언)
JPA는 어플리케이션이 직접 JDBC 레벨에서 SQL을 작성하는 것이 아닌 JPA가 직접 SQL을 작성하고 실행하는 형태입니다. 그런데, DBMS 종류별로 사용하는 SQL 언어가 조금씩 다르다면, 다른 부분에 대한 대처가 필요할 것입니다. 예를 들어 JPA로 게시판을 개발할 때 DBMS마다 다른 페이징 방법을 처리할 필요가 있습니다.
그리고 제품(어플리케이션)을 개발하는데 있어서, 각각 DBMS 벤더별로 다른 모듈을 개발해 주어야 합니다. 만약 고객의 요구에 따라 오라클 DB를 기준으로 작성했던 게시판 프로그램을 MS-SQL에 맞게 추가적으로 개발하려면 엄청난 비용이 들어갈 것입니다.
그러나 개발자는 JPA를 이용함에 있어서 쿼리를 작성할 필요도 없고, JPA를 사용하더라도 각 DBMS별로 조금씩 다른 SQL 방언을 걱정할 필요도 없습니다. JPA에서는 이를 Dialect라는 추상화된 방언 클래스를 제공하고 각 벤더에 맞는 구현체를 제공하고 있습니다.
JPA에서는 설정을 통해 원하는 Dialect만 설정해주면 해당 Dialect를 참고하여 그에 맞는 쿼리를 생성합니다. 따라서 개발시에는 Oracle DB에 맞게 설정하고 어플리케이션을 개발하다가 실제 고객의 환경이 SQL SERVER를 사용중이라면 설정만 SQLServerDialect로 변경해 줌으로써 불필요한 변경에 대한 자원 소모를 줄일 수 있습니다.
하이버네이트 Dialect 설정과 종류
설정은 하이버네이트의 경우에는 설정파일인 persistence.xml의 hibernate.dialect 설정값을 바꾸어 주면 됩니다. 다음은 MySQL InnoDB Dialect 설정입니다.
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
방언의 종류에 대해서는 JPA 구현체마다 다를 수 있는데, 하이버네이트의 경우에는 5.2 버전을 기준으로 DBMS별로 다음과 같은 방언(Dialect)을 제공하고 있습니다. 아래의 링크를 참고합니다.
'JPA - Hibernate' 카테고리의 다른 글
[JPA] xxx.Hobbies is not mapped as an embeddable 오류 발생 원인 및 해결 방법 (0) | 2019.03.12 |
---|---|
[JPA] 식별자 할당 SEQUENCE(시퀀스) 사용 전략 (2) | 2018.07.28 |
[JPA] 엔티티 식별자 DB에서 할당받기. @GeneratedValue와 GenerationType.IDENTITY 전략. (0) | 2018.07.21 |
[JPA] 엔티티 식별자 직접 할당하여 저장하기 (0) | 2018.07.20 |
[JPA] @Id 애노테이션 필드 또는 메서드에 적용시 동작 차이점 (4) | 2018.07.05 |