-
[Spring] Connection Pool로 DB 연결하기졸업프로젝트 2021. 10. 24. 20:37
Connection Pool을 왜 사용하는지, 이론, 개념에 대한 블로그
매 요청마다 드라이버를 로드해서 커넥션을 연결하는 과정이 오래걸리니,
미리 만들어두고 (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; } }
'졸업프로젝트' 카테고리의 다른 글
[Spring] 회원가입 구현하기 (0) 2021.10.25 [Spring] Spring과 React 연동하기 (0) 2021.10.24 [Spring] 프로젝트 시작하기 (0) 2021.10.23 [Node.js] 회의 분석 성능 개선 (node.js에서 파이썬 스크립트 실행하는 다양한 방법) (0) 2021.04.10 [Node.js] child-process 이용하기 (0) 2021.04.10