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

1) JDBC를 사용하는 방법

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

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

 

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

우선 DBCP 방법이라고 해서 JDBC와 전혀 다른 것이 아닌 DBCP도 내부적으로 JDBC 드라이버를 사용하지만

추가적으로 Connection Pool 라이브러리( Commons DBCP, HikariCP 등)을 통해 커넥션을 효율적으로 관리한다.

 

 DBCP는 개발자가 소스에서 직접 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에서 커넥션 풀을 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 대기시간 없이 사용할 수 있지만 반대로 커넥션 풀을 적게 설정하면 그만큼 대기시간이 길어질 수 있다.