일반적인 DB 연결 방법
-> 커넥션을 한번 연결하는데만 이렇게 많은 과정이 필요하며 TCP/IP를 통한 방법이기 때문에 리소스도 매번 사용 해야 한다.
이 문제를 해결하기 위해 나온 방법이 커넥션 풀 방법이다
-> 미리 커넥션을 만들어놓고 필요할때 쓰고 반납하는 방식이다.
->애플리케이션을 시작하는 시점에 커넥션 풀은 필요한 만큼 커넥션을 미리 확보해서 풀에 보관
->커넥션 풀에 들어 있는 커넥션은 TCP/IP로 DB와 커넥션이 연결되어 있는 상태이기 때문에 언제든지 즉시 SQL을 DB에 전달할 수 있다.
대표적인 커넥션 풀로는 HikariCP 가 있다.
- JDBC-DriverManger
- 커넥션풀 (Springboot - HikariCP)
만약 우리가 1번에서 2번방법으로 바꾸게 된다면 어떻게될까?? 해당하는 코드들을 모두 변경해야 하는 문제점이 발생한다. 이를 해결하기위해 커넥션을 획득하는 방법을 추상화 해보자
커넥션을 얻는 방법을 추상화하는 인터페이스
대부분의 커넥션 풀은 DataSource를 이미 구현 해뒀다.
DriverManager 는 DataSource 인터페이스를 구현해놓은 DriverManagerDataSource 클래스를 사용해야한다.
=> 이로 인해 DriverManger를 사용하다 커넥션 풀로 바꿔도 코드 변경없이 갈아 껴주기만 하면 됀다.
DriverManagerDataSource는 풀을 사용하는게 아니기 때문에 항상 새로운 커넥션을 획득한다.
DataSoruce를 통해서도 커넥션 획득 가능
기존 DriverManager을 통한 획득한 할때마다 URL,USERNAME,PASSWORD 를 입력해줘야하지만 DataSource를 통한 커넥션 획득은 최초에 한번만 입력해 주면 된다.
여기서 가장 큰차이점은 설정과 사용의 분리이다. 관련된 속성들을 한곳에 모아 향후 변경에 더욱더 유리하며 또한 서로 의존관계가 낮아짐으로 독립성도 확보된다.
풀안의 커넥션 갯수도 조정할수 있다.
풀안의 커넥션을 만드는작업은 애플리케이션 속도에 영향을 주지 않기위해 별도의 쓰레드에서 동작한다. 별도의 쓰레드에서 동작하기때문에 테스트가 먼저끝나버린다. sleep 을 추가해서 로그를 확인해주자.
첫번쨰 사진은 DriverManagerDataSource 를 이용해 커넥션을 얻는 방법이다. 아무래도 연결하떄마다 하나하나 커넥션을 획득하니 속도도 느리고 좋지 않다. 그래서 DataSource 를 구현한 HikariCP를 사용했다. (커넥션 풀)
보시다시피 커넥션 얻는 방법을 변경해도 다른코드들은 전혀 변경할 필요가 없다.