[Spring] Connection Pool로 DB 연결하기
Connection Pool을 왜 사용하는지, 이론, 개념에 대한 블로그
[Spring] 커넥션 풀(Connection pool)이란?
커넥션 풀(Connection pool)에 대해서 그래도 알고 사용하자. 쉽게 알고 갔으면 좋겠습니다.
linked2ev.github.io
매 요청마다 드라이버를 로드해서 커넥션을 연결하는 과정이 오래걸리니,
미리 만들어두고 (pool을 만든다) 관리하는 것.
무조건 좋은 것은 아님, 사용자가 너무 많이 몰려 자원이 부족해질 수 있기 때문에 적절한 자원을 만들어 두는 것이 중요하고 또한 너무 많이 만들어 놓으면 그만큼 자원 소모가 커지기 때문에 적절히 잘 조절하는 것이 중요!
- 데이터베이스 연동을 위한 jdbc
- dataSource를 사용하기 위한 dbcp
dependency를 추가한다.
<!-- Database -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- Connection pool -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
DataSource 빈 객체를 생성한다.
웹에 관련된 객체가 아니기 때문에 root-context.xml 파일에서 만든다.
(웹에 관련된 설정, 객체 생성은 servlet-context.xml에서)
<bean id="ds" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/[스키마명]?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8"/>
<property name="username" value="[사용자이름]"/>
<property name="password" value="[비번]"/>
</bean>
DTO, DAO를 만들어주고, DB 자원 반환을 위한 DBUtil 클래스를 만들어 주었다.
package com.hyomin.memomeet.util;
import org.springframework.stereotype.Component;
@Component
public class DBUtil {
public void close(AutoCloseable... closeables) {
for (AutoCloseable c : closeables) {
if (c != null) {
try {
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
- 가변 파라미터를 받을 수 있는 메서드로
- AutoCloseable 인터페이스를 모두 구현한 클래스라는 것을 이용하여 반복문으로 close를 처리해준다.
DB connection을 위해 datasource를 사용하고 반환을 위해 dbutil을 사용한다.
아참, 클래스에서 어노테이션으로 설정한 빈 객체는 (@Component, @Service, ... 말하는 것.. )
설정 파일에서 component-scan을 통해 어노테이션을 스캔할 패키지를 지정해 주어야 한다.
component-scan은 context namespace를 추가하여 사용할 수 있는 태그이다.
<context:component-scan base-package="com.hyomin.memommet.model, com.hyomin.memomeet.util"></context:component-scan>
이렇게 패키지를 지정하여 객체가 생성되도록 한다!
UserDaoImpl.java
public class UserDaoImpl implements UserDao {
@Autowired
private DBUtil dbUtil;
@Autowired
private DataSource dataSource;
@Override
public int insert(UserDto user) throws SQLException {
int res = 0;
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = dataSource.getConnection();
String sql = "INSERT INTO USERS(user_id, pw, name, email) "
+ "VALUE (?, ?, ?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getUser_id());
pstmt.setString(2, user.getPw());
pstmt.setString(3, user.getName());
pstmt.setString(4, user.getEmail());
res = pstmt.executeUpdate();
} finally {
dbUtil.close(conn, pstmt);
}
return res;
}
}