DB Connection 접근방법 (DriverManager, Connection Pool)

Sol's·2023년 3월 8일
0

DB

목록 보기
1/2

DB 공부를 하다 DB에 접근하는 방법 2가지를 알아보았습니다.
정리를 하면 더 좋을것 같아서 블로그에 포스팅하기로 하였습니다.

DriverManager, Connection Pool를 이용하여 DB의 Connction을 얻는 과정을 진행해 보겠습니다.

우선 DriverManager와 Connection Pool에 대한 개념을 알아보겠습니다.

DriverManager

스프링에서 제공하는 DriverManager입니다.

  • DB와 연결할 때마다 파라미터를 전달해야하고 새로운 커넥션을 생성하여 TCP/IP 통신을 하게됩니다.
    • 설정과 개발을 분리하지 않아 작업량이 증가하고 실수가 있을 수 있습니다.
    • TCP/IP연결을 매번 하기에 속도가 느립니다.

커넥션 풀 (hikariCP)

매 SQL요청마다 커넥션을 생성하지 않고 미리 커넥션을 만들어 놓는 방법입니다.

  • 커넥션 풀에있는 커넥션들은 DB와 TCP/IP연결 되어잇는 상태이기때문에 즉시 SQL 전달이 가능합니다.
  • 커넥션 풀의 커넥션 생성은 메인스레드가 아닌 스레드가 생성합니다.
    • 메인스레드가 생성을 하면 비효율적이기 때문입니다.
  • 기본적으로 DataSource 인터페이스를 의존하고 있습니다.
    • 따라서 커넥션 풀 구현기술을 변경하고 싶으면 구현체만 갈아끼우면 됩니다.
      (DataSource도 DriverManagerDataSource 라는 DataSource 를 구현한 클래스를 제공합니다.)

저는 대표적인 오픈소스 hikariCP 를 사용할 것입니다.

실습해보기

DriverManager

@Slf4j
public class ConnectionTest {

    @Test
    void driverManager() throws SQLException {
        Connection con1 = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        Connection con2 = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        log.info("connection={}, class={}", con1 ,con1.getClass());
        log.info("connection={}, class={}", con2 ,con2.getClass());
    }

    @Test
    void dataSourceDriverManager() throws SQLException {
        //스프링이 제공하는 Driver DataSource - 항상 새로운 커넥션을 흭득
        //설정과 사용의 분리를 하여 코드 작성을 편하게 할 수 있습니다.
        DataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD);
        userDataSource(dataSource);
    }

    private void userDataSource(DataSource dataSource) throws SQLException {
        Connection con1 = dataSource.getConnection();
        Connection con2 = dataSource.getConnection();
        log.info("connection={}, class={}", con1 ,con1.getClass());
        log.info("connection={}, class={}", con2 ,con2.getClass());
    }

}

driverManager()

  • 기존 driverManager를 사용한 것으로 매번 파라미터를 넣어줘서 연결해야 합니다.

dataSourceDriverManager()

  • 💡 설정과 사용의 분리를 하여 코드 작성을 편하게 할 수 있습니다.

Connection Pool

	@Test
    void dataSourceConnectionPool() throws SQLException, InterruptedException {
        //커넥션 풀링
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(URL);
        dataSource.setUsername(USERNAME);
        dataSource.setPassword(PASSWORD);
        dataSource.setMaximumPoolSize(10);
        dataSource.setPoolName("MyPool");

        useDataSource(dataSource);
        Thread.sleep(1000);
    }

    private void useDataSource(DataSource dataSource) throws SQLException {
        Connection con1 = dataSource.getConnection();
        Connection con2 = dataSource.getConnection();
        log.info("connection={}, class={}", con1 ,con1.getClass());
        log.info("connection={}, class={}", con2 ,con2.getClass());
    }

HikariDataSource 를 생성하여 연결조회를 한 결과입니다.

17:48:06.852 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn2: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.854 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn3: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.857 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn4: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.860 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn5: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.863 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn6: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.866 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn7: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.868 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn8: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.872 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn9: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.872 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - After adding stats (total=10, active=2, idle=8, waiting=0)

[MyPool connection adder] 이라는 스레드가 커넥션을 생성한 것을 확인 할 수 있습니다.
After adding stats (total=10, active=2, idle=8, waiting=0) 에서 스레드가 몇개 생성이 되고 사용되고있는지 확인 할 수 있습니다.

주의할 점

Connection Pool의 스레드가 전부 사용중이면 요청은 대기하게됩니다.
이때 얼마나 대기해야할지는 개발자가 상황에 맞게 잘 정해놓아야 합니다.

profile
배우고, 생각하고, 행동해라

0개의 댓글