Java에서 DB를 연결하는 2가지 방법과 DBCP를 사용하는 이유

1) JDBC를 사용하는 방법

오라클이던, MySQL이던 각 DB에서 제공하는 DB Connection API를 이용해서 DB에 접속하는 방법이다.

사용자가 직접 소스코드에 ID와 PassWord, IP 등을 입력하여 커넥션 객체를 생성하고 그 객체를 이용해서 DB를 제어하는 방법이다.

 

2) Connection Pool( DBCP : DataBaseConnectionPool )을 사용하는 방법

  사용자(프로그래머)가 소스에서 직접 DB에 연결하는 것이 아니라, 연결은 WAS(톰켓,제우스 같은)가 하고 사용자는 WAS가 연결한 커넥션을 이용하는 방법이다. 

 

웹 컨테이너(WAS)가 실행되면서 DB와 미리 connection을 해놓은 객체들을 pool에 저장해두었다가

클라이언트 요청이 오면 connection을 빌려주고, 처리가 끝나면 다시 connection을 받납받아서 pool에 저장하는 방식이다.

 

- WAS가 실행되면서 connection 객체를 미리 pool에 생성해 두기 때문에 connection을 생성하는데 드는 요청마다 연결시간이 소비되지 않는다는 장점이 있다.

 

- 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수를 제한적으로 설정한다.

 

 

#커넥션 풀(DBCP)를 사용하는 이유

JSP에 대해서 공부했거나 프로젝트를 해봤던 사람이라면 다음과 같은 소스를 본적 있을 것이다.

package java_arguments.JDBC_test;
import java.sql.*;

public class DB_Connection {

    static final String DRIVER =  "org.mariadb.jdbc.Driver";
    static final String URL = "jdbc:mariadb://localhost:3306/test_db";
    static final String USER = "root";
    static final String PASSWORD = "testdb";

    Connection con;
    PreparedStatement pstmt;
    ResultSet rs;

    public DB_Connection(){
        try{
            Class.forName(DRIVER);
            con = DriverManager.getConnection(URL, USER, PASSWORD);
            if( con!= null){
                System.out.println("DB 접속에 성공했습니다.");
            }

        } catch (ClassNotFoundException e){
            System.out.println("드라이버 로드 실패");
        } catch (SQLException e){
            System.out.println("DB 접속실패");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        DB_Connection new_db = new DB_Connection();
    }
}

위와 같이 자바에서 DB에 직접 연결해서 처리하는 경우 JDBC 드라이버를 로드한 이후

커넥션 객체를 받아와야 한다. 

 

하지만 이렇게 직접 연결해버릴 경우 매번 사용자가 요청할 때 마다 드라이버를 로드하고 커넥션 객체를 생성하여 

연결하고 종료하기 때문에 매우 비효율적이다.

 

이러한 문제를 해결하기 위해서 커넥션풀(DBCP)를 사용한다.

 

#동시 접속자가 많을 경우

 Connection Pool 설명에 따르면 동시 접속 할 경우 pool에서 미리 생성된 conenction을 제공하고 없을 경우에는 

connection이 반환될 때까지 번호순대로 대기 상태로 기다린다.

 

또한 WAS에서 커넥션 풀을 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 대기시간 없이 사용할 수 있지만 반대로 커넥션 풀을 적게 설정하면 그만큼 대기시간이 길어질 수 있다.