커넥션풀

jooog·2022년 6월 4일
0

스프링DB

목록 보기
1/13

📌 데이터베이스 커넥션 획득하기

데이터베이스 커넥션을 획득하는 과정을 살펴보자. DB 드라이버는 'TCP/IP' 커넥션을 Database와 맺고 ID, Password 같은 부가 정보를 DB에 전달한다.

이 과정에서 3way handshake 같은 네트워크 동작들이 발생하고 DB는 ID, Password로 내부 인증을 완료한뒤 DB 내부에 세션을 생성한다. 여기까지 완료되면 DB는 커넥션 생성이 완료되었다는 응답을 보내고 DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환하게 된다.

데이터베이스 커넥션을 획득할때는 위와 같은 과정을 거치는데 매우 복잡하다. 이렇게 커넥션을 매번 생성하면 클라이언트에서 요청이올 때 SQL을 실행하는 시간 뿐만 아니라 커넥션을 새로 만드는 시간까지 더해져서 응답 속도에 많은 영향을 미치게 된다.

📌 커넥션 풀

위의 과정에서 살펴본 것 처럼 성능 문제를 해결하기 위해 등장한 것이 커넥션 풀이다. 말그대로 커넥션을 미리 생성해둔 커넥션 풀에서 필요할 때마다 커넥션을 꺼내 쓰는 방식이다. 커넥션 풀에 들어있는 커넥션은 TCP/IP로 DB와 연결되어 있는 상태이기 때문에 요청이 오면 언제든지 SQL을 DB에 전달할 수 있다.

📌 커넥션 풀 사용방법

애플리케이션이 시작하는 시점에 이미 커넥션 풀에 필요한 만큼 커넥션을 생성해둔다. 보통 10개 정도를 생성해둔다.

이렇게 커넥션풀을 사용하면 DB드라이버를 통해 매번 새로운 커넥션을 획득하는 것이 아니라 커넥션 풀에서 필요할 때 커넥션을 가져다 쓰면 된다. 커넥션 사용이 끝나면 커넥션을 종료하는 것이 아니라 살아있는 상태 그대로 다시 커넥션 풀에 반환한다.

서버당 최대 커넥션 수를 제한할 수 있기 때문에 무한정으로 DB에 연결이 생성되는 것을 막아줄 수 있으며 실무에서 편리하게 사용할 수 있는 다양한 오픈소스도 많다. 대표적으로는 commons-dbcp2 , tomcat-jdbc pool , HikariCP 가 있으며 실무에서 주로 사용하는 것은 HikariCP다.

📌 커넥션 획득방법

자바에서는 DataSource라는 인터페이스를 제공한다. 따라서 DriverManager를 사용하거나 커넥션 풀을 사용할 때 구현체만 교체하는 방식으로 사용하면된다.

🏐 DriverManager로 커넥션 생성

@Test
    void driverManager() throws SQLException {
        Connection connection1 = DriverManager.getConnection(ConnectionConst.URL,ConnectionConst.USERNAME,
                ConnectionConst.PASSWORD);
        Connection connection2 = DriverManager.getConnection(ConnectionConst.URL,ConnectionConst.USERNAME,
                ConnectionConst.PASSWORD);

        log.info("connection={}, class={}",connection1, connection1.getClass());
        log.info("connection={}, class={}",connection2, connection2.getClass());

    }

각각 다른 커넥션이 생성된 것을 확인할 수 있다.

🏐 HikariDataSource 커넥션 풀

HikariDataSource는 DataSource를 구현한다.

@Test
    void dataSourceConnectionPool(){

        HikariDataSource dataSource = new HikariDataSource();

        dataSource.setJdbcUrl(ConnectionConst.URL);
        dataSource.setUsername(ConnectionConst.USERNAME);
        dataSource.setPassword(ConnectionConst.PASSWORD);
        dataSource.setMaximumPoolSize(10);
        dataSource.setPoolName("DB ConnectionPool");
    }

커넥션 풀은 10개, 풀의 이름은 "DB ConnectionPool"로 설정했다.

설정한 커넥션 풀을 확인할 수 있다.

이 글은 김영한님의 스프링 DB 2편 - 데이터 접근 활용 기술 강의를 듣고 정리한 내용입니다.

0개의 댓글