이전 글로 Connection Pool에 대해 알아보았습니다.
DataSource와 Connection Pool - Connection Pool 이란?
Connection Pool 이란? Connection Pool을 사용하는 이유 Connection Pool 살펴보기 Connection Pool은 필수 에 대해 다룹니다. Connection Pool을 사용하는 이유 JDBC는 기본적으로 DriverManager를 제공하며 DriverManager는 매
hhhhicode.tistory.com
이번 글로 DataSource에 대해 알아보겠습니다.
DataSource 란?
- Connection을 획득하는 다양한 방법
- Connection 획득 방법 변경
- DriverManager는 사용하지 말자
에 대해 다룹니다.
Connection을 획득하는 다양한 방법
Connection을 얻는 방법은
JDBC의 DriverManager를 직접 사용하여 매번 Connection을 획득하거나
Connection Pool을 사용하여 미리 연결해둔 Connection의 참조를 가져와서 사용하거나 하는 방법 등
다양한 방법이 있습니다.
우리는 하나의 방법을 선택하여 코드를 작성합니다.
하지만 상황은 언제나 바뀌기 마련이고
요구사항 또한 언제나 바뀔 수 있습니다.
Connection 획득 방법 변경
변경에 의해 Connection 획득 방법을 변경해야 할 때 문제가 발생할 수 있습니다.
Connection 획득 방법을 변경하는 상황을 가정해 보겠습니다.
DriverManager를 통해 Connection을 획득하고 있습니다.
JDBC의 DriverManager를 직접 사용하여 Connection을 획득하고 있습니다.
DriverManager를 통해 Connection을 획득하면
매번 새로운 Connection을 획득하게 됩니다.
또한 매번 설정을 인자로 넣어주어야 하는 귀찮음이 있습니다.
매번 새로운 Connection을 획득하는 것은
TCP/IP 연결 시간 등 매번 추가되는 시간 때문에 사용자 경험이 좋지 않게 되었습니다.
해당 문제를 해결해야 합니다.
Connection Pool을 사용하려 합니다.
Connection Pool을 사용하기 위해 DataSource를 사용하게 되면서
Connection을 획득하는 방법을 변경하려 합니다.
DriverManager를 사용해서 Connection을 획득하다가 HikariCP 같은 Connection Pool 기술을 사용하기 위해 변경하면
Connection을 획득하는 코드도 함께 변경되어야 합니다.
의존관계가 DriverManager에서 HikariCP로 변경되는데
둘의 사용법이 조금씩 다르기 때문입니다.
DB 벤더마다 사용법이 조금씩 다른것은
DB 표준 Interface인 JDBC를 사용해서 DIP 하도록 하여 해결했었습니다.
각 구체 클래스는 만들어져 있고 스프링에서 라이브러리를 참고하여 자동으로 잡아주고요.
DB Connection 획득 방법 또한
추상화하여 DIP 하도록 하면
문제는 해결될 것입니다.
DataSource를 사용해야 합니다.
Connection을 획득하는 방법을 추상화해야 합니다.
자바에서는 Connection 획득 방법을 추상화하기 위해
javax.sql.DataSource라는 Interface를 제공합니다.
이 Interface의 핵심 기능은 Connection 조회 하나입니다.
다른 기능도 일부 있지만, 크게 중요하지 않습니다.
DataSource Interface의 getConnection 메서드를 보여드리겠습니다.
/**
* <p>Attempts to establish a connection with the data source that
* this {@code DataSource} object represents.
*
* @return a connection to the data source
* @exception SQLException if a database access error occurs
* @throws java.sql.SQLTimeoutException when the driver has determined that the
* timeout value specified by the {@code setLoginTimeout} method
* has been exceeded and has at least tried to cancel the
* current database connection attempt
*/
Connection getConnection() throws SQLException;
getConnection 메서드는 Connection을 반환하고 있네요.
반환하는 예외로는 SQLTimeoutException 예외가 있다는 것도 알 수 있습니다.
DriverManager는 사용하지 말자
대부분의 Connection Pool은 DataSource Interface의 구현 클래스를 구현해두었습니다.
따라서 개발자는 DBCP2 Connection Pool, HikariCP Connection Pool의 코드를 직접 의존하는 것이 아니라
DataSource Interface에만 의존해서 DIP를 지키며 Connection을 획득하도록
애플리케이션 로직을 작성하면 됩니다.
Connection Pool 구현 기술을 변경하고 싶으면
DataSource에 해당 구현체로 갈아 끼우기만 하면 됩니다.
DriverManager를 사용하는 경우 유념해야 할 것이 있습니다.
DriverManager는 Connection Pool을 사용하지 않기 때문에
DataSource Interface를 사용하지 않습니다.
따라서 DataSource와 DriverManager는 원래 호환되지 않습니다.
이런 문제를 해결하기 위해
스프링은 DriverManager도 DataSource와 호환될 수 있도록
DriverManagerDataSource라는 DataSource를 구현한 클래스를 제공합니다.
즉 스프링을 사용한다면
DriverManager를 직접 사용하지 않아야 하며
DriverManagerDataSource를 사용해야 합니다.
그러면 DataSource Interface와 호환이 되며
Connection Pool을 사용하기 위해 구현체를 변경해도
애플리케이션 로직은 변경하지 않아도 됩니다.
'Spring Data > DataSource와 Connection Pool' 카테고리의 다른 글
DataSource와 Connection Pool - Connection Pool 이란? (0) | 2022.12.07 |
---|
댓글