728x90
300x250

[Spring-Framework] 6. Maven, Hibernate 5.4, Servlet, MySQL 8 연동(CRUD) - (1)


Hibernate 5.4 이상에서 ORM기반의 데이터베이스를 사용하는 방법에 대해서 소개하겠다.

글을 작성하게 된 계기는 인터넷을 검색해보니깐, 워낙 오래된 Hibernate 버전을 기준으로 현실성이 없는 복잡한 구현의 글이 많아서 쉽고 간단하게 작성할 수 없겠느냐는 생각을 갖고 좀 더 쉽고 적응하기 쉽도록 만들어보고자 작성하게 되었다.


글을 2부로 구성하였다.


조금 태스트를 하면서 느낀 소감은 iBatis나 SQL이 훨씬 사용하기에는 편리하다.

절차지향적인 언어인 SQL 사용하는 게 나쁜 건만 아니라고 본다.


조금 양이 많을 수 밖에 없어서 불가피하게 두 개의 글로 나누었으니 참고하길 바란다.


Hibernate(하이버네이트)란?

하이버네이트 ORM은 자바 언어를 위한 객체 관계 매핑 프레임워크이다.
객체 지향 도메인 모델을 관계형 데이터베이스로 매핑하기 위한 프레임워크를 제공한다.
하이버네이트는 GNU LGPL 2.1로 배포되는 자유 소프트웨어이다.

https://hibernate.org/



ORM(Object-relational mapping)이란?

ORM(Object-relational mapping)을 단순하게 표현하면 객체와 관계와의 설정이라 할 수 있다.
ORM에서 말하는 객체(Object)의 의미는 우리가 흔히 알고 있는 OOP(Object_Oriented Programming)의 그 객체를 의미한다는 것을 쉽게 유추할 수 있을 것이다. 그렇다면 과연 관계라는 것이 의미하는 것은 무엇일까?
지극히 기초적인 이야기지만 개발자가 흔히 사용하고 있는 관계형 데이터베이스를 의미한다.



[환경]

- 운영체제: Microsoft Windows 10


- 웹서버: Apache-tomcat-9.0.37                (http://tomcat.apache.org/)


- IDE: Spring Tool-Suite 4-4.7.2 Releases      (https://spring.io/tools)

  * JBoss -> Hibernate만 설치할 것(필수) - Help->Eclipse Marketplace


- 데이터베이스: MySQL 8.0.21 Windows 64bit  (https://dev.mysql.com/downloads/mysql/)

  * Library: Connector/J 8.0.21


- 개발 라이브러리:

  * Maven

    - https://maven.apache.org/

  * hibernate-entitymanager (5.4.21 Final)

    - https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager

    - https://hibernate.org/

  * javax.inject (1)
  * javax.servlet-api (4.0.1)

    - https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api

  * mysql-connector-java (8.0.21)

    - https://mvnrepository.com/artifact/mysql/mysql-connector-java




1. MySQL Server - 설치하기


아래의 사이트에 접속한다.

https://dev.mysql.com/downloads/mysql/


설치 방법은 워낙 간단하고, 잡음이 적은 프로그램이므로 짧게 정리하였다.




그림 1) MySQL Server 8.0.21 - 설치하기





그림 2) MySQL Server 8.0.21 - 설치하기



2. 테이블 설계 (emptable, student)


dto 또는 model 영역 중 하나의 작업으로 두 개의 테이블을 설계하였다.


"emptable", "student"




그림 3) 데이터베이스 테이블 생성 - emptable






그림 4) 데이터베이스 테이블 생성 - student



CREATE TABLE `emptable` (

  `empno` INT NOT NULL AUTO_INCREMENT,

  `name` VARCHAR(20) NULL,

  `address` VARCHAR(100) NULL,

  `createdate` DATE NULL,

  PRIMARY KEY (`empno`));


INSERT INTO `emptable` (`name`, `address`, `createdate`) VALUES ('하하', '안녕', '20-09-1');



