프로그래밍/JSP

알기 쉬운 JSP DBCP 셋팅 방법에 대해 알아보자

byungmin 2020. 7. 28. 10:55

커넥션 풀을 사용하는 이유

DBCP는 직접 DB에 연결하는 것이 아니라,

WAS(Weblogic나 제우스, 톰켓등을 말합니다)가 자동으로 DB에 연결을 하고 사용자는 WAS가 연결한 커넥션을 이용하는 방법이다.

즉, WAS가 실행 되면서 동시에 오라클에 커넥션 객체를 미리 생성하고 우리는 그 객체를 그냥 가져다 쓰면 된다.
WAS의 설정파일에 아이디, 비밀번호, DataSource의 정보를 작성해놓으면 WAS가 알아서 접속한다.

 

1. WAS에 정보를 셋팅하는 방법

1) Tomcat8.5/conf/server.xml의

<GlobalNamingResources> 태그 사이에 셋팅 해준다.

<GlobalNamingResources>
	<!-- Editable user database that can also be used by UserDatabaseRealm 
			to authenticate users -->
           
        <!-- My DBCP Setting ========================= -->
	<Resource auth="Container"
		driverClassName="oracle.jdbc.driver.OracleDriver" maxIdle="10"
		maxTotal="20" maxWaitMillis="-1" name="jdbc/myshop" password="tiger"
		type="javax.sql.DataSource" url="jdbc:oracle:thin:@127.0.0.1:1521:XE"
		username="myshop" />
	<!-- ========================================= -->
</GlobalNamingResources>

하나씩 살펴보자.

 

우리는 오라클을 사용하기 때문에

driverClassName="oracle.jdbc.driver.OracleDriver" 사용을 주의하자.

 

maxIdle="10" 은 평상시에 커넥션 풀 객체를 10개 사용한다는 뜻이고

maxTotal="20" 은 최대 20개까지 객체를 만들겠다는 소리다.

오라클에서 사용하는 아이디와 비밀번호는

username과 password에 작성하면 된다.

 

type이 가장 중요하다. 우리는 DataSource를 통해 객체에 이름을 등록해서 사용할 수 있다.

name="jdbc/myshop"은 커넥션풀의 이름을 정해주는 것으로 유일한 이름이어야 한다.

 

 

2) Tomcat8.5/conf/context.xml의

<Context> 태그 안에 

<!-- MyDBCP Setting =================================== -->
	<ResourceLink global="jdbc/myshop" name="jdbc/myshop" type="org.apache.tomcat.dbcp.dbcp2.BasicDataSource"/>
<!-- ================================================== -->

global="jdbc/myshop", name 은 server.xml에서 설정했던 name과 동일한 이름으로 지정한다.

 

3) XXproject/WEB-INF/web.xml의

<web-app> 태그사이에 아래 부분 세팅

<web-app>
	<!-- My DBCP Setting ================================== -->
  	<resource-ref>
 		<description>Oracle Datasource example</description>
 		<res-ref-name>jdbc/myshop</res-ref-name>
 		<res-type>javax.sql.DataSource</res-type>
 		<res-auth>Container</res-auth>
  	</resource-ref>
 	<!-- ================================================== -->
</web-app>

셋팅 완료

2. 셋팅한 커넥션풀을 자바소스로 불러오는 방법

Context initContext = new InitialContext(); 
// Initialcontext 생성 -> 이름으로 객체 찾을 수 있도록 도와준다.
Context envContext  = (Context)initContext.lookup("java:/comp/env"); 
// 톰캣(서버)을 먼저 찾는다.
// 톰캣을 찾을 때는 java:comp/env 로 찾는다.

DataSource ds = (DataSource)envContext.lookup("jdbc/myshop"); 
// server.xml에 등록했던 이름 myshop을 찾는다.(타입은 DataSource 타입)

Connection conn = ds.getConnection();

System.out.println("<h1>데이터 소스 룩업 성공: "+ds +"</h1>");
System.out.println("<h2> con="+ conn + "</h2>");
	
if(conn!=null) conn.close();
// 커넥션 연결을 끊는 것이 아니라 커넥션풀에 자동으로 반납을 한다.

1. InitialContext 객체를 생성해서 이름으로 찾을 수 있도록 도와준다.

2. lookUp 메소드를 통해 WAS서버를 찾자. (우리는 톰캣) --> java:comp/env 톰캣 찾을 때 사용하는 프로토콜

 

3. 우리가 등록한 DataSource를 찾자. - resource name으로 룩업한다. 
   ==> JNDI(Java Naming Directory Interface)
   객체들을 이름으로 등록해서 이름으로 찾는 방식

 

4. ds.getConnection() 메소드를 사용하여 커넥션풀에 연결한다.

dbcpTest.jsp 파일을 만들어서 연결이 잘 됐는지 확인해보자.

javax.naming.* , java.sql.* , javax.sql.* 를 임포트 해준다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="javax.naming.*, java.sql.*, javax.sql.*"%>

<%
Context initContext = new InitialContext(); // Initialcontext 생성 -> 이름으로 객체 찾을 수 있도록 도와줌
Context envContext  = (Context)initContext.lookup("java:/comp/env"); // 톰캣(서버)을 먼저 찾는다.
// 톰캣을 찾을 때는 java:comp/env 로 찾는다.
DataSource ds = (DataSource)envContext.lookup("jdbc/myshop"); // server.xml에 등록했던 이름 myshop을 찾는다.(타입은 DataSource 타입)
Connection conn = ds.getConnection();
//etc.

out.println("<h1>데이터 소스 룩업 성공: "+ds +"</h1>");
out.println("<h2> con="+ conn + "</h2>");

if(conn!=null) conn.close();
// 커넥션 여결을 끊는 것이 아니라 커넥션풀에 자동으로 반납을 한다.
%>

위와 같이 뜨면 연결 성공

 

* JNDI란?

1. Java Naming and Directory Interface의 약자
2. 명명 및 디렉토리 서비스에 접근하기 위한 API
3. 많은 기능이 있지만 우리는 등록(bind, rebind)하고, 찾아쓰는(lookup) 방법만 알면 된다.
4. 서버에 JNDI Driver(service provider라고 부름)만 있으면 명명/디렉토리 서비스를 이용할 수 있다.
5. jndi 드라이버는 우리가 호출한 이름을 Naming 서비스에서 이해할 수 있는 것으로 바꿔주는 역할을 한다.