[Spring DB] 2.커넥션 풀과 데이터 소스

Updated:

커넥션 풀과 데이터 소스

Client가 데이터를 저장하는 작업을 수행할 때 앱이나 웹에서 Application Server을 거쳐 DB에 접근한다. 이 과정에서 Application Server와 DB 사이의 연결에 대해 알아보자

배경지식

DB를 통한 Connection 획득 과정

jdbc1

  1. Client는 DB Driver를 통해 Connection을 조회한다
  2. DB Driver는 DB와 TCP/IP 연결을 수행한다
  3. DB Driver는 TCP/IP 연결이 완료된 후 ID, PW와 같은 부가정보를 DB에 전달한다
  4. DB는 전달받은 ID, PW 등의 정보를 통해 내부 인증을 완료하고 DB 세션을 생성한다
  5. DB는 Connection 생성이 완료되면 DB Driver로 응답을 보낸다
  6. DB Driver는 이렇게 받은 Connection 객체를 Client에게 전달한다

매번 위의 과정을 거쳐 DB와 연결하는 과정은 복잡하고 시간이 많이 소요된다. 이런 문제를 해결하기 위해 Connection들을 여러개 생성해놓고 필요할때 가져다 쓰는 커넥션 풀이라는 방식을 이용한다

1. 커넥션 풀

jdbc2

  • Application 시작시점에 커넥션 풀은 일정 개수만큼의 Connection을 미리 생성하여 보관해둔다
  • 여기서 미리 생성할 Connection 개수는 서비스마다 다르지만 default값은 10개이다

jdbc3

  • 커넥션 풀 내부의 Connection들은 DB와 Connection이 연결된 상태이기 때문에 이를 사용하면 언제든지 DB에 SQL을 전달할 수 있다
  • 이제부터 Client는 DB 접근시 DB Driver를 거치지 않고 커넥션 풀에 생성되어 있는 Connection을 가져다 쓴다

jdbc4

  • Client가 Connection 사용을 완료하면 해당 Connection을 종료하는 것이 아니라 그대로 커넥션 풀에 반환한다

커넥션 풀을 직접 구현하여 사용할 수도 있지만 유용한 오픈소스 커넥션 풀이 많기 때문에 오픈소스를 주로 사용한다. 수많은 오픈소스 중에 HikariCP를 대부분 사용한다

2. 데이터 소스

jdbc5

  • Connection을 얻는 방식은 매번 DriverManager를 이용하는 방법과 HikariCP를 통한 커넥션 풀을 이용하는 방법 등 다양하다
  • 문제는 DriverManager를 사용하다가 커넥션 풀을 이용하여 Connection을 획득하기로 방법을 변경할 때 어떻게 해야하는지이다
  • 이를 위해 Connection을 얻는 방법을 추상화한다

jdbc6

  • Connection을 얻는 방식을 추상화한 것이 바로 데이터 소스로 Java에서는 이를 위해 javax.sql.DataSource라는 인터페이스를 제공한다
  • Connection을 얻는 방법을 추상화한 javax.sql.DataSource를 구현한 것이 DriverManager DataSource, HikariCP 커넥션 풀 등이다

Leave a comment