JDBC (2), DBCP의 등장

김종하·2020년 10월 20일
1

DiveIntoJAVA

목록 보기
6/11

JDBC로 작업해보기

DB와 connection을 맺는 방법도 알았으니, 이제 자바 프로그램으로 데이터베이스를 조작해 볼 시간이다.
간단하게, DB의 데이터를 select 해서 가져와보고 insert 해서 DB에 데이터를 넣어보는 작업을 해보자.

import java.sql.*;

public class JDBCTest {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost/mydata?serverTimezone=UTC";
        String id = "root";
        String pw = "1234";

        
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


// select 쿼리로 데이터 가져오기
        String sql1 = "select * FROM user";
        try(
            Connection conn = DriverManager.getConnection(url, id, pw);
            PreparedStatement pstmt = conn.prepareStatement(sql1);
            ResultSet rs = pstmt.executeQuery()
        ) {
            while (rs.next()){
                String user_id = rs.getString("user_id");
                String user_name = rs.getString("user_name");
                System.out.println("user_id : " + user_id + " user_name : " + user_name);
            }
        } catch (SQLException sqle){
            sqle.printStackTrace();
        }


// insert 쿼리로 데이터 넣기
        String sql2 = "Insert into user(user_id, user_name) values(?,?)";
        try(
            Connection conn= DriverManager.getConnection(url, id, pw);
            PreparedStatement pstmt = conn.prepareStatement(sql2);
        ) {
            pstmt.setString(1, "test2");
            pstmt.setString(2,"jongha");
            int check = pstmt.executeUpdate();
            System.out.println(check);

        } catch (SQLException sqle){
            sqle.printStackTrace();
        }
    }
}

이런식으로, DB의 데이터를 조회하고 입력하고 또 수정과 삭제를 예제로 코딩하진 않았지만 CRUD 가 모두 가능 하다.

그런데 여기에 아무런 문제가 없을까??
우선, 작성한 코드는 다음과 같은 순서로 동작하게 될 것이다.(select 기준)

1 - DB 접속을 위해 JDBC 드라이버를 로드하고

Class.forName("com.mysql.cj.jdbc.Driver");

2 - DB 접속 정보와 DriverManger.getConnection() 을 통해 Connection 객체를 얻어오게 된다.

DriverManager.getConnection(url, id, pw);

3 - Connection 객체로 부터 PreparedStatement 객체를 받아온다

PreparedStatement pstmt = conn.prepareStatement(sql1);

4 - ExecuteQuery 를 수행해 조회한 데이터를 ResultSet 객체에 담는다

ResultSet rs = pstmt.executeQuery()

그렇다면 JDBC의 문제는?

여기서 문제는, 쿼리를 날릴 때 마다 DB 서버에 접속해 Connection을 맺는 작업을 수행해야 한다는 것이다.
웹 어플리케이션의 경우로 생각해보면 대부분의 Request 에 대한 Response를 만드는 과정에서 DB 작업을 거치는 경우가 많다.
예를들어, 로그인을 한다고 생각하면 아이디와 패스워드를 입력해 Request 를 보낼 것이고 WAS 에서는 DB의 회원정보테이블에서 해당 아이디와 패스워드를 조회해 아이디는 있는지, 입력한 아이디와 비밀번호가 일치하는지 등의 비지니스 로직을 수행한 후 로그인 완료 혹은 실패라는 Response 를 날릴 것이다.
그런데 서버에는 수 많은 요청이 올 수 있고 그때마다 드라이버를 로딩하고 DB서버와의 커넥션을 생성하는 작업은 너무 큰 비용이 소모될 수 있다.

DBCP의 등장

이런 문제를 해결하기 위해 등장한 개념이 바로 DBCP 이다.
DBCP 는 Database Connection Pool 의 준말로 DB 커넥션들을 관리해주는 라이브러리이다. Apache 에서 Commons DBCP 를 오픈라이브러리로 제공해주고 있다. 원리는 WAS 가 실행될때 설정한 값만큼의 Connection 객체를 미리 생성해서 pool 이라는 공간에 저장해 둔다.
이제, Connection 객체가 필요할 때마다 DB서버에 접속요청을 할 필요 없이
이 pool 이라는 공간에 있는 객체를 가져와서 사용하고 반납하면 되는 것이다.

[도움을 얻은 곳]

0개의 댓글