Spring으로 방명록 애플리케이션을 구현하는 시리즈입니다.





커넥션 풀

지금까지 작성한 DAO를 보면 매 번 DB에 접근하기 위해서 연결을 한 후 데이터를 가져오고 연결을 종료합니다.

그런데 커넥션을 생성하고 제거하는 과정은 비용이 많이 드는 작업입니다.


그래서 미리 커넥션을 생성해놓고 DAO가 연결을 필요로 할 때 빌려주고, 사용이 끝나면 반납 받는 방식으로 커넥션을 관리하면 성능을 높일 수 있습니다.

이를 커넥션 풀이라고 하는데, 커넥션 풀에 대한 자세한 내용은 여기를 참고해주세요 !


스프링에서는 각 벤더사 마다 커넥션 풀을 사용할 수 있도록 라이브러리를 제공합니다.

MySQL은 Common DBCP를 사용하는데, 저는 MySQL을 기준으로 말씀드리도록 하겠습니다.





설정

pom.xml

스프링에서 커넥션 풀을 사용할 수 있도록 라이브러리 추가합니다.

<!-- spring jdbc -->

<dependency>

       <groupId>org.springframework</groupId>

        <artifactId>spring-jdbc</artifactId>

        <version>${org.springframework-version}</version>

</dependency>


<!-- Common DBCP -->

<dependency>

        <groupId>commons-dbcp</groupId>

        <artifactId>commons-dbcp</artifactId>

        <version>1.4</version>

</dependency>



DAO가 커넥션을 사용하기 때문에 커넥션 풀은 Root Application Context 컨테이너에서 설정해야 합니다.

applicationContext.xml

<!-- Connection Pool DataSource -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">

        <property name="driverClassName" value="com.mysql.jdbc.Driver" />

        <property name="url" value="jdbc:mysql://localhost:3306/webdb" />

        <property name="username" value="webdb" />

        <property name="password" value="webdb" />

</bean>

어노테이션을 사용하지 않기 때문에 bean 객체를 직접 생성합니다.

url , username, password를 프로퍼티로 작성하면 DB에 연결되어 미리 Connection 객체를 생성합니다.

그러면 DAO에서 커넥션을 필요로 할 때 마다 커넥션 풀에서 Connection을 빌려줍니다.





DAO 수정

위의 설정 파일 코드는 JSP/Servlet 그리고 스프링에서 지금까지 쭉 사용해오던 DAO 객체의 getConnection() 메서드와 같습니다.



설정을 마치면 getConnection() 메서드는 필요가 없게 됩니다.

연결을 DAO에서 직접 할 필요 없이 커넥션 풀에서 관리해주기 때문이죠.

즉, DAO 객체는 다음과 같이 수정할 수 있습니다.



applicationContext.xml 에서 DataSource라는 이름으로 bean을 생성했으므로 의존성 주입이 가능합니다.

( DataSource의 import는 import javax.sql.DataSource; 입니다. )


DataSource 객체는 커넥션을 미리 생성해 놓고 있는 상태입니다.

그래서 service 계층에서 GuestBookDAO.getList() 메서드가 호출되었을 때, 즉 DB에 접근해야 경우에 Connection 객체를 빌려줍니다.

그리고 나서 Connection을 다시 반환 받고 대기 상태가 되죠.


이제 DAO 객체의 메서드 마다 dataSource.getConnection(); 메서드를 호출해서 Connection을 얻을 수 있습니다.




이상으로 스프링에서 MySQL 커넥션 풀을 사용하는 방법을 알아보았습니다.

커넥션 풀을 사용하면 또 좋은 점이 있습니다.

DB연결에 관련된 설정을 DAO에 하지 않고 설정 파일로 빼놓은 것이죠.

설정 관련 코드는 DAO에 작성하는 것보다 설정 파일로 따로 분리해서 정리하는 것이 좋습니다.