DBCP는 (Database Connection Pool) 의 약자로 웹서버에서 데이터베이스에 연결하기 위한. 라이브러리다.
아니 그럼 데이터베이스 있는데 왜 DBCP를 따로 쓰려고 함 ???
라고 생각 할 수도 있는데, 간단하게 예시(1)를 들어보자.
나는 JDBC 쓸 때 나는 ojdbc8-21.3.0.0.jar ()를 썼다.
Tomcat으로 웹서버를 구동해보면 3-4명이서 F5 (새로고침)을 인정과 자비없이 눌러대면 얼마 못가서
서버는 주식을 한 내 계좌처럼 금새 터지고 만다....뚀륵....
터지는 이유는 물론 우리가 사용할 수 있는 자원은 한정되어 있는데, 무한 새로고침으로 서버에게 다른일을 할 시간을 주지않고 ' 그 페이지나 가져와 !' 를 한다면 서버는 기계이기 때문에 시킨일을 열심히 하고 ,
열심히 하는것에 비해 일이 줄지 않고 오히려 밀려서 몸살이 나버리는 것이라고 생각한다.
이런 현상을 방지하기 위해서 DBCP를 사용한다.
DBCP는 뭐 어떻게 돌아가는건뎁?
예시(2) 대출을 받아서 햄버거 가게를 차린 햄버거 사장 김모씨가 있다.
김모씨는 가게 오픈 할 때 알바생을 몇명이나 고용할지 고민이다.
김모씨는 가게에 손님이 언제 몇명이나 올지 모른다.
알바생을 과하게 썼다가 매출보다 인건비가 더 나갈수도 있고, 너무 적게 뽑자니 손님이 몰리면 기다리지 못하고
손님들이 다른 가게에 갈까 걱정이 된다.
김모씨는 키오스크를 놓으면 손님이 스스로 주문을 하고, 앞사람이 주문하면 다음 사람이 차례로 주문할 수 있다는 점을 깨닫는다.
하지만 키오스크를 너무 많이 놓아도 초기 비용이 너무 많이 들기 때문에
키오스크를 어느정도 놓고 손님 반응 보고 몇대나 더 놓을지 , 뺄지를 생각해보려 한다.
예시가 맞는지는 잘 모르겠지만 ,
DBCP는 데이터베이스(DB)에 하나의 구역(P)을 만들고 Connection(C) 을 두고 관리하는 것이다 .
- 사용자가 DB에 접속을 할 때 Pool에서 연결 객체를 슉하고 빌려준다.
- 기본적으로 사용할 수 있는 유휴(Idle)연결의 최소유휴(minIdle) 와 최대유휴 (maxIdle) 갯수를 정해 예시(2)의 키오스크처럼 연결의 수를 몇대나 놓을지 정한다.
- 유휴연결의 수가 없다면 대기시간 (maxWaitMillis) 를 설정해 연결이 사용중일 때 대기 시간을 설정할 수 있다.
쉽게 정리하자면
- 사용자가 서버에 들어와서 DB 작업을 하는 일을 하면 DBCP가 Pool에서 연결을 빌려준다.
- DB에서의 작업이 끝나면 연결은 Pool로 반환된다
라고 할 수 있다.
그래서 마지막으로 어떻게 쓰는건뎁?
이클립스에서 서버는 톰캣은 기본적으로 Servers에서 관리된다.
여기서 server.xml이란 곳을 들어가보자. server.xml은 서버가 처음에 구동될 때 어떻게 시작되어야 하는건가에 대한 설정이 되어있는 곳인데 쭉 내려가보면 Context라는게 보인다.
Context는 실제로 우리가 서버에서 돌아가는 어플리케이션의 경로나 자원 등의 정보를 가진다.
톰캣에다가 추가한 프로젝트에 대한 설정이 있다. 저거 지우면 서버에서도 실행이 안 됨.
원래는 Servers에 톰캣에서 프로젝트에 대한 설정을 하면 되겠지만, 그럼 톰캣에서 프로젝트 뺄 때마다. 다시 설정해야되니까 얼마나 귀찮을지 상상이 안된다.
그래서 설정을 보통 프로젝트에서 한다.
어디다 하냐면 META-INF에서 context.xml을 만들면 된다.
META-INF는 말 그대로 Meta의 INF (정보 : Information) 를 담당하는 구역이다.
Meta-INF = 컨텐츠를 대표하는 것의 정보
Manifest 운영체제에서 실행될 때 알아야 하는 권한.
context.xml을 만들고
이렇게 위의 server.xml에서 쓰는 Context를 재정의 한다고 생각하면 된다.
Context안에는 쓰일 자원(Resource)에 대한 정보를 기술하면 된다.
DBCP에서
- name : DBCP 의 이름
- type : 최상위 클래스인 javax.sql.DataSource를 사용.
- auth : 권한 . Container의 전체에서 쓰겠다라고 써놓은 것. Application이라고도 적어도 됨.
- driverClassName : ojdbc와 동인. 오라클 드라이버의 클래스 이름
- url : dbms에 연결하기 위한 경로 .
- jdbc:oracle:thin - 드라이버의 종류 ,
- localhost - db의 위치
- 1521 : dbms의 접속 포트
- xe 또는 orcl : 서비스의 종류
- maxTotal : 총 연결(Connection)의 숫자
- minIdle : 유휴 연결의 최소 갯수.
- maxIdle : 유휴 연결의 최대 갯수.
- maxWaitMillis : 연결이 꽉 차있을 때 대기시간. -1은 대기 무한대
이렇게 설정 완료하면 서버에 알려주는 것 까지는 끝난다.
그럼 실질적으로 데이터베이스와 연결 할 수 있는 모듈을 작성해보자.
설명위주라 좀 지루할 수 있음.
DataSource는 context.xml 에서의 Resource의 타입(자료형)을 가져온다.
InitialCountext() 는 쉽게 말해서 이름으로 컨텍스트를 찾는 것이다.
웹이 실행될 때 처음으로 InitialContext 실행이 되고 java:comp/env/ 는 컨텍스트의 자원이 위치하는 공간인데
context.xml에서의 적은 name인 "/jdbc/oracle"을 지정해 줌으로써. 우리가 만든 DBCP에 대한 정보를 찾을 수 있게 되는 것 이다.
저렇게 써주고 , 저 클래스를 부르면 끝난다!
틀린 부분이 있다면 지적 부탁드립니다~