✏️ [Spring DB] DataSource를 이해하자

박상민·2023년 12월 10일
0

Spring DB

목록 보기
6/9
post-thumbnail

커넥션을 얻는 방법은 JDBC DriverManager를 직접 사용하거나, 커넥션 풀을 사용하는 등 다양한 방법이 존재합니다.

  • 애플리케이션 로직에서 DriverManager를 동해서 항상 커넥션을 생성하면서 얻어와도 되고
  • 또는 커넥션 풀을 통해서 풀에서 조회를 해도 됩니다.

한가지 상황을 가정하겠습니다.

⭐️ DriverManger에서 커넥션 풀로 변경하고 싶어요


DriverManager를 동해서 커넥션을 획득하게 되면 항상 신규 커넥션을 생성해서 그것을 반환받게 됩니다.
이처럼 JDBC로 개발한 애플리케이션 처럼 DriverManager를 통해서 커넥션을 획득하다가, 커넥션 풀을 사용하는 방법으로 변경하려면 어떻게 해야할까요?


예를 들어서 애플리케이션 로직에서 DriverManager를 사용해서 커넥션을 획득하다가 HikariCP같은 커넥션 풀을 사용하도록 변경하면 커넥션을 획득하는 애플리케이션 코드도 함께 변경해야 합니다. 의존관계가 DriverManager에서 HikariCP 로 변경되기 때문입니다.
물론 둘의 사용법도 조금씩 다를 것입니다.

매번 커넥션을 획득하는 방법을 변경할 때마다 애플리케이션 코드를 변경하는 것은 굉장히 귀찮고 번거롭습니다.

그래서 커넥션을 획득하는 방법을 추상화하는 것이 매우 중요합니다.

⭐️ 커넥션을 획득하는 방법 추상화


자바에서는 이전 상황과 같은 문제를 해결하기 위해 javax.sql.DataSource라는 인터페이스를 제공합니다.
DataSource커넥션을 획득하는 방법을 추상화하는 인터페이스입니다.
이 인터페이스의 핵심 기능은 커넥션 조회 하나입니다. (다른 기능도 있지만 중요하지 않습니다.)

DataSource 핵식 기능만 출약

public interface DataSource {
	Connection getConnection() throws SQLException;
}

📌 정리

  • 대부분의 커넥션 풀은 DataSource 인터페이스를 이미 구현해두었다. 따라서 개발자는 DBCP2 커넥션 풀, HikariCP 커넥션 풀의 코드를 직접 의존하는 것이 아니라 DataSource 인터페이스에만 의존하도록 애플 리케이션 로직을 작성하면 된다.

  • 커넥션 풀 구현 기술을 변경하고 싶으면 해당 구현체로 갈아끼우기만 하면 된다.

  • DriverManagerDataSource인터페이스를 사용하지 않는다. 따라서 DriverManager는 직접 사용해야 한다. 따라서 DriverManager를 사용하다가 DataSource 기반의 커넥션 풀을 사용하도록 변경하면 관련 코드를 다 고쳐야 한다.
    이런 문제를 해결하기 위해 스프링은 DriverManager도 DataSource를 통해서 사용할 수 있도록 DriverManagerDataSource 라는 DataSource를 구현한 클래스를 제공한다. (이런 부분이 자바의 큰 장점이라고 생각합니다)

  • 자바는 DataSource를 통해 커넥션을 획득하는 방법을 추상화했다. 이제 애플리케이션 로직은 DataSource 인터페이스에만 의존하면 된다. 덕분에 DriverManagerDataSource를 통해서 DriverManager를 사용하다가 커넥션 풀을 사용하도록 코드를 변경해도 애플리케이션 로직은 변경하지 않아도 된다.


출처
스프링 DB 1편 - 데이터 접근 핵심 원리(김영한)
글의 내용과 자료는 대부분 위 강의의 자료를 사용합니다.
Spring DB 코드를 정리하는 깃허브 링크

0개의 댓글