ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Connection Pool로 DB 연결하기
    졸업프로젝트 2021. 10. 24. 20:37

    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&amp;useUniCode=yes&amp;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;
    	}
    
    }

     

    댓글

Designed by Tistory.