9장. 데이터소스 서브시스템
이 장에서는 JBoss EAP 6의 데이터소스 개요와 그 설정 방법에 대해 설명한다. 대부분의 웹 애플리케이션들은 데이터베이스에서 정보를 가져와 출력하거나, 입력한 값을 저장하는 것이다. 따라서 데이터베이스와의 연결을 제공하는 데이터소스 서브시스템은 가장 많이 사용되는 서브시스템이다.
앞으로 JBoss EAP 6의 데이터소스의 구조에 대해 설명한 후 실제 데이터소스 설정 방법을 순서대로 설명한다.
1.데이터소스 서브시스템에 대해
-
데이터소스란
데이터소스란 데이터베이스에 연결하는 방법을 캡슐화한 것으로 RDBMS와 상관없이 공통의 인터페이스를 사용해 연결할 수 있도록 하는 방식이다. 데이터베이스 드라이버나 URL에 대한 정보를 애플리케이션에서 분리하여 서버 측에서 별도로 관리하기 때문에, 애플리케이션은 데이터소스를 네이밍 서비스에서 룩업하여 가져다가 데이터베이스 연결을 사용할 수 있다. 이 네이밍 서비스는 Java Naming and Directory Interface (이하, JNDI)를 사용하고 있기 때문에, 애플리케이션에서 룩업할 때 데이터소스의 JNDI 이름만 있으면 된다.
데이터베이스와의 연결 관리는 클라이언트 애플리케이션이 아닌 JBoss EAP 6에서 하게 된다. 비교적 비용이 많이 소요되는 데이터베이스와의 연결도 풀 형태로 관리하여 데이터베이스 연결에 대한 부하를 최소화한다.
-
데이터소스 관련 리소스
JBoss EAP 6의 데이터소스 서브시스템은 Java 표준 데이터소스와 JDBC 드라이버 리소스를 하나로 통합하여 관리한다.
데이터소스 리소스에서는 데이터소스의 동작에 대한 여러 가지 설정을 할 수 있다. 또, 이 리소스를 여러 개 작성하여 데이터소스를 여러 개 정의할 수 있다.
JDBC 드라이버 리소스에서는 모듈 형태로 참조하기 위한 설정이 필요하다. 여기서 말하는 모듈은 JDBC 드라이버의 jar 파일을 EAP 6용 모듈로 만드는 것이다. JBoss EAP 6에서는 클래스 패스가 없어 jar 파일을 직접 참조하지 않기 때문에, 데이터소스에서 사용하는 JDBC 드라이버도 모듈화해야 한다.
JBoss EAP 6에서 데이터소스를 만들려면, JDBC 드라이버를 모듈로 설치하고 데이터소스를 정의해야 한다.
데이터소스는 일반 데이터소스(Non-XA)와 XA 데이터소스 두 가지 형태가 있다.
XA 데이터소스는 하나의 트랜잭션이 여러 데이터베이스에 걸쳐 사용되는 경우에 사용된다. 그래서 XA 데이터소스를 사용하게 되면 오버 헤드가 늘어나게 된다.
Non-XA 데이터소스는 한 개의 데이터베이스에 대해서만 트랜잭션을 사용하는 애플리케이션에서 사용한다.
관리 콘솔 또는 CLI에서 데이터소스를 만들 때, 애플리케이션의 요구사항에 따라 데이터소스를 XA데이터소스로 만들지, Non-XA 데이터소스로 만들지 결정하게 된다.
💡 TIP: JDBC란?
JDBC API는 Java 애플리케이션이 데이터베이스에 접근하는 방법을 정의하는 표준이다. JDBC 드라이버를 참조하는 데이터소스는 애플리케이션 서버에서 설정한다. 그런 다음 애플리케이션에서는 애플리케이션 서버에서 설정한 데이터소스를 룩업하여, 표준 JDBC API를 사용하여 코드를 작성하면, 드라이버가 그 코드를 해당 데이터베이스에 사용할 수 있도록 변환하여 실행한다. 따라서 애플리케이션에서 JDBC 드라이버를 참조하는 코드를 한 번만 작성하면 어떤 데이터베이스에도 사용할 수 있다.
JDBC 4.0 표준은 다음 사이트에 정의되어 있다.http://jcp.org/en/jsr/detail?id=221
💡 TIP: JPA와 데이터소스
|최근에는 Java EE의 애플리케이션에서 데이터베이스에 접근하는 경우 JPA를 사용하는 경우가 있다. JPA는 O/R맵핑 아키텍처를 사용하는 Java 프레임워크이며 Java EE6 표준이다. JPA를 사용하면, Java의 오브젝트 구조와 데이터베이스의 테이블 구조가 자동으로 변환되기 때문에 애플리케이션의 코딩 및 데이터베이스 변경이 쉬워진다. JPA에서 데이터베이스에 접근할 때에도 데이터소스를 사용한다.
2.MariaDB 설치
이 책에서 데이터소스 테스트에 MariaDB 데이터베이스를 사용한다. MariaDB는 MySQL의 후속 데이터베이스로 오라클 소유의 불확실한 MySQL의 라이선스 상태에 반발하여 MySQL과 같은 소스코드를 기반으로 만들어졌다. MySQL 핵심 개발자들이 설립한 MariaDB Foundation에서 개발하고 있다.
Maria라는 이름은 핵심 개발자인 Michael Widenius의 둘째 딸 이름에서 따온 것이라고 한다. 재미있게도 My는 첫째 딸 이름이다. 부모가 같은 소스를 기반으로 하므로 MySQL과 MariaDB는 자매 관계라고 부를 수 있다.
MariaDB는 MySQL과 소스코드가 같아서 5.5버전까지는 사용 방법과 구조가 같다. 차이점이 있다면, 성능이다. MariaDB는 MySQL과 비교해 복제 속도가 약 4~5천 배 빠르며, 성능도 최고 70% 정도 향상되었다.
새롭게 추가된 기능들도 많다. MariaDB에는 새로운 저장 엔진인 Aira 뿐만 아니라 InnoDB를 교체할 수 있는 XtraDB 저장 엔진을 포함하고 있다. 스레드 풀이나 샤딩 기술도 제공한다.
MariaDB의 사용 방법은 이 책에서 설명하지 않는다. 자세한 사용 방법은 http://www.mariadb.org를 참고하라.
JBoss EAP 6의 데이터소스 서브시스템 설정을 위해, 먼저 RHEL(CentOS) 6.x에 MariaDB를 설치하자.
따라해보기
- MariaDB 레파지토리 설정
- MariaDB 설치
- MariaDB 시작
- 암호 설정
- 데이터베이스 연결 확인
-
MariaDB 레파지토리 설정
먼저 MariaDB의 YUM 레파지토리를 설정한다.
$ **sudo vi /etc/yum.repo/mariadb.repo**
mariadb.repo의 파일 내용은 다음과 같다.
# MariaDB 5.5 CentOS repository list - created 2013-12-15 04:12 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
-
MariaDB 설치
다음 명령을 입력하여 MariaDB 서버를 설치한다.
$ sudo yum install MariaDB-server MariaDB-client
-
MariaDB 시작
MariaDB를 시작한다. 5.5버전까지는 MySQL과 사용방법이 같다.
$ sudo /etc/init.d/mysql start
-
암호 설정
MariaDB root 패스워드와 원격 접속 등을 설정한다.
$ sudo mysql_secure_installation
RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none): [엔터]
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] [엔터]
New password: [password 입력]
Re-enter new password: [password 입력]
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] [엔터]
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] n
... skipping.
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] n
... skipping.
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] [엔터]
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
-
데이터베이스 연결 확인
MariaDB 클라이언트로 MariaDB 서버에 연결하여 테 스트한다.
$ mysql -u root -p
Enter password: [패스워드 입력]
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 14
Server version: 5.5.34-MariaDB MariaDB Server
Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> use test;
Database changed
MariaDB [test]> show tables;
Empty set (0.00 sec)
MariaDB [test]>
3.JDBC 드라이버 등록
JBoss EAP 6 에서 JDBC 드라이버를 등록하는 두 가지의 방법이 있다. 하나는 JDBC 드라이버인 jar 파일 자체를 애플리케이션처럼 배포하여 등록하는 방법과 JDBC 드라이버 jar 파일을 모듈 형태로 패키징하여 등록하는 방법이다. 다음의 표는 두 가지 JDBC 드라이버 등록 방법에 대한 비교표이다.
-
JDBC 드라이버 등록 방법 - jar 파일 배포와 모듈 패키지 배포의 비교
항목 jar 파일 배포 모듈형태 배포 설치 방법 jar 파일로 배포하는 경우에 동적 모듈로 인식하여 데이터소스로부터 참조 가능한 상태가 된다. •$JBOSS_HOME/modules 디렉터리 아래에 복사하여 모듈화한다. 이러한 커스텀 모듈은 다른 모듈로부터 의존관계(dependencies)로 참조되는 경우 사용된다. 도메인 관리 여부 도메인 환경에서 여러 개의 인스턴스를 관리하는 경우 배포도 일괄 관리할 수 있어, 여러 개의 인스턴스가 사용하고 있는 JDBC 드라이버를 일괄적으로 버전 업그레이드하는 관리가 가능하다. 커스텀 모듈은 도메인모드의 관리 대상이 아니어서, 여러 개의 노드에 대해 일괄 관리할 수 없다. JDBC 드라이버 패키지 JDBC 드라이버가 여러 개의 jar 파일로 구성된 경우, 배포하면 다른 모듈로 인식되기 때문에, 이 방법을 사용할 수 없다. 모듈을 정의할 때 jar 파일을 여러 개 지정할 수 있기 때문에 JDBC 드라이버의 jar 파일이 여러 개일 경우에도 사용할 수 있다. 표 1. JDBC 드라이버 배포 방법 비교
위의 두 가지 방법은 설치나 사용 조건이 달라서, 필요에 따라서 구분하여 사용하여야 한다.
다음에서 두 가지 방법에 대해서 JDBC 드라이버의 설치 방법을 순서대로 설명한다. 관리 리소스의 /subsystem=datasources 리소스 아래에 jdbc-driver라는 리소스 타입이 존재한다. JAR 파일을 배포하여 설치하는 경우 jdbc 리소스를 작성할 필요는 없지만, 커스텀 모듈을 작성하여 설치하는 경우에는 jdbc 에 대한 모듈 리소스를 작성해야 한다.
JDBC 드라이버 다운로드
데이터베이스에 연결하려면 먼저 데이터베이스 벤더에서 제공하는 JDBC 드라이버가 필요하다. 사용하려는 데이터베이스 벤더가 제공하는 JDBC 드라이버를 다음 표의 URL에서 다운로드 받을 수 있다. 이 책에서는 MariaDB를 사용하고 있어 ‘MariaDB Client Library for Java Applications’을 다운로드 받는다.
표2. JDBC 드라이버 다운로드 위치
배포를 통한 JDBC 드라이버 설치
따라하기
- JDBC jar 파일 다운로드
- DataSource 등록
- DataSource 속성 등록
- JDBC 드라이버 선택
- JDBC Connection 정보 입력
- 등록 데이터소스 [Enable]
- 데이터소스 [Enable] 확인
- Test Connection 선택
- JDBC 데이터소스 테스트 확인
-
JDBC jar 파일 다운로드
다음의 URL에서 JDBC 드라이버를 다운로드 한다.
-
MariaDB Client Library for Java Applications 1.1.5 Stable- https://downloads.mariadb.org/client-java/1.1.5/
-
JDBC 드라이버 jar 파일의 배포는 일반 애플리케이션과 마찬가지로 관리도구를 사용하면 된다. 관리 콘솔로 JDBC 드라이버를 설치하는 방법은 일반적인 애플리케이션archive파일을 배포하는 것과 같다.
아래는 관리 CLI를 사용해 JDBC 드라이버 mariadb-java-client-1.1.5.jar를 설치하는 예이다.
[standalone@localhost:9999 /] deploy /EAP6book/download/mariadb-java-client-1.1.5.jar
-
-
DataSource 등록

