DBCP - 커넥션풀(Connection Pool)을 이용한 DB 연동

June Lee·2021년 3월 25일
0

Database

목록 보기
18/19

이전 포스팅에서는 JDBC만을 이용해서 DB와 연동을 하는 방법을 알아봤다. 이 과정을 크게 살펴보면,

  1. JDBC 드라이버 로딩
  2. DB와 연결(Connection 객체 생성)
  3. preparedStatement 객체를 이용해서 DB에 질의

위와 같은 세 단계를 거쳤다.
그런데 JDBC만을 이용해서 DB와 연동할 경우, 2단계인 DB와 연결 단계에서 Connection 객체를 생성하는 과정이 매번 반복되기 때문에 비효율적이다. DB도 외부 리소스이기 때문에 커넥션을 계속해서 생성하는 과정에서 오버헤드가 발생하기 때문이다. 또 DBMS 입장에서도 연결을 맺고 끊는 과정이 반복되기 때문에 오버헤드가 발생한다.

그래서 등장한 방식이 바로 커넥션 풀을 이용한 DB 연동 방법이다. 커넥션 풀이란 커넥션 객체를 미리 생성해서 모아둔 곳이다. 이렇게 커넥션 객체를 미리 생성해서 넣어두면, 요청을 처리하는 쓰레드에서 커넥션을 따로 생성해주지 않고 이 풀에 있는 객체를 할당받아 사용한 뒤 반납하면 되기 때문에 효율적이다.

커넥션 풀을 생성하기 위해서는 server.xml 파일 마지막 줄 쪽 Context 태그 사이에 아래의 태그를 추가해줘야한다.

<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/oracle" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:xe" username="계정 이름" password="계정 비밀번호" />

이렇게 지정해주면 jdbc/oracle이라는 이름으로 DataSource 객체를 가지고 올 수 있다.

태그를 추가해준 후에는,

  1. DataSource 객체(Connection Pool을 관리)를 찾는다.
  2. getConnection() 메서드를 통해 DataSource 객체에서 커넥션 객체를 하나 리턴 받는다.
  3. 리턴 받은 커넥션 객체의 prepreStatement 메서드의 인자로 sql문을 넘겨줘서 질의를 준비한다.
  4. PreparedStatement 객체의 executeQuery 혹은 executeUpdate 메서드를 통해 질의를 실행한다.
  5. 질의 결과 row들을 하나의 row 당 하나의 객체에 맵핑해준다.

실행할 쿼리가 만약 create, update, delete 중 하나라면 executeUpdate()를 하고, 이 메서드는 실행 결과로 제대로 수행됐는지를 의미하는 int를 반환한다.
실행할 쿼리가 select문이라면, executeQuery()를 수행하고, 수행 결과로 ResultSet 객체를 리턴받는다. ResultSet 객체는 next()라는 메서드를 갖고 있어서, iterator와 같이 동작한다. 이를 통해 모든 row의 데이터를 얻어서 List나 Map과 같은 자료구조에 담아주면 된다.
만약 sql문을 문자열로 모두 입력할 수 없는 경우(실행 중 받아오는 값을 동적으로 넣어줘야하는 경우)에는 setString 등의 메서드를 통해 sql문에 문자열로 넣어줄 수 없었던 값을 넣어준다.

예시는 아래와 같다.

위 코드에서 보면, DataSource 객체를 찾는 데에 JNDI 방식을 이용했다.

JNDI(Java Naming and Directory Interface)
디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup)하기 위한 자바 API다.

이전 포스팅에서는 커넥션 풀을 이용하지 않았기 때문에, JNDI 방식을 사용하지 않고 아래와 같이 커넥션 객체를 찾아줬다.

그러나 JNDI 방식을 이용하면, 커넥션 풀 관련 설정을 해주기 용이하고, 데이터베이스 관련 설정이 계속해서 바뀔 수 있는 환경일 때 설정에 관련된 코드를 분리해둠으로써 이를 신경쓰지 않고 개발을 진행할 수 있다.

profile
📝 dev wiki

0개의 댓글

관련 채용 정보