커넥션 풀, 데이터 소스

김회민·2023년 2월 25일
0

Spring Data

목록 보기
4/7

Connection Pool

JDBC에서 기본적으로 지원하는 DriverManager는 각 연결마다 새로운 커넥션을 만든다. 그런데, 매 사용자의 요청마다 새로운 커넥션을 만들어서 데이터를 가공한다면 매우 불편할 것이다. 게다가 이 커넥션의 비용은 요청의 크기에 비례하지 않고 고정적으로 발생하며, 요청이 작으면 작을 수록 비용이 부담스러워 진다. 심지어 어떤 DB는 한번 생성하는데 수십 밀리초가 걸리기도 한다. 또한, 만약 관리를 잘못해서 커넥션이 해제되지 않는다면 쓸모없는 커넥션이 쌓여 큰 장애가 발생할 가능성도 있다.

이 때문에 고민하던 어느 개발자는 어느날 정말 획기적인 아이디어를 하나 제공한다. 그것은 바로 커넥션을 미리 만들어두고 그것만 쓰자는 것이었다. 이는 앞서 이야기 했던 두 가지 모두 해결이 된다.

  1. 미리 만들어둔 커넥션을 사용하기 때문에 생성하고 해제하는 비용이 들지 않는다.
    1. 사용할 때 커넥션 풀에서 하나를 가져오고, 사용을 마치면 연결을 해제하는 것이 아닌 커넥션 풀에 반납하는 방식이기 때문에 비용이 거의 들지 않는다.
  2. 커넥션의 갯수를 제한시켜 DB의 일정한 성능을 기대할 수 있다.
    1. 만약 모든 커넥션이 사용중이라면, 새로운 요청은 큐에서 “대기”하게 되어 초당 처리할 수 있는 수는 제한이 될 수 있지만, DB의 성능을 기대하는 수준으로 제한하여 장애 발생의 확률을 낮출 수 있다.
    2. 또한, 커넥션이 무한정 쌓이는 것을 원천적으로 막아주어 DB 보호에 중요한 역할을 한다.

위에 기술된 장점때문에 현재는 기본적으로 모두 커넥션 풀을 사용하며, 이를 구현한 오픈소스 또한 굉장히 많다. 그 중에서도 HikariCP를 가장 많이 사용하며, Spring에서도 기본적으로 사용되는 커넥션 풀이 HikariCP이다.

DataSource

package jakarta.activation;

public interface DataSource {

    public InputStream getInputStream() throws IOException;

    public OutputStream getOutputStream() throws IOException;

    public String getContentType();

    public String getName();
}

DataSource란, 커넥션 풀의 커넥션들을 관리하기 위한 인터페이스이다. DriverManager와 마찬가지로 커넥션을 획득하고 반납하는 역할을 하지만, 가장 큰 차이점은 새로운 커넥션을 생성하는가 안하는가이다. 데이터 소스는 커넥션 풀에서 남아있는 커넥션을 가져오는 것이다. 모든 커넥션이 사용중이면 일정 시간동안 대기하게 되는데(기본값 30초) 이는 적절하게 조절해서 사용해야한다. 사용자의 요청을 0.5~2초안에 응답하지 않으면 뭔가 오류가 났다고 판단해버리기 때문이다.

기본적으로 DriverManager는 데이터 소스를 사용하지 않는데, 스프링에서는 DriverManager도 데이터 소스를 사용할 수 있도록 DriverManagerDataSource 클래스를 제공한다.

profile
백엔드 개발자 지망생

0개의 댓글