커넥션 풀과 데이터소스

ksh98·2024년 3월 3일

스프링 DB

목록 보기
2/8

스프링 DB 1편 - 데이터 접근 핵심 원리 강의의 내용을 저의 말로 정리한 것입니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1

커넥션 획득 과정

  1. 응용이 드라이버매니저를 통해서 알맞은 드라이버를 찾고
  2. 드라이버를 통해 커넥션을 얻고
  3. 드라이버는 tcp ip를 통해 커넥션을 연결하고
  4. 연결이 되면 id, 비밀번호등 정보를 디비에게 전달하고
  5. 디비는 id, 비밀번호로 내부에서 인증을 하고 인증된 사용자라면 이 사용자에 대한 작업을 하기 위해 세션을 생성한다.
  6. 디비 드라이버는 커넥션 객체를 생성해서 응용에게 반환한다.

이렇게 커넥션을 만드는 것은 과정도 복잡하고 시간도 오래 걸린다. 따라서 커넥션을 미리 만들어 두고 이를 재사용하는 커넥션 풀이 생긴다.

커넥션 풀

  • 초기화 과정
    • 응용이 시작하는 시점에 최대 얼마정도의 커넥션을 쓸지 정하고 미리 만들어서 풀에 넣어둔다.
  • 만들어진 커넥션은 tcp ip를 통해 디비와 다 연결되어 있다. 따라서 꺼내서 쓰면 바로 sql을 보낼 수 있다.
  • 응용은 이제 드라이버를 통해 새로운 커넥션을 만드는 것이 아니라 커넥션 풀한테 달라고 하고 받아서 사용한다.
  • 커넥션을 모두 사용하고 나면 커넥션을 종료하는 것이 아니라 커넥션 풀에게 반환한다.
  • 커넥션 풀에 들어가는 커넥션 수를 제한할 수 있다. 이를 통해 디비에 접속한 사용자 수를 줄여 디비를 보호할 수 있다.

DataSource

커넥션을 획득하는 방법을 추상화하여 제공하는 인터페이스이다.

커넥션은 드라이버매니저를 통해서 직접 획득하다 커넥션 풀을 이용한다면 당연히 응용의 코드가 바뀌어야 할 것이다. 응용의 코드가 바뀌는 것을 막기 위해 커넥션 획득 방법을 추상화였다.

자바에서는 DataSource 라는 인터페이스를 제공한다. 대부분의 커넥션 풀들은 DataSource의 구현체이기 때문에 개발자는 인터페이스에만 의존할 수 있다.

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

DataSource 인터페이스에는 getConnection이라는 메소드가 선언되어 있다. 따라서 각 구현체는 자신에게 맞는 커넥션 획득 방법을 구현하기만 하면 된다.

드라이버매니저를 통한 커넥션 직접 획득은 DataSource 구현체를 이용하는 것이 아니다. 따라서 코드가 바뀌는 것을 막고 인터페이스에 의존하기 위해 스프링에서는 DriverManagerDataSource라는 DataSource 구현체를 제공하고 이는 커넥션을 직접 획득한다.

이제부터는 개발자는 DataSource에만 의존하고 직접 커넥션을 얻고 싶으면 구현체를 DriverManagerDataSource로 히카리 커넥션 풀을 사용하고 싶으면 구현체를 HikariDataSource로 바꿔주면 된다.

DriverManagerDataSource와 DriverManager의 차이점

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");

히카리에서는 멀티 쓰레딩을 통해 커넥션을 생성해서 풀을 채운다. 이를 통해 초기화 시간을 줄인다.

만약 풀 크기보다 더 많은 수의 커넥션 요청이 온다면 초과한 요청들은 풀이 확보될 때까지 블락이 된다.

profile

0개의 댓글