본문 바로가기

TIL

<자바 Java> 커넥션풀(ConnectionPool)

- 기존 DB 연동 방법의 단점

웹 애플리케이션이 필요할 때마다 DB에 연결해야 한다면, 매 번 연결과정을 거치므로 이 경우 시간이 많이 걸릴 수 있다. 특히, 수백 명 이상이 동시에 접속하여 이용하는 규모가 큰 서비스의 경우는 더욱 이것이 단점으로서 부각된다. 따라서 이를 해결하여 빠른 속도로 DB에서 정보를 얻어와 서비스를 구동시킬 수 있는 방법으로 커넥션풀(ConnectionPool)을 이용할 수 있다.

 

 

- 커넥션풀(ConnecionPool)이란?

기존 DB 연동방식은 웹 애플리케이션이 필요할 때마다, DB의 연결을 설정해두는 방식이었다. 하지만 이렇게 매 번 연결을 설정해두고 데이터를 가져와 작업을 처리할 필요는 없다. DB를 연결해야 하는 부분은 사용자들이 서비스를 이용할 때마다 계속해서 공통적으로 이루어져야 하는 작업이므로 이 부분을 따로 떼어 미리 작업해두고, 필요할 때 가져와 빠르게 사용할 수 있는 것이다. 이것이 커넥션풀의 원리다. 즉, 커넥션풀이란 미리 DB와 연결된 상태를 유지하는 기술을 말한다. 그리고 이러한 커넥션풀은 톰캣으로부터 제공된다. 

 

 

- 커넥션풀 작동 방식

1) 톰캣 컨테이너가 실행될 때, 커넥션풀 객체를 생성한다.

2) 생성된 커넥션풀 객체는 DBMS와 연결한다.

3) 이후 DB 작업이 필요한 경우, 커넥션풀에서 제공하는 메서드를 통해 DB를 연동한다.

 

 

- 커넥션풀 설정하기

1) 톰캣이 제공하는 DBCP 라이브러리를 다운받아 lib폴더에 설치한다. ('tomcat-dbcp-버전.zip' -> 압축풀기 -> jar파일)

2) Servers의 context.xml에 커넥션풀 객체 생성 시 연결할 DB 정보를 JNDI로 설정한다.

*JNDI란? - Java Naming and Directory Interface로서, 필요한 데이터를 key와 value로 저장하여 필요할 때 key로 가져와 value를 활용하는 방법이다. 여기서 JNDI는 커넥션풀 객체를 이용하기 위한 목적으로 활용한다(DB 정보를 JNDI 형태로 저장 -> 객체 필요 시 해당 DB 정보를 JNDI의 key로 가져와 사용)

    <Resource
    name="jdbc/oracle" //JNDI 이름
    auth="Container"
    type="javax.sql.DataSource"
    driverClassName="oracle.jdbc.driver.OracleDriver" //DB연결 시 필요한 값
    url="jdbc:oracle:thin:@localhost:1521:xe" //DB연결 시 필요한 값
    username="DBMS아이디" //DB연결 시 필요한 값
    password="DBMS비밀번호" //DB연결 시 필요한 값
    maxActive="50"
    maxWait="-1"/>

3) DAO 클래스를 다음과 같이 수정한다.

Context ctx = new InitialContext();
Context envContext = (Context) ctx.lookup("java:comp/env");
dataFactory = (DataSource) envContext.lookup("jdbc/oracle");

Connection con = dataFactory.getConnection();

 

 

 

참고 : 도서 <자바 웹을 다루는 기술>