개요
데이터베이스를 사용하다 보면 자주 마주치는 "Dialect(방언)"이라는 용어가 있습니다. JPA를 사용할 때 특히 중요한 개념인데, 이것이 무엇이고 왜 필요한지 자세히 알아보겠습니다.
방언(Dialect)이란❓
Dialect의 사전적 의미는 '방언' 또는 '사투리'입니다.
이는 같은 언어라도 지역마다 다른 표현이나 억양을 사용하는 것을 의미하는데, 데이터베이스 세계에서도 이와 유사한 개념이 존재합니다.
SQL 표준이라는 공통된 언어가 있지만, Oracle, MySQL, PostgreSQL 등 데이터베이스 벤더사마다 각자의 '방언'처럼 문법이나 함수가 조금씩 다르게 구현되어 있습니다.
벤더❓: 제품이나 서비스를 판매하는 회사나 공급업체를 의미합니다.
데이터베이스 컨텍스트에서 벤더는 데이터베이스 관리 시스템(DBMS)을 개발하고 판매하는 회사를 지칭
데이터베이스마다 차이점
1. 데이터 타입
- 가변 문자 타입 (MySQL) ➡️ VARCHAR
- 가변 문자 타입 (Oracle) ➡️ VARCHAR2
2. 다른 함수명
- 문자열을 자르는 함수
- MySQL ➡️ SUBSTRING()
- ORACLE ➡️ SUBSTR()
3. 페이징 처리
- MySQL ➡️ LIMIT
- ORACLE ➡️ ROWNUM
주요 데이터베이스별 방언 클래스
Hibernate는 위와 같은 계층 구조로 다양한 데이터베이스의 방언을 지원합니다. 최상위 Dialect 클래스를 상속받아 각 데이터베이스에 맞는 구현체를 제공하고 있습니다.
이처럼 SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 JPA에서는 방언이라고 합니다.
애플리케이션 개발자가 특정 데이터베이스에 종속되는 기능을 많이 사용하면 나중에 데이터베이스를 교체하기가 어렵습니다.
Hibernate를 포함한 JPA 구현체들은 이런 문제를 해결하려고 다양한 데이터베이스 방언 클래스를 제공합니다.
- MySQL
- org.hibernate.dialect.MySQL8Dialect
- Oracle
- org.hibernate.dialect.Oracle12cDialect
- PostgreSQL
- org.hibernate.dialect.PostgreSQL10Dialect
- H2
- org.hibernate.dialect.H2Dialect
Hibernate 방언 설정 방법
spring:
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
application.yml이나 application.properties에서 위와 같이 설정할 수 있으며, 실행 환경에 따라 다른 방언을 사용하도록 설정할 수 있습니다.
방언 사용의 장점
- 데이터베이스 이식성 향상
- 개발 환경과 운영 환경의 데이터베이스가 달라도 코드
수정 불필요 - 데이터베이스 마이그레이션 시 용이
- 개발 환경과 운영 환경의 데이터베이스가 달라도 코드
- 개발 생산성 향상
- 데이터베이스별 SQL 문법을 일일이
학습할 필요 없음 - 통일된 인터페이스로 개발 가능
- 데이터베이스별 SQL 문법을 일일이
- 유지보수 용이성
- 데이터베이스 종속적인 코드 감소
- 코드의 일관성 유지 가능
방언의 실제 동작 예시
예를 들어, 페이징 처리를 할 때:
MySQL
SELECT * FROM user LIMIT 10 OFFSET 0
Oracle
SELECT * FROM (
SELECT a.*, ROWNUM rnum FROM (
SELECT * FROM user
) a WHERE ROWNUM <= 10
) WHERE rnum > 0
이렇게 다른 SQL이 생성되어야 하는데, JPA의 방언 덕분에 개발자는 동일한 코드를 다음과 같이 작성할 수 있습니다.
Page<User> findByName(String name, Pageable pageable);
데이터베이스 방언은 JPA에서 제공하는 강력한 추상화 계층으로, 개발자가 특정 데이터베이스에 종속되지 않고 효율적으로 개발할 수 있게 해줍니다.
방언을 적절히 활용하면 데이터베이스 포팅성을 높이고 유지보수성을 개선할 수 있습니다.
'Framework > JPA' 카테고리의 다른 글
[QueryDSL] QueryDSL - @QueryProjction 어노테이션이란❓ (0) | 2024.10.06 |
---|---|
[JPA] @Modifying 어노테이션이란 무엇일까❓ (0) | 2024.10.01 |
[JPA] 프록시(proxy)객체란 무엇일까❓ (1) | 2024.09.15 |
[JPA] Spring Data JPA의 페이징과 정렬을 쉽게 구현하는 방법: Pageable과 PageRequest (0) | 2024.09.02 |
[JPA] JPA에서 단방향 및 양방향 관계 이해 (@ManyToOne, @OneToMany, @OneToOne, @ManyToMany) (1) | 2024.08.23 |