
"시작이 반이다"라는 문장처럼 프로젝트를 생성하고 설정하는 것이 학습할 때의 가장 큰 비중을 차지한다고 생각한다. 굳이 이런 내용까지 정리할 필요가 있나? 싶을 수도 있지만, 최근에 제대로된 자바 프로젝트를 하지 않았다보니 감도 되찾을 겸 프로젝트 생성부터 정리해볼까 한다.
강의에서는 JPA 인터페이스의 구현체로 Hibernate를 선택했다. IntelliJ의 Maven 탭을 보면 hibernate-entitymanger 라이브러리가 설치된 것을 확인할 수 있고, 해당 라이브러리에 필요한 의존성 라이브러리들도 자동으로 설치되는 것을 볼 수 있다.
참고로 나의 경우에는 5.6.14 버전으로 업그레이드가 가능하다는 경고 문구가 나와서 나는 업그레이드를 해줬다.
<dependencies>
<!-- JPA Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.14.Final</version>
</dependency>
</dependencies>
강의에서는 h2 데이터베이스를 이용했지만 나는 도커를 이용하여 MySQL 데이터베이스를 사용할 예정이기에 MySQL 전용 라이브러리를 설치해주었다.
<dependencies>
<!-- JPA Hibernate -->
...
<!-- MySQL -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.31</version>
</dependency>
</dependencies>
도커로 구성한 MySQL 데이터베이스는 다음과 같다. (앞으로 사용할 데이터베이스는 JPA_TEST_DB라는 이름으로 생성해두었다.)
FROM mysql:latest
ENV character-set-server utf8mb4
ENV collation-server utf8mb4_general_ci
ENV default-character-set utf8mb4
ENV default-collation utf8mb4_general_ci
ENV MYSQL_DATABASE root
ENV MYSQL_ROOT_PASSWORD password
EXPOSE 3306
docker build -t jpa_test_db:latest .
docker run -d -p 3306:3306 --name jpa_test_db jpa_test_db:latest
JPA 설정 파일은 META-INF 폴더 하위에 persistence.xml 파일을 생성해주면 된다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="mysql">
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="password"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/JPA_TEST_DB?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<!-- 옵션 -->
<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" />-->
</properties>
</persistence-unit>
</persistence>
참고로 persistence 버전은 2.2인데, 버전에 대한 내용은 IntelliJ Maven 탭에 Hibernate 라이브러리에 필요한 의존성 라이브러리들 중 javax.persistence-api:2.2의 버전을 통해 구성된 듯 하다.

강의에서 재미있었던 부분은 데이터베이스 방언(사투리)이었다.
중요한 것은 각각의 데이터베이스마다 사용되는 SQL 문법과 함수가 모두 다르다는 점이다. 그리고 JPA는 특정 데이터베이스에 종속되어있지 않도록 설계되어있다. 그렇다면 어떻게 JPA가 SQL 표준을 지키지 않는 특정 데이터베이스만이 가지고 있는 고유한 기능을 이용하여 쿼리문을 생성할까?
JPA 설정 중에서는 hibernate.dialect 항목이 있는데, 이 부분이 바로 데이터베이스 방언에 대한 처리다. JPA에게 "나는 이런 사투리를 쓸꺼야"라고 지정해두고 설정해둔 사투리에 맞게 JPA가 알아서 번역하도록 지시하는 것이다.

Hibernate는 40가지 이상의 데이터베이스 방언을 지원하고 있다. 왠만한 데이터베이스의 방언이란 방언은 다 가지고 있다는 말이다. 😀
실제로 Oracle8Dialect, H2Dialect 클래스를 열어보면 각 데이터베이스에 맞게 매핑을 해둔 것을 볼 수 있다.

JPA 속성들을 보면 property의 name 항목이 어떤 것은 javax, 어떤 것은 hibernate로 시작하는 것을 볼 수 있다. 쉽게 말하자면, javax로 시작하는 것은 자바 표준을 지키는 것이라고 보면된다. 그리고 hibernate로 시작되는 property는 우리가 사용하는 JPA 구현체가 Hibernate이기 때문에 사용하는 것이다. 즉, 어떤 JPA 구현체를 사용하느냐에 따라서 달라진다는 것이다.