1. 커넥션 풀 이해
2. DataSource 이해
1. 커넥션 풀 이해
1-1) 데이터베이스 커넥션을 획득할 때 과정
-
애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다.
-
DB드라이버와 DB와 TCP/IP 커넥션을 연결한다.
3 way handshake와 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다.

- DB는 ID, PASSWORD를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성한다.
- DB는 커넥션 생성이 완료 응답을 보낸다.
- DB 드라이버는 커넥션 객체를 생성해 클라이언트에 반환한다.
- 결론
- 커넥션을 새로 만드는 과정이 복잡하다.
- 시간이 많이 걸린다.
- 고객이 애플리케이션을 사용할 때 SQL을 실행하는 시간뿐만 아니라 커넥션을 새로 만드는 시간이 추가되기에 결과적으로 응답 속도에 영향을 준다.
- 참고, 데이터베이스마다 커넥션을 생성하는 시간은 다르다.
1-2) 해결 방법, 커넥션 풀
- 커넥션을 미리 생성해두고 사용하는 커넥션 풀이라는 방법을 이용한다.
- 커넥션 풀은 이름 그대로 커넥션을 관리하는 풀(수영장 풀을 상상하면 됨)
1-2)-1. 커넥션 풀 초기화
- 애플리케이션을 시작하는 시점에 커넥션 풀은 필요한 만큼 커넥션을 미리 확보한다.
- 얼마나 보관할 지는 서비스의 특징과 서버 스펙에 따라 다르지만 기본값은 보통 10개다.

1-2)-2. 커넥션 풀의 연결 상태

1-2)-3. 커넥션 풀 사용-1
- 애플리케이션 로직에서 이제 DB 드라이버를 통해 새로운 커넥션을 획득하는 것이 아니다.
- 커넥션 풀을 통해 이미 생성된 커넥션을 객체 참조로 그냥 가져다 쓰기만 하면 됨.
- 커넥션 풀에 커넥션을 요청하면 커넥션 풀은 자신이 가지고 있는 커넥션 중 하나를 반환한다.

1-2)-4. 커넥션 풀 사용-2

- 주의할 점, 커넥션을 종료하는 것이 아니라 커넥션이 살아있는 상태로 커넥션 풀에 반환.
1-3) 대표적인 커넥션 풀 오픈소스
- commons-dbcp2
- tomcat-jdbc pool
- HikariCp : 스프링부트 2.0부터는 기본 제공
2. DataSource 이해
2-1) 커넥션을 획득하는 방법

2-2) DriverManager를 통해 커넥션 획득

2-3) DriverManager를 통해 커넥션을 획득하다 커넥션 풀로 사용하는 방법으로 변경하려면?
2-3)-1. DriverMangaer를 통해 커넥션 획득하다가 커넥션 풀로 변경시 문제
- 예를 들어 애플리케이션 로직에서 DriverManager를 사용해 커넥션을 획득하다가 HikariCP 같은 커넥션 풀을 사용하도록 변경하면 커넥션을 획득하는 애플리케이션 코드도 함께 변경해야 함.
- 의존 관계가 DriverManager에서 HikariCP로 변경되기 때문에

2-3)-2. 커넥션을 획득하는 방법을 추상화(어떻게 얻을까?)
- Java에서는 javax.sql.DataSource라는 인터페이스를 제공함.
- DataSource는 커넥션을 획득하는 방법을 추상화한 인터페이스다.
