JSP&Servlet

Java에서 DBCP의 개념과 쓰는 법

비뀨_ 2021. 10. 30. 18:24
더보기

DBCP는 (Database Connection Pool) 의 약자로 웹서버에서 데이터베이스에 연결하기 위한. 라이브러리다.

 

 

아니 그럼 데이터베이스 있는데 왜 DBCP를 따로 쓰려고 함 ???

라고 생각 할 수도 있는데, 간단하게 예시(1)를 들어보자.

더보기

나는 JDBC 쓸 때 나는  ojdbc8-21.3.0.0.jar ()를 썼다.

Tomcat으로 웹서버를 구동해보면  3-4명이서 F5 (새로고침)을 인정과 자비없이 눌러대면 얼마 못가서

서버는 주식을 한 내 계좌처럼 금새 터지고 만다....뚀륵....

 

터지는 이유는 물론 우리가 사용할 수 있는 자원은 한정되어 있는데, 무한 새로고침으로 서버에게 다른일을 할 시간을 주지않고 ' 그 페이지나 가져와 !' 를 한다면 서버는 기계이기 때문에 시킨일을 열심히 하고 ,

열심히 하는것에 비해 일이 줄지 않고 오히려 밀려서 몸살이 나버리는 것이라고 생각한다. 

 

이런 현상을 방지하기 위해서 DBCP를 사용한다.

DBCP는 뭐 어떻게 돌아가는건뎁?

Pool의 연결 객체를 그려봤지만 풋사과상자가 됨.

더보기

예시(2)  대출을 받아서 햄버거 가게를 차린 햄버거 사장 김모씨가 있다. 

김모씨는 가게 오픈 할 때 알바생을 몇명이나 고용할지 고민이다.

김모씨는 가게에 손님이 언제 몇명이나 올지 모른다.

알바생을 과하게 썼다가 매출보다 인건비가 더 나갈수도 있고, 너무 적게 뽑자니 손님이 몰리면 기다리지 못하고 

손님들이 다른 가게에 갈까 걱정이 된다.

 

김모씨는 키오스크를 놓으면 손님이 스스로 주문을 하고, 앞사람이 주문하면 다음 사람이 차례로 주문할 수 있다는 점을 깨닫는다. 

하지만 키오스크를 너무 많이 놓아도 초기 비용이 너무 많이 들기 때문에

키오스크를 어느정도 놓고 손님 반응 보고 몇대나 더 놓을지 , 뺄지를 생각해보려 한다.

 

예시가 맞는지는 잘 모르겠지만 ,

DBCP는  데이터베이스(DB)에 하나의 구역(P)을 만들고 Connection(C) 을 두고 관리하는 것이다 .

  • 사용자가 DB에 접속을 할 때 Pool에서 연결 객체를 슉하고 빌려준다. 
  • 기본적으로 사용할 수 있는 유휴(Idle)연결의 최소유휴(minIdle) 와 최대유휴 (maxIdle) 갯수를 정해 예시(2)의 키오스크처럼 연결의 수를 몇대나 놓을지 정한다. 
  • 유휴연결의 수가 없다면 대기시간 (maxWaitMillis) 를 설정해 연결이 사용중일 때 대기 시간을 설정할 수 있다. 
더보기

쉽게 정리하자면  

  1. 사용자가 서버에 들어와서 DB 작업을 하는 일을 하면 DBCP가 Pool에서 연결을 빌려준다.
  2.  DB에서의 작업이 끝나면 연결은 Pool로 반환된다

라고 할 수 있다.

 

그래서 마지막으로 어떻게 쓰는건뎁?

이클립스에서 서버는 톰캣은 기본적으로 Servers에서 관리된다. 

톰캣의 구성요소는 나중에 공부해서 올릴 예정.

 

아래 server.xml 이미지를 Servers탭에서 톰캣 더블클릭하면 나오는 창. 똑같다.

여기서 server.xml이란 곳을 들어가보자. server.xml은 서버가 처음에 구동될 때 어떻게 시작되어야 하는건가에 대한 설정이 되어있는 곳인데 쭉 내려가보면 Context라는게 보인다.

server.xml의 맨 아래

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에 연결하기 위한 경로 .
    1. jdbc:oracle:thin - 드라이버의 종류 , 
    2. localhost - db의 위치
    3. 1521 : dbms의 접속 포트 
    4.  xe 또는 orcl : 서비스의 종류
  • maxTotal : 총 연결(Connection)의 숫자
  • minIdle :  유휴 연결의 최소 갯수.
  • maxIdle : 유휴 연결의 최대 갯수. 
  • maxWaitMillis : 연결이 꽉 차있을 때 대기시간.  -1은 대기 무한대

이렇게 설정 완료하면 서버에 알려주는 것 까지는 끝난다.

그럼 실질적으로 데이터베이스와 연결 할 수 있는 모듈을 작성해보자.

설명위주라 좀 지루할 수 있음.

더보기
DBCP를 위한 클래스

DataSource는 context.xml 에서의 Resource의 타입(자료형)을 가져온다.

InitialCountext() 는 쉽게 말해서 이름으로 컨텍스트를 찾는 것이다.

웹이 실행될 때 처음으로 InitialContext 실행이 되고 java:comp/env/ 는 컨텍스트의 자원이 위치하는 공간인데

context.xml에서의 적은 name인 "/jdbc/oracle"을 지정해 줌으로써. 우리가 만든 DBCP에 대한 정보를 찾을 수 있게 되는 것 이다. 

저렇게 써주고 , 저 클래스를 부르면 끝난다!

 

틀린 부분이 있다면 지적 부탁드립니다~