티스토리 뷰

Spring/JPA

커넥션 풀

땅속 디그다 2022. 8. 23. 11:22

커넥션 풀

Jdbc의 DriverManager 를 생각 해보면...

  1. url, password, user 에 해당하는 DB 드라이버를 통해 커넥션 조회
  2. 이과정에서 TCP/IP 통신에 필요한거 사용 + 인증 과정
  3. DB는 ID, PW를 통해 내부 인증 완료, 내부에 DB 세션 생성
  4. 커넥션 생성되었다고 어플리케이션 쪽에 알림
  5. DriverManager는 커넥션 객체를 생성해서 비지니스 로직에 사용

=> 매우 비싼 비용

미리 커넥션을 생성해두고 관리하는 pool 을 하나 만들자

어플리케이션을 시작하는 시점에 커넥션 풀은 필요한 만큼 커넥션을 미리 확보해서 풀에 보관.

커넥션 풀에 들어 있는 커넥션은 TCP/IP로 DB와 커넥션에 연결되어 있는 상태
이기 때문에 언제든지 즉시 SQL을 DB에 전달가능


🤔 커넥션 풀은 어떻게 사용되는지?

    1. 더이상 DriverManager.getConnection() 사용 x
    2. 커넥션을 커넥션 풀에서 참조하여 가져다 쓴다.

🥇 물론 여기서 커넥션 풀마다 스펙이 다를 것이고 기존의 DriverManager를 포함하여 Connection 제공 구현체들의
의존성을 줄이기 위해서 DataSource 인터페이스가 등장

  1. 커넥션 풀에 커넥션을 요청하면 커넥션 풀은 자신이 가지고 있는 커넥션 중에 하나를 반환
  2. 어플리케이션 로직은 커넥션 풀에서 받은 커넥션을 사용해서 SQL을 DB에 전달, 그 결과를 받아서 처리
  3. 커넥션을 사용하고 나면 커넥션을 종료시키는 것이 아니라 커넥션 풀에 반환

👍 커넥션에 대한 의존성 줄이기

지금까지의 커넥션 얻는 방법?

  1. Jdbc DriverManager 사용 (DriverManger.getConnection())
  2. 커넥션 풀 사용
    • 커넥션 풀의 구현체(종류) 마다 다르다.

어플리케이션 단에서 커넥션에 대한 구현체를 의존하고 있게 된다.

따라서 의존성을 줄이기 위한 것을 만들자 DataSource 등장

참고로 DriverManager는 DataSource를 상속 받지 않기 때문에
이를 스프링이 보안하기 위해 DriverManagerDataSource 를 만들어 놓았다.

커넥션 얻기 코드

🖥 hikariCP 이용

@Slf4j
public class ConnectionTest {
   @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");

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

   private void useDataSource(DataSource dataSource) throws SQLException, InterruptedException {
      log.info("connection 가져오기 시작");
      Connection con1 = dataSource.getConnection();
      log.info("connection 1 가져오기 종료");
      Thread.sleep(1000);
      Connection con2 = dataSource.getConnection();
      log.info("connection={}, class={}", con1, con1.getClass());
      log.info("connection={}, class={}", con2, con2.getClass());
   }
}

HikariDataSource의 getConnection의 구현부를 보면 알겠지만 getConnection 시점에 hikariCP가 초기화 되었는 지에 따라서
초기화가 안되어있다면 그시점에 초기화 과정을 걸처 값을 반환한다.

정리

Connection Pool 을 알아본것은 결론적으로 java단에서 OOP를 통해 각 클래스들에 대한 의존성을 줄이는 모습을 알아본 것이다


java에서는 DataSource를 통해 Jdbc에서 하지 못했던 커넥션 얻기에 대한 의존성을 줄여주었다.

'Spring > JPA' 카테고리의 다른 글

트랜잭션 이해하기  (1) 2022.08.23
JDBC 사용해보기  (0) 2022.08.23
JPA - 값 타입  (0) 2022.08.23
프록시와 연관관계 관리  (0) 2022.08.23
고급 매핑  (0) 2022.08.23
댓글
11-08 14:47
Total
Today
Yesterday
링크