CREATE TABLE `student` (

  `studentno` INT NOT NULL AUTO_INCREMENT,

  `name` VARCHAR(45) NULL,

  `address` VARCHAR(100) NULL,

  `createdate` DATE NULL,

  PRIMARY KEY (`studentno`))

ENGINE = InnoDB

DEFAULT CHARACTER SET = utf8

COLLATE = utf8_unicode_ci;


INSERT INTO `student` (`name`, `address`, `createdate`) VALUES ('홍길동', '연습', '21-3-4');


[첨부(Attachments)]

emptable.zip

student.zip




3. 프로젝트 구성


미리 살펴보는 hibernateMaven2 프로젝트의 구성이다.



그림 5) 프로젝트 구성도 - hibernateMaven2


* Servlet 구성

- /SampleServlet

- /StudentServlet



4. POM.xml 수정하기(Maven 적용된 프로젝트)


pom.xml이 왜 없냐고 생각하는 경우가 있을 수 있다.

알기 쉽게 소개하면, maven이 적용되어있는 프로젝트에서 존재하는 기능이라고 보면 된다.


http://mvnrepository.com에 접속해서 몇 가지 구성을 찾아서 입력해줘야 한다.


(중략)

      <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->

<dependency>

    <groupId>org.hibernate</groupId>

    <artifactId>hibernate-entitymanager</artifactId>

    <version>5.4.21.Final</version>

</dependency>

    <!-- @Inject -->

    <dependency>

        <groupId>javax.inject</groupId>

        <artifactId>javax.inject</artifactId>

        <version>1</version>

    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->

<dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>javax.servlet-api</artifactId>

    <version>4.0.1</version>

    <scope>provided</scope>

</dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->

<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <version>8.0.21</version>

</dependency>


(중략)




그림 6) pom.xml 수정하기







5. hibernate 환경설정 - 생성과 수정


이 작업은 "JBoss -> hibernate" 라이브러리를 설치하지 않으면, 의미가 없다고 보면 된다.

수동으로 물론 셋팅할 수는 있으나 권장하진 않는다. (시도해봐도 무방, 처음에 찾는데 시간이 오래 걸린다. 이런 문제)




그림 7) 프로젝트 항목 -> 오른쪽 버튼 메뉴 모습





그림 8) Hibernate Configuration File 선택하기


- Hibernate XML Mapping file 기능은 생성이 되지 않는다.

  (꼭 반드시 XML Mapping으로 hibernate resources를 잡을 필요는 없으며, Class Mapping도 사용된다.)


셋팅에서 필요한 부분들을 정리해보았다.


* hibernate.connection.driver_class = com.mysql.jdbc.Driver

* hibernate.connection.url = jdbc:mysql://localhost:3306/web?serverTimezone=UTC&characterEncoding=utf8

* hibernate.dialect = org.hibernate.dialect.MySQL8Dialect

* hibernate.show_sql = true

* hibernate.hbm2ddl.auto = update

* hibernate.default_entity_mode = pojo

* hibernate.current_session_context_class = thread



문제1. [MySQL 초기 설치 후 작업했을 때, 타임존 문제]


타임존 미설정시

* ERROR: The server time zone value


해결 방법1: serverTime=UTC를 입력해준다.

해결 방법2: 서버 my.cnf 파일에서 timezone을 지정해준다.


* my.cnf 파일 내에 환경 설정을 변경해주는 방법이 있다.
[mysqld]

default-time-zone='+9:00'



문제2. [UTF-8 환경설정 문제]


해결 방법1: characterEncoding=utf8을 입력해준다.

해결 방법2: 서버 my.cnf 파일에서 timezone을 지정해준다.


* my.cnf 파일 내에 환경 설정을 변경해주는 방법이 있다.

[mysqld]

init_connect = SET collation_connection = utf8_general_ci

init_connect = SET NAMES utf8

character-set-server = utf8

collation-server = utf8_general_ci




그림 9) hibernate.cfg.xml


[첨부(Attachments)]

hibernate.cfg.zip


