Spring으로 방명록 애플리케이션을 구현하는 시리즈입니다.
- [Spring] 방명록 애플리케이션 (1) - 환경 설정
- [Spring] 방명록 애플리케이션 (2) - 준비 단계 ( 스프링 활용하기 )
- [Spring] 방명록 애플리케이션 (3) - 구현
- [Spring] 방명록 애플리케이션 (4) - 정적 파일 처리 ( DefaultServletHandler )
- [Spring] 방명록 애플리케이션 (5) - 뷰 객체 생성 ( ViewResolver )
- [Spring] 방명록 애플리케이션 (6) - 예외 처리 ( ExceptionHandler )
- [Spring] 방명록 애플리케이션 (7) - 3 Layer Architecture와 Service 계층
- [Spring] 방명록 애플리케이션 (8) - 커넥션 풀 ( Connection Pool ) DBCP
- [Spring] 방명록 애플리케이션 (9) - Mybatis 환경 설정
- [Spring] 방명록 애플리케이션 (10) - Mybatis 적용
커넥션 풀
지금까지 작성한 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 수정
위의 설정 파일 코드는 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에 작성하는 것보다 설정 파일로 따로 분리해서 정리하는 것이 좋습니다.