스프링 DB 1편 - 데이터 접근 핵심 원리 강의의 내용을 저의 말로 정리한 것입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1
이렇게 커넥션을 만드는 것은 과정도 복잡하고 시간도 오래 걸린다. 따라서 커넥션을 미리 만들어 두고 이를 재사용하는 커넥션 풀이 생긴다.
커넥션을 획득하는 방법을 추상화하여 제공하는 인터페이스이다.
커넥션은 드라이버매니저를 통해서 직접 획득하다 커넥션 풀을 이용한다면 당연히 응용의 코드가 바뀌어야 할 것이다. 응용의 코드가 바뀌는 것을 막기 위해 커넥션 획득 방법을 추상화였다.
자바에서는 DataSource 라는 인터페이스를 제공한다. 대부분의 커넥션 풀들은 DataSource의 구현체이기 때문에 개발자는 인터페이스에만 의존할 수 있다.
public interface DataSource {
Connection getConnection() throws SQLException;
}
DataSource 인터페이스에는 getConnection이라는 메소드가 선언되어 있다. 따라서 각 구현체는 자신에게 맞는 커넥션 획득 방법을 구현하기만 하면 된다.
드라이버매니저를 통한 커넥션 직접 획득은 DataSource 구현체를 이용하는 것이 아니다. 따라서 코드가 바뀌는 것을 막고 인터페이스에 의존하기 위해 스프링에서는 DriverManagerDataSource라는 DataSource 구현체를 제공하고 이는 커넥션을 직접 획득한다.
이제부터는 개발자는 DataSource에만 의존하고 직접 커넥션을 얻고 싶으면 구현체를 DriverManagerDataSource로 히카리 커넥션 풀을 사용하고 싶으면 구현체를 HikariDataSource로 바꿔주면 된다.
DriverManagerDataSource와 DriverManager를 이용해서 커넥션을 획득하는 것은 모두 직접 획득하는 것이지만 차이가 있다.
DriverManager를 사용하면 커넥션을 획득하려는 시점에 매번 정보를 넣어
DriverManager.getConnection(URL, USERNAME, PASSWORD);
DriverManager.getConnection(URL, USERNAME, PASSWORD);
하지만 DriverManagerDataSource 구현체를 생성자로 만들 때 정보를 넣어주면 getConnection만 호출해주면 커넥션을 얻을 수 있다.
DriverManagerDataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD);
Connection con1 = dataSource.getConnection();
Connection con2 = dataSource.getConnection();
히카리에서는 HikariDataSource를 제공한다.
여기에 url, 아이디, 비밀번호, 풀 크기, 풀 이름 등을 정해주고 getConnection을 통해 커넥션을 얻어올 수 있다.
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(URL);
dataSource.setUsername(USERNAME);
dataSource.setPassword(PASSWORD);
dataSource.setMaximumPoolSize(10);
dataSource.setPoolName("MyPool");
히카리에서는 멀티 쓰레딩을 통해 커넥션을 생성해서 풀을 채운다. 이를 통해 초기화 시간을 줄인다.
만약 풀 크기보다 더 많은 수의 커넥션 요청이 온다면 초과한 요청들은 풀이 확보될 때까지 블락이 된다.