본문 바로가기
교재 실습/자바 웹 개발 워크북

72. DataSource와 JNDI (3)

by Jint 2022. 7. 18.

4. 서버에서 제공하는 DataSource 사용하기

DataSource를 사용하는 이유는 서버에서 관리하기 때문에 데이터베이스에 대한 정보가 바뀌거나 JDBC 드라이버가 교체되더라도 애플리케이션에는 영향을 주지 않기 때문이다. 그런데 앞의 예제는 BasicDataSource를 사용하기 때문에, DataSource의 이점을 누리지 못했다.

이번에는 서버에서 관리하는 DataSource를 사용해 보겠다. 실무에서도 주로 이 방법을 사용한다.

 

- 톰캣 서버에 DataSource 설정하기

톰캣 실행 환경에서 DataSource를 설정한다. 서버 제품에 따라 DataSource를 설정하는 방법이 다르니 항상 서버의 메뉴얼을 참고한다.

톰캣 실행 환경 폴더에서 context.xml 파일을 찾는다(그림 1).

그림 1 (이클립스에서 톰캣 실행 환경의 context.xml 파일 위치)

서버가 설치된 폴더의 파일을 손대면 안된다. 서버를 테스트하기 위해 이클립스로 복사한 파일을 만져야 한다. context.xml 파일을 열고 다음과 같이 편집한다.

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    <!-- 톰캣 서버에 DataSource 설정 -->
    <Resource name="jdbc/studydb" auth="Container" type="javax.sql.DataSource"
    maxActive="10" maxWait="10000" username="study" password="study" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost/studydb" classMethod="close"/>
</Context>

<Context> 태그 안에 <Resource> 태그를 추가한다. 다음 표는 <Resource> 태그의 속성에 대한 설명이다.

속성명 설명
name JNDI 이름. Context의 lookup() 메서드를 사용하여 자원을 찾을 때 사용한다. java:comp/env 디렉터리에서 찾을 수 있다.
auth 자원 관리의 주체를 지정한다. 설정 기능한 값으로 Application 또는 Container가 가능하다.
type 자원의 타입을 지정한다. 패키지 이름을 포함한 클래스 이름(fully-qualified Java class name)이어야 한다.
driverClassName JDBC 드라이버 클래스의 이름. 패키지 이름을 포함해야 한다.
url 데이터베이스 커넥션 URL.
username 데이터베이스 사용자 이름.
password 데이터베이스 사용자의 암호.
maxActive DataSource로부터 꺼낼 수 있는 커넥션의 최대 개수. 기본값 8개.
maxIdle DataSource에서 유지할 수 있는 사용되지 않는 커넥션의 최대 개수. 최대 유지 개수를 넘어서 반납되는 커넥션은 닫아 버린다. 기본값 8개.
maxWait 발급한 커넥션의 수가 최댓값에 도달한 상태에서 또다시 커넥션을 달라는 요청이 들어 왔을 때, 커넥션을 준비하기 위해 기다리는 최대 밀리초. 최대 밀리초가 지날 때까지 반납되는 커넥션이 없으면 예외를 던진다. 기본값은 -1. 즉, 커넥션을 반납할 때까지 기다린다.
closeMethod 톰캣 서버가 종료될 때, 자원을 해제하기 위해 호출하는 메서드의 이름이다. 단 매개변수가 없는 메서드여야 한다. 톰캣 서버는 내부적으로 DataSource를 생성할 때 아파치 DBCP의 BasicDataSource 구현체를 사용한다. BasicDataSource의 자원 해제 메서드는 close() 메서드이기 때문에, 이 속성의 값으로 close를 지정하면 된다.

 

- 웹 애플리케이션에서 톰캣 서버의 자원 사용

톰캣 서버에 설정한 DataSource를 웹 애플리케이션에서 사용하려면 DD 파일(web.xml)에 서버 자원을 참조한다는 선언을 해 주어야 한다. 웹 애플리케이션의 DD 파일을 열고 다음과 같이 편집한다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xmlns="http://xmlns.jcp.org/xml/ns/javaee"
		 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
		 id="WebApp_ID"
		 version="3.1">
  <display-name>web05</display-name>
  <!-- 웹 애플리케이션에서 톰캣 서버의 자원 사용 -->
  <resource-ref>
  	<res-ref-name>jdbc/studydb</res-ref-name>
  	<res-type>javax.sql.DataSource</res-type>
  	<res-auth>Container</res-auth>
  </resource-ref>
  
	<!-- 컨텍스트 초기화 파라미터 -->
	<context-param>
		<param-name>driver</param-name>
		<param-value>com.mysql.jdbc.Driver</param-value>
	</context-param>
	<context-param>
		<param-name>url</param-name>
		<param-value>jdbc:mysql://localhost/studydb</param-value>
	</context-param>
	<context-param>
		<param-name>username</param-name>
		<param-value>study</param-value>
	</context-param>
	<context-param>
		<param-name>password</param-name>
		<param-value>study</param-value>
	</context-param>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
</web-app>

<web-app> 태그 안에 <resource-ref> 태그를 작성한다. 문법은 다음과 같다.

<resource-ref>
    <res-ref-name>JNDI 이름</res-ref-name>
    <res-type>리턴될 자원의 클래스 이름(패키지명 포함)</res-type>
    <res-auth>자원 관리의 주체</res-auth>
</resource-ref>

<res-ref-name> 태그의 값은 context.xml에 선언한 자원의 이름이다. <res-type> 태그의 값은 톰캣 서버에서 리턴하는 자원의 타입이다. context.xml에 선언한 자원의 타입과 같아야 한다. 마지막으로 <res-auth> 태그의 값은 톰캣 서버가 리턴하는 자원의 관리 주체이다. 'Container'는 서버에서 관리한다는 의미이다.

 

※ JNDI란 무엇인가?

JNDI는 Java Naming and Directory Interface API의 머리글자이다. 디렉터리 서비스에 접근하는데 필요한 API이며 애플리케이션은 이 API를 사용하여 서버의 자원을 찾을 수 있다. 자원이라함은 데이터베이스 서버나 메시징 시스템과 같이 다른 시스템과의 연결을 제공하는 객체이다. 특히 JDBC 자원을 데이터 소스라고 부른다.

자원을 서버에 등록할 때는 고유한 JNDI 이름을 붙인다. JNDI 이름은 사용자에게 친숙한 디렉터리 경로 형태를 가진다. 예를 들어, JDBC 자원에 대한 JNDI 이름은 'jdbc/mydb'의 형식으로 짓는다. 다음은 Java EE 애플리케이션 서버에서 자원을 찾을 때 기본 JNDI 이름이다.

java:comp/env 응용 프로그램 환경 항목
java:comp/env/jdbc JDBC 데이터 소스
java:comp/ejb EJB 컴포넌트
java:comp/UserTransaction UserTransaction 객체
java:comp/env/mail JavaMail 연결 객체
java:comp/env/url URL 정보
java:comp/env/jms JMS 연결 객체

따라서 'jdbc/mydb'라는 데이터 소스가 있어, 서버에서 이 자원을 찾으려면 'java:comp/env/jdbc/mydb' JNDI 이름으로 찾아야 한다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

댓글