JBoss EAP 5 MySQL JNDI 설정
JNDI 는 자바 애플리케이션 서버라면 거의 다 지원하는 기능이다. 이는 특정한 자원의 접근을 디렉토리 접근하듯이 하도록 해준다. 여기서 자원이라면 대부분 외부 서버에 있는 저장소들을 말한다.
MySQL, PostgreSQL, Oracle, MS SQL 등 외부 저장소에 접속할때마다 저수준의 드라이버를 올리고 인증을 넣는게 아니라 자바 애플리케이션이 구동되면서 접속하을 해놓고 이것을 디렉토리화해서 올려놓으면 자바 애플리케이션에서는 이 디렉토리에 접근하는 것만으로 외부자원에 접속이 끝이 나게 되어 간편해진다.
이 글은 JBoss EAP 5 MySQL JNDI 설정에 관한 글이다.
MySQL Connector/j
MySQL에서는 자바 애플리케이션을 위해서 접속 드라이버를 제공한다. jar 파일로 작성되 배포되고 있어 다운받아서 지정된 위치에 넣기만 하면 된다.
JBoss EAP 5 는 글로벌 library 디렉토리, Node Library 디렉토리가 존재하는데 node 디렉토리에 다운받아 넣는다. 다시말하면, Jboss EAP 5 의 경우에, jboss-as/server 아래에보면 all, default, production, standard 등의 디렉토리가 보이는데 이걸 node 라고 한다. 여기서 나는 all node 에 lib 디렉토리에 MySQL Connector/J 를 넣어주면 된다.
현 시점에서의 버전은 5.1.39 이다.
1 |
]# mv mysql-connector-java-5.1.39-bin.jar $JBOSS_HOME/server/all/lib/ |
MySQL DataSource
이제 JBoss 에 MySQL DataSource 를 설정해준다. 앞에서 잠깐 말했지만 특정 node 에 설정을 해주게되는데 나는 all 노드에 설정을 할 것이다.
일단 mysql-ds.xml 파일을 다음과 같이 작성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?xml version="1.0" encoding="UTF-8"?> <!-- $Id: mysql-ds.xml 41017 2006-02-07 14:26:14Z acoliver $ --> <!-- Datasource config for MySQL using 3.0.9 available from: http://www.mysql.com/downloads/api-jdbc-stable.html --> <datasources> <!-- mysql DS --> <local-tx-datasource> <jndi-name>MySQLDS</jndi-name> <connection-url>jdbc:mysql://192.168.96.25:3306/mysql?useUnicode=true&characterEncoding=UTF-8</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>root</user-name> <password>12345</password> <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> <!-- should only be used on drivers after 3.22.1 with "ping" support --> <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name> <!-- sql to call when connection is created <new-connection-sql>some arbitrary sql</new-connection-sql> --> <!-- sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql> --> <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) --> <metadata> <type-mapping>mySQL</type-mapping> </metadata> </local-tx-datasource> </datasources> |
- 11번째 줄이 아주 중요하다. JNDI 이름인데, 이 이름을 가지고 자원을 호출하게 된다.
- 12번째 줄은 접속 서버 정보이다. 호스트네임이나 IP주소, 접속 데이터베이스명을 적어주면 된다. Unicode 와 CharacterEncoding 은 옵션으로 MySQL 서버와 맞게 설정해 주어야 한다.
- 14번, 15번 줄은 접속을 위한 인증정보를 적어준다.
이걸 mysql-ds.xml 로 저장한 후에 $JBOSS_HOME/server/all/deploy/ 디렉토리에 넣으면 된다.
애플리케이션 WEB-INF/jboss-web.xml 작성
자바 애플리케이션을 작성할때에 WEB-INF 디렉토리를 만나게 된다. Deployment Descriptor 로 정의되는 web.xml 파일이 위치하는 디렉토리다. 여기에 jboss-web.xml 파일을 다음과 같이 작성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 5.0//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd"> <jboss-web> <!-- Uncomment the security-domain to enable security. You will need to edit the htmladaptor login configuration to setup the login modules used to authentication users. <security-domain>java:/jaas/jmx-console</security-domain> --> <resource-ref> <res-ref-name>jdbc/MySQLDS</res-ref-name> <jndi-name>java:/MySQLDS</jndi-name> </resource-ref> </jboss-web> |
- 12,13 줄이 아주 중요하다. JNDI 명을 적어주는데, 앞에 mysql-ds.xml 파일에서 설정한 이름만 적어주는게 아니라 jdbc, java: 등을 함께 적어준다. 이거 의외로 안 적어주고 안된다는 사람이 많으니 주의해서 적어주자.
애플리케이션 WEB-INF/web.xml 작성
Deployment Descriptor 파일로 불리우는 web.xml 파일에 다음과 같은 내용을 추가해준다.
1 2 3 4 5 6 7 8 9 10 |
<web-app> .... <resource-ref> <description>MySQL DataSource</description> <res-ref-name>jdbc/MySQLDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> .... </web-app> |
- 5줄 에 JNDI 이름을 적어준다. jdbc/ 를 꼭 붙여준다.
여기까지가 JNDI 설정에 관한 것이다. 이 이상은 프로그래머가 사용하는 ORM 에 따라서 JNDI 호출 방법이 달라진다. 하지만 JBOSS 에서 JNDI가 잘 설정되어 있는지를 살펴볼 수있다.
root Context 설정
이제 애플리케이션에서 JNDI를 설정해 보면 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!-- Root Context: defines shared resources visible to all other web components --> <tx:annotation-driven /> <!-- enable autowire --> <context:annotation-config/> <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:comp/env/jdbc/MySQLDS" /> <property name="resourceRef" value="true" /> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> |
jndiName 설정을 어떻게 하는지 주의깊게 봐야 한다.
확인하기
설정한 JNDI가 잘 설정되었는지는 맨 처음 JBoss 를 시작할때에 로그에 나온다.
1 2 3 4 5 6 7 |
00:06:33,959 INFO [ConnectionFactory] Connector bisocket://localhost:4457 has leasing enabled, lease period 10000 milliseconds 00:06:33,959 INFO [ConnectionFactory] org.jboss.jms.server.connectionfactory.ConnectionFactory@75e011d9 started 00:06:34,044 INFO [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=ConnectionFactoryBinding,name=JmsXA' to JNDI name 'java:JmsXA' 00:06:34,066 INFO [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=MySQLDS' to JNDI name 'java:MySQLDS' 00:06:34,319 INFO [TomcatDeployment] deploy, ctxPath=/admin-console 00:06:34,427 INFO [config] Initializing Mojarra (1.2_13-b01-FCS) for context '/admin-console' 00:06:36,364 INFO [TomcatDeployment] deploy, ctxPath=/ |
이것은 JNDI 설정 파일을 읽었을 뿐 실제로 접속이 잘되는지를 나오지 않는다. 이는 JBoss Admin Console 를 통해서 가능하다.
위 그림과 같이 Test Connection 을 클릭하면 접속 테스트를 해준다.
위 그림을 보면 Status 가 성공으로 나와서 접속 성공한으로 착각하는데, 이것은 Test Connection 명령이 성공했다는 것이고 그에 대한 결과는 그 아래에 위와같이 나온다. 위 경우에 접속 실패.
이것저것 문제를 해결한 후에 다시 Test Connection 을 하고 성공하면 설정이 정상적으로 된것이다.