-
DataSource 속성 등록
데이터소스에 대한 JNDI 이름 등록

-
JDBC 드라이버 선택
설치한 MariaDB JDBC 드라이버 선택

-
JDBC Connection 정보 입력
‘Connection Settings’ 입력 값은 다음 표와 같다.
항목 설정 값 Connection URL jdbc:mysql://locahost:3306/test Username root Password password Security Domain (공백) Connection 설정 부분은 아래의 그림과 같습니다.

-
등록 데이터소스 [Enable]

-
데이터소스 [Enable] 확인

-
Test Connection선택

-
JDBC 데이터소스 테스트 확인

모듈로 JDBC 드라이버 설치
배포하는 방법과 마찬가지로 MariaDB JDBC 드라이버를 모듈로 등록하는 방법을 살펴보자.
MariaDB 용 JDBC 드라이버 모듈로 등록하는 절차는 다음과 같다.
따라하기
- JDBC 드라이버 다운로드
- 사용자 모듈 배포를 위한 layers.conf 파일 작성
- 모듈배포를 위한 디렉터리 생성
- JDBC 드라이버 복사
- module.xml 파일 작성
- JDBC 드라이버등록
-
JDBC 드라이버 다운로드
다음URL에서 JDBC 드라이버를 다운로드한다.
MariaDB Client Library for Java Applications 1.1.5 Stable- https://downloads.mariadb.org/client-java/1.1.5/
-
사용자 모듈 배포를 위한 layers.conf 파일 작성
사용자 모듈을 별도의 디렉터리에 보관하기 위해 layers.conf 파일을 작성한다.
JBOSS_HOME/modules/system/layers/layers.conf**
파일의 내용은 다음과 같다.
layers=ext
-
모듈 배포를 위한 디렉터리 생성
$JBOSS_HOME/modules/system/layers/ext/디렉터리 아래와 같은 파일 경로를 생성한다. MariaDB의 경우 다 음과 같이 디렉터리를 생성한다. JBOSS_HOME/modules/system/layers/ext/org/mariadb/main** -
JDBC 드라이버 복사
$ *cd /EAP6book/download*
$ *cp mariadb-java-client-1.1.5.jar $JBOSS_HOME/modules/system/layers/ext/org/mariadb/main/* -
module.xml 파일 작성
$JBOSS_HOME/system/layers/base/org/mariadb/main/디렉터리에 다음 내용과 같은 MariaDB를 위한 module.xml 파일을 만든다.$ cd $JBOSS_HOME/modules/system/layers/ext/org/mariadb/main
$ vi module.xmlmodule.xml 파일의 내용은 다음과 같다.
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.mariadb">
<resources>
<resource-root path="mariadb-java-client-1.1.5.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
<module name="javax.servlet.api" optional="true"/>
</dependencies>
</module>모듈 이름 org.mariadb는 모듈의 디렉터리 구조와 같아야 한다.
-
JDBC 드라이버등록
JBoss 인스턴스를 시작하고, CLI를 사용하여 모듈로 등록한 MariaDB 드라이버를 등록한다.
$ cd $JBOSS_HOME/bin
$ ./standalone.shJBoss CLI를 시작한다.
$ cd $JBOSS_HOME/bin
$ ./jboss-cli.sh -c모듈을 등록한다.
[standalone@localhost:9999 /] /subsystem=datasources/jdbc-driver=mariadb:add(driver-name=mariadb,driver-module-name=org.mariadb)
{"outcome" => "success"}