* 경로는 다음과 같다. 참고로 초기에 폴더가 생성되어 있는 것이 아니라서, 수동으로 폴더를 만들어줘야 한다.


폴더: src/main/resources




그림 10) hibernate 모습



물론 공식 메뉴얼만 가지고 이해가 되지 않으면 추가적인 검색을 시도해봐도 된다.





5. 결과 - 미리 살펴보는 결과


완성된 작품은 이러한 모습을 가지고 있다.

무슨 작품을 만들지 생각해보기 위함이다.


그림 11) 출력 결과 - 웹 브라우저




그림 12) 출력 결과 - 웹 브라우저(2)




그림 13) 출력 결과 - 웹 브라우저(3)




6. 2부에서 만나요 


게시글 2부에서 연속 글이 연재된다.


[Spring-Framework] 7. Maven, Hibernate 5.4, Servlet, MySQL 8 연동(CRUD) - (2)

https://yyman.tistory.com/1405




* 참고 자료(References)


1. Hibernate Getting Started Guide, https://docs.jboss.org/hibernate/orm/5.4/quickstart/html_single/, Accessed by 2020-09-21, Last Modified 2020-08-27 10:35.

- 공식적인 Hibernate 메뉴얼이니 이해가 안 되면 읽어보길 바란다.


2. Hibernate 5 Java Configuration Example - DZone Java, https://dzone.com/articles/hibernate-5-java-configuration-example, Accessed by 2020-09-21, Last Modified 2018-12-03

- 추천(70점): 가장 실질적으로 많은 도움을 받았던 글이다. (영어 글)


3. MySQL(MariaDB) 서버 타임존 설정하기, https://offbyone.tistory.com/318, Accessed by 2020-09-21, Last Modified 2018-07-17 23:38.

4. java.sql.SQLException: The server time zone value ‘xx time’ is unrecognized, https://mkyong.com/jdbc/java-sql-sqlexception-the-server-time-zone-value-xx-time-is-unrecognized/, Accessed by 2020-09-21, Last Modified 2019-07-05.

- 비고: (영어 글)이다.

반응형
728x90
300x250

[이야기] Maven, Oracle 19, Hibernate 5.4 - ORM 구현 및 동작하나요?


인터넷 글 등을 참고해보면, 대다수 검색되는 내용이 "Spring + Maven + Hibernate + MySQL" 조합의 글들이 굉장히 많이 나온다.

해외 사이트를 찾아서 참고해보면, "Maven + Hibernate + MySQL" 조합도 종종 나온다.

StackOverflow에 Oracle 19g와 Hibernate를 사용할 때 Dialect을 어떤 것을 사용해야 하는지 검색을 해보았다.

Oracle 12버전으로 하면 된다고 해서 시도하였으나 동작하지 않았다.



* 오라클로 작업을 하고자 하는 인원이 있다면, 참고하면 좋겠다.


* 결론: 수 차례 실험 결과로는 동작하지 않는다. (2020-09-20일 기준)



- 오라클 데이터베이스 자체가 전혀 안 된다는 이야기는 아니고, Dialect 등이 엄격하게 버전을 인식하는 것으로 추측해본다.
  (실험을 해보면 Oracle 11, Oracle 12로 시도했을 때는 될 수도 있다는 이야기를 하고 싶었다.)
- 물론 시간적인 여력이 된다면, 연재해보겠다. 

  (오라클 제거하고, 컴퓨터 포멧이나 VirtualBox 등 각종 방법으로 실험을 한다고 했을 때 시간이 소요되는 작업이다. 결코 쉽지않은 작업들이다.)




1. 작업화면


수 차례 실험하였으나 동작하지 않는다.



그림 1. hibernate Maven 프로젝트




2. 실험 환경


* 컴퓨터 사양: intel i5 4세대 이상, SSD 256GB 이상, RAM 16GB 이상

* 시도 횟수: 4번(hibernate 초기 로드시간이 상당히 오래 걸림.) - 코드 작성 / 재작업 등 각종 숨은 디버깅 작업이 있었음.

              데이터베이스 테이블도 구현하였고 각종 작업을 하였음.


