JNDI 는 자바 네이밍 디렉토리 인터페이스이다. (J2EE의 가장 중요한 스펙 중에 하나)
* WAS 에 DataSource 를 설정 하는 이유
보통 간단한 개발을 할때는 순수 JDBC 또는 Spring 에서 제공하는 기본적인 DBCP를 사용해서 개발을 한다.
하지만 웹 어플리케이션을 운영할 경우 JDBC 설정을 WAS에서 하게 된다.
이유 1) 실제로 운영을 할 경우 개발자는 웹 어플리케이션을 만들지만, WAS를 관리하는 서버관리자는 따로 있다.
이유 2) 하나의 WAS에 하나의 웹 어플리케이션을 올리기도 하지만 대부분은 그렇지 않다.
즉, WAS : 웹어플리케이션의 관계가 1:n 관계가 많다.
만약 n개의 어플리케이션들이 동일 db를 본다면, DB pool도 n개가 나오게 된다. 그럼 관리도 어렵고 자원이 낭비된다.
이유 3) DB 1 에 장애가 생기면 백업 DB 2로 로드밸런싱을 해야 하는데, 소스단에 DB설정이 있으면 운영상에 어려움을 겪게 된다
JNDI 설정 (spring + tomcat)
- spring xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">
...
<jee:jndi-lookup id="dbDataSource"
jndi-name="jdbc/DatabaseName"
expected-type="javax.sql.DataSource" />
resource-ref 속성의 값이 true일 경우 검색할 이름 앞에 "java:comp/env" 가 붙는다.
따라서 위와 같은 설정은 java:comp/env/jdbc/DatabaseName 이 된다.
<jee:jndi-lookup> 태그를 사용하지 않고 다음과 같이 JndiObjectFactoryBean 클래스를 이용할 수 있다.
<bean id="DatabaseName" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/DatabaseName"/>
</bean>
<jee:jndi-lookup> 태그는 내부적으로 JndiObjectFactoryBean 클래스를 사용한다.
- Tomcat server.xml
<GlobalNamingResources>
<Resource name="jdbc/DatabaseName"
auth="Container"
type="javax.sql.DataSource"
username="dbUser"
password="dbPassword"
url="jdbc:postgresql://localhost/dbname"
driverClassName="org.postgresql.Driver"
initialSize="20"
maxWaitMillis="15000"
maxTotal="75"
maxIdle="20"
maxAge="7200000"
testOnBorrow="true"
validationQuery="select 1"
/>
</GlobalNamingResources>
- Tomcat context.xml
<ResourceLink name="jdbc/DatabaseName"
global="jdbc/DatabaseName"
type="javax.sql.DataSource"/>
Reference documentation:
- Tomcat 8 JNDI Datasource HOW-TO
- Tomcat 8 Context Resource Links Reference
- Spring 4 JEE JNDI Lookup XML Schema Reference
- Spring 4 JndiObjectFactoryBean Javadoc