0+ 스프링/0+스프링 DB

[스프링 DB] 커넥션 풀과 DataSource의 개념

힘들면힘을내는쿼카 2023. 7. 3. 17:11
728x90
반응형

[스프링 DB] 커넥션 풀과 DataSource의 개념

 

커넥션 요청 문제

우리가 개발한 애플리케이션이 DB와 통신하기 위해서는 커넥션이 필요합니다.
JDBC를 사용하면 아래와 같은 흐름으로 커넥션을 획득합니다.

 

JDBC가 제공하는 DriverManager는 라이브러리에 등록된 DB 드라이버들을 관리하고, 커넥션을 획득합니다.

 

문제

그런데 이와 같은 과정은 문제가 있습니다.
바로 커넥션을 매번 새롭게 만들어야하기 때문입니다.

커넥션을 새로 생성하는 과정은 생각보다 많은 리소스를 사용합니다.

 

커넥션 풀

이러한 문제를 해결하기 위해 나온 방법이 바로 커넥션 풀이라는 방법 입니다.

커넥션 풀 방법은 커넥션을 미리 생성해두고 필요할 때 꺼내서 사용하고
사용을 마친후 다시 커넥션 풀에 반납하는 방법 입니다.

 

커넥션 풀 초기화

 

커넥션 풀 사용/반납

1. 커넥션풀에서 커넥션을 조회
2. 커넥션 획득
3. 커넥션 풀에서 획득한 커넥션을 이용하여 DB와 통신
4. 커넥션 사용이 완료되면, 커넥션을 커넥션풀에 그대로 반납
   (커넥션을 종료하는 것이 아님, 커넥션이 살아있는 상태로 반납)

 

 

 

정리

  • 커넥션 풀을 사용하여 커넥션를 매번 새롭게 맺는것에 대한 문제가 해결되었습니다! 👍
  • 커넥션 풀은 서버당 최대 커넥션 수를 제한할 수 있습니다.
    • DB에 무한으로 연결이 생성되는 것을 막아주어서 DB를 보호하는 효과도 있습니다.
  • 대부분 기본적으로 사용하고, hikariCP를 주로 사용

 

그런데, 아직 문제가 있습니다.
커넥션을 획득할 때, DriverManager를 사용한 레거시를
커넥션 풀을 사용하는 방식으로 변경할 때 코드를 변경해야 한다는 것 입니다. 🥲

 

 

애플리케이션 코드를 변경하지 않고 커넥션 풀(hikariCP)로 변경하는 방법이 없을까요…?

 

DataSource 등장

자바에서는 이러한 문제를 해결하기 위해 DataSource라는 인터페이스를 제공 합니다.
즉, DataSource커넥션을 획득하는 방법을 추상화 하는 인터페이스입니다.

 

그런데!!!!!!!
아쉽게도, DriverManagerDataSoruce 인터페이스를 사용하지 않습니다….

 

따라서 DriverManager는 직접 사용해야 합니다… 🥲
이말은 DriverManager를 사용하다가
DataSource 기반의 커넥션 풀을 사용하도록 변경하면 관련 코드를 전부 수정해야 합니다…

 

스프링을 이러한 문제를 해결하기 위해 DriverManagerDataSource를 통해서 사용할 수 있도록 DriverManagerDataSource라는 클래스를 제공합니다…!!👍

 

 

DataSource

// DataSource    의 핵심 기능은 커넥션 조회
public interface DataSource {
    Connection getConnection() throws SQLException;
} 

 

참고
HikariCP를 사용하면 별도의 스레드를 사용해서 커넥션 풀에 커넥션을 채우는 것을 확인할 수 있습니다.
이는 커넥션 풀에 커넥션을 채우는 것이 상대적으로 오래걸리는 작업이기 때문입니다.
애플리케이션을 실행할 때 커넥션 풀을 채울때 까지 대기한다면 실행시간이 늦어집니다.
따라서 별도의 스레드를 사용해서 커넥션 풀을 채워야 애플리케이션 실행 시간에 영향을 주지 않습니다.^^

 

정리

  • 대부분의 커넥션 풀은 DataSource 인터페이스를 이미 구현했다.
    • 개발자는 DataSource에만 의존하면 된다.
    • 커넥션 풀 구현 기술을 변경하고 싶으면 구현체만 바꾸면 된다.
  • DriverManagerDataSource를 사용하지 않는다.
    • 커넥션 풀을 사용하려면 관련 코드를 모두 수정해야 한다.
    • 스프링은 DriverManagerDataSource라는 클래스를 제공하여 DriverManagerDataSource를 사용할 수 있도록 한다.

 

정리

커넥션 요청 문제

  • 애플리케이션 로직 실행 마다 커넥션을 생성하는 것은 비용이 크기 때문에 커넥션 풀이라는 방법을 도입하여 해결

커넥션 획득 문제

  • 커넥션 풀을 사용할때 커넥션을 획득하는 방법이 다르기 때문에, DataSource 인터페이스를 정의하여 커넥션을 획득하는 방법을 추상화
    • 커넥션 풀 구현 기술을 변경하고 싶으면 구현체만 바꾸면 됨
    • DriverManager는 애초에 DataSource를 사용하지 않음
      • 스프링은 이를 해결하기 위해 DriverManagerDataSource를 제공하여 DriverManager에서도 DataSource를 사용할 수 있도록함

 

참고

 

 

 

728x90
반응형