3. Tomcat 서버의 DataSource 사용하기 - wonjune/DatasourceServlet GitHub Wiki
###1. 톰캣서버 설정
- context.xml 파일에 아래부분을 추가한다.
<Resource name="jdbc/studydb" auth="Container" type="javax.sql.DataSource"
maxActive="10" maxIdle="3" maxWait="10000" username="study"
password="study" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/studydb" closeMethod="close" />
###2. Resource 태그의 속성들
- name : JNDI 이름. Context의 lookup()을 사용하여 자원을 찾을 때 사용. java:comp/env 디렉토리에서 찾을수 있음
- auth : 자원관리의 주체. Application 또는 Container가 가능
- type : 자원의 타입. 패키지 이름을 포함한 클래스 이름(fully-qualified java class name)
- driverClassName : JDBC 드라이버 클래스의 이름. 패키지 이름 포함
- url : DB 커넥션 URL
- username : DB 사용자 이름
- password : DB 사용자 암호
- maxActive : DataSource로 부터 꺼낼 수 있는 커넥션의 최대 개수. 기본값은 8개
- maxIdle : DataSource에서 유지될 수 있는 사용하지 않는 커넥션의 최대 개수. 최대 개수 초과시 반납되는 커넥션은 닫음. 기본값은 8개
- maxWait : 발급한 커넥션 갯수가 최대값에 도달한 상태에서 다시 커넥션을 요청할 경우 커넥션을 준비하기 위해 기다리는 최대 밀리초. 최대 밀리초가 넘었는데도 반납되는 커넥션이 없으면 예외를 던진다. 기본값은 -1로서 커넥션 반납시까지 무제한 대기
- closeMethod : 톰캣 서버가 종료될 때, 자원 해제를 위해서 호출하는 메서드. 매개변수가 없어야 함.
###3. 웹어플리케이션 설정
- web.xml 파일에 아래와 부분을 추가한다.
<resource-ref>
<res-ref-name>jdbc/studydb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
-
<res-ref-name>
은 context.xml 에 선언한 자원의 이름(JNDI 이름) -
<res-type>
은 톰캣 서버에서 리턴하는 자원의 타입. context.xml 에 선언한 자원의 타입과 동일 -
<res-auth>
은 톰캣 서버가 리턴하는 자원의 관리 주체
####별첨. JNDI(Java Naming and Directory Interface API)
- 디렉토리 서비스에 접근하는데 필요한 API
- 어플리케이션은 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 연결 객체
###3. DAO 설정
- DAO 에서 DataSource 가져오는 부분을 아래와 같이 수정한다.
ServletContext sc = event.getServletContext();
InitialContext initialContext = new InitialContext();
DataSource ds = (DataSource)initialContext.lookup("java:comp/env/jdbc/studydb");
MemberDao dao = new MemberDao();
dao.setDataSource(ds);
- InitialContext 의 lookup() 메서드를 이용하면 JNDI 이름으로 등록된 서버 자원을 찾을 수 있다
- context.xml 파일에서
closeMethod="close"
속성을 지정해 놓았으므로 별도로 커넥션을 닫는close()
메서드는 호출할 필요가 없다.