[스프링 DB] 커넥션 풀과 DataSource의 개념
커넥션 요청 문제
우리가 개발한 애플리케이션이 DB
와 통신하기 위해서는 커넥션이 필요합니다.JDBC
를 사용하면 아래와 같은 흐름으로 커넥션을 획득합니다.
JDBC
가 제공하는 DriverManager
는 라이브러리에 등록된 DB 드라이버들을 관리하고, 커넥션을 획득합니다.
문제
그런데 이와 같은 과정은 문제가 있습니다.
바로 커넥션을 매번 새롭게 만들어야하기 때문입니다.
커넥션을 새로 생성하는 과정은 생각보다 많은 리소스를 사용합니다.
커넥션 풀
이러한 문제를 해결하기 위해 나온 방법이 바로 커넥션 풀이라는 방법 입니다.
커넥션 풀 방법은 커넥션을 미리 생성해두고 필요할 때 꺼내서 사용하고
사용을 마친후 다시 커넥션 풀에 반납하는 방법 입니다.
커넥션 풀 초기화
커넥션 풀 사용/반납
1. 커넥션풀에서 커넥션을 조회
2. 커넥션 획득
3. 커넥션 풀에서 획득한 커넥션을 이용하여 DB와 통신
4. 커넥션 사용이 완료되면, 커넥션을 커넥션풀에 그대로 반납
(커넥션을 종료하는 것이 아님, 커넥션이 살아있는 상태로 반납)
정리
- 커넥션 풀을 사용하여 커넥션를 매번 새롭게 맺는것에 대한 문제가 해결되었습니다! 👍
- 커넥션 풀은 서버당 최대 커넥션 수를 제한할 수 있습니다.
- DB에 무한으로 연결이 생성되는 것을 막아주어서 DB를 보호하는 효과도 있습니다.
- 대부분 기본적으로 사용하고,
hikariCP
를 주로 사용
그런데, 아직 문제가 있습니다.
커넥션을 획득할 때, DriverManager
를 사용한 레거시를
커넥션 풀을 사용하는 방식으로 변경할 때 코드를 변경해야 한다는 것 입니다. 🥲
애플리케이션 코드를 변경하지 않고 커넥션 풀(hikariCP
)로 변경하는 방법이 없을까요…?
DataSource 등장
자바에서는 이러한 문제를 해결하기 위해 DataSource
라는 인터페이스를 제공 합니다.
즉, DataSource
는 커넥션을 획득하는 방법을 추상화 하는 인터페이스입니다.
그런데!!!!!!!
아쉽게도, DriverManager
는 DataSoruce
인터페이스를 사용하지 않습니다….
따라서 DriverManager
는 직접 사용해야 합니다… 🥲
이말은 DriverManager
를 사용하다가DataSource
기반의 커넥션 풀을 사용하도록 변경하면 관련 코드를 전부 수정해야 합니다…
스프링을 이러한 문제를 해결하기 위해 DriverManager
도 DataSource
를 통해서 사용할 수 있도록 DriverManagerDataSource
라는 클래스를 제공합니다…!!👍
DataSource
// DataSource 의 핵심 기능은 커넥션 조회
public interface DataSource {
Connection getConnection() throws SQLException;
}
참고HikariCP
를 사용하면 별도의 스레드를 사용해서 커넥션 풀에 커넥션을 채우는 것을 확인할 수 있습니다.
이는 커넥션 풀에 커넥션을 채우는 것이 상대적으로 오래걸리는 작업이기 때문입니다.
애플리케이션을 실행할 때 커넥션 풀을 채울때 까지 대기한다면 실행시간이 늦어집니다.
따라서 별도의 스레드를 사용해서 커넥션 풀을 채워야 애플리케이션 실행 시간에 영향을 주지 않습니다.^^
정리
- 대부분의 커넥션 풀은
DataSource
인터페이스를 이미 구현했다.- 개발자는
DataSource
에만 의존하면 된다. - 커넥션 풀 구현 기술을 변경하고 싶으면 구현체만 바꾸면 된다.
- 개발자는
DriverManager
는DataSource
를 사용하지 않는다.- 커넥션 풀을 사용하려면 관련 코드를 모두 수정해야 한다.
- 스프링은
DriverManagerDataSource
라는 클래스를 제공하여DriverManager
도DataSource
를 사용할 수 있도록 한다.
정리
커넥션 요청 문제
- 애플리케이션 로직 실행 마다 커넥션을 생성하는 것은 비용이 크기 때문에 커넥션 풀이라는 방법을 도입하여 해결
커넥션 획득 문제
- 커넥션 풀을 사용할때 커넥션을 획득하는 방법이 다르기 때문에,
DataSource
인터페이스를 정의하여 커넥션을 획득하는 방법을 추상화- 커넥션 풀 구현 기술을 변경하고 싶으면 구현체만 바꾸면 됨
DriverManager
는 애초에DataSource
를 사용하지 않음- 스프링은 이를 해결하기 위해
DriverManagerDataSource
를 제공하여DriverManager
에서도DataSource
를 사용할 수 있도록함
- 스프링은 이를 해결하기 위해
참고
'0+ 스프링 > 0+스프링 DB' 카테고리의 다른 글
[스프링 DB] MySQL의 트랜잭션 격리 수준(Transaction Isolation Level) 파헤치기 (0) | 2023.08.01 |
---|---|
[스프링 DB] 트랜잭션 전파(propagation) (0) | 2023.07.29 |
[스프링 DB] 데이터를 저장할 때 파일에 저장해도 되는데, 데이터베이스에 저장하는 이유? (0) | 2023.07.06 |
[스프링 DB] JDBC의 개념 (0) | 2023.07.03 |