* IDE: Spring-tool-suite-4-4.7.2 Release(Eclipse)

     Jboss - hibernate만 설치


* POM:

      java-servlet

      hibernate-em(entity-manager)

      oracle-19g(ojdbc8)


* Database: 

      Oracle Databases 19g


* Web Server:

      Apache Tomcat 9


* 환경설정 파일 생성: Jboss - hibernate로 자동 생성하였음. (src/main/resources 폴더 내에 hibernate.cfg.xml 설치함)


* 프로젝트


   - [첨부(Attachments)]

hibernateMaven.zip


특이한 점: 초기 웹서버를 리셋하고, URL주소를 입력하여 DB에 접근하면 무한 반응으로 대기상태에 한참 있다가 hibernate 동작에서 

한참 대기 후에 결과가 나옴.


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

                                         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

 <session-factory name="">

  <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

  <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>

  <property name="hibernate.connection.username">사용자계정</property>

  <property name="hibernate.connection.password">비밀번호</property>

  <property name="hibernate.dialect">org.hibernate.dialect.Oracle12cDialect</property>

  <property name="hibernate.show_sql">true</property>

  <property name="hibernate.use_sql_comments">true</property>

  <property name="hibernate.format_sql">true</property>

  <mapping class="com.hibernateMaven.web.model.EmpTable"/>

 </session-factory>

</hibernate-configuration>


* 파일명: hibernate.cfg.xml

* 비고: Dialect이 지원될 때까지는 기다려야 할 것으로 보인다. 이전 Dialect으로 연결 시도를 해도 된다는 Stackoverflow 글도 참고하였으나 확인되진 않았다.

        (2020-09-21)



그림 2. JBoss Tools 4.16.0. Final



그림 3. Maven Project 생성 모습의 예



그림 4. 프로젝트 오른쪽 버튼 -> New -> Other....



그림 5. Hibernate 환경설정 파일 - 마법사 (JBoss 기반)



그림 6. Hibernate 환경설정 파일 - 마법사 (JBoss 기반)




그림 7. Hibernate 환경설정 파일 - 마법사 (JBoss 기반)



그림 8. Hibernate 환경설정 파일 생성된 모습


JBoss - Hibernate 플러그인을 설치하면, GUI화면으로도 작업할 수 있다.



그림 9. Hibernate 환경설정(GUI)으로 Mapping 시도하는 모습


실험하면서 동작하였으면, 좋은 글 하나 나왔을 탠데 아쉽다는 조금 생각이 든다.


현재 시중 블로그에 제대로 동작하는 Hibernate + Maven + Oracle 18 이상의 프로젝트는 없다고 보면 정확할 거 같다.

OpenTutorial 이런 강의 사이트 동영상도 참고해보기도 하고, 많은 시간을 투자하였다.





3. 결론(Conclusion)


안 될 때는 과감하게 정리해야 한다. 시도해볼만한 삽질이라면, 해야 하는게 맞지만, 오래 시도하기에는 애매한 작업들이 있다.


Hibernate보다는 MyBatis가 좋다고 보는게, 직관적으로 SQL 문법을 자유롭게 사용할 수 있다는 게 큰 장점이라고 본다.

ORM(객체-관계-맵핑)이라는 주제도 물론 중요하지만, 그거 필요하면 코드로 그냥 구현해서 사용하는 게 더 이득이고 낫다고 주장해본다.


엔터프라이즈 환경에 적합하다고 적은 교과서도 시중에 있긴 있는데, 꼭 그렇진 않은 거 같다고 본다.

서버 튜닝으로 막아도 무방하고, MySQL 이런 것도 예를 들면 튜닝이나 Cluster 등 다양한 방법론을 잘 적용하면 엔터프라이즈에서도 사용할 수 있다고 본다.


SQL 문법이 크게 어려운 것이 아니니깐, ORM은 여전히 시기상조라고 주장해본다.

더 복잡해지고 개발환경이나 생산성에서 미흡한 점이 여전히 남아 있다.

반응형

+ Recent posts