[Spring] 커넥션 풀과 데이터 소스

BE/Spring 2024. 7. 15.

  목  차

  • 커넥션
  • 커넥션 풀(Connection Pool)
  • 데이터소스(DataSource)
  • 데이터소스 사용

 

 


 

  커넥션

 

  데이터베이스 커넥션을 획득할 때는 매우 복잡한 과정을 거치는데, 새로운 커넥션을 만드는 것은 과정도 복잡하고 시간도 많이 소모된다.

즉, 요청마다 커넥션을 획득을 하게 되면 응답 속도가 늦어져 서비스에 영향을 미치게 된다.

 

이런 문제를 해결하기 위해 등장한 것이 커넥션 풀이라는 방법이다.

 

 


 

  커넥션 풀(Connection Pool)

 

  커넥션 풀은 데이터베이스와의 연결을 관리하는 기법이다. DB와 연결된 커넥션을 미리 생성해 두고 필요할 때마다 재사용함으로써, 매번 새로운 커넥션을 생성하는 비용을 줄여 성능을 향상시킨다.

 

 

이 커넥션들은 매 요청마다 하나씩 꺼내서 사용하며, 처리가 끝나면 다시 풀에 반환한다. 

 

만약 풀에 있는 커넥션들이 모두 사용 중이면, 다음 요청은 커넥션을 얻을 수 있을 때까지 대기를 한다.

하지만 일정 시간동안(설정 가능) 대기를 할 경우 요청이 거절된다.

 

실무에서 기본 커넥션 풀로는 hikariCP를 사용한다. 성능, 편리함, 안전성 측면에서 이미 검증되었기 때문에 커넥션 풀을 사용할 때는 고민 없이 hikariCP를 사용하면 된다.

 

 


 

  데이터소스(Datasource)

 

  데이터베이스와의 연결을 관리하는 객체이다. 애플리케이션이 데이터베이스와 연결하기 위해 필요한 설정 정보를 가지고 있다. 데이터소스는 위에서 설명한 커넥션 풀링(Connection Pooling)을 지원한다.

 

DataSource와 비교할만한 것은 드라이버매니저(DriverManager)가 있는데, 가장 큰 차이점은 설정과 사용의 분리이다.

DriverManager는 커넥션을 획득할 때마다 설정 정보 파라미터를 계속 넘겨주어야 하는데, 데이터소스는 처음 객체 생성할 때만 필요로 한다.

 

 

  설정과 사용의 분리

설정: DataSource를 만들고 필요한 속성들을 사용해서 URL, USERNAME, PASSWORD 같은 부분을 설정하는 것을 말한다. 이렇게 설정이 한 곳에 있는 것이 유지보수에 더 용이하다.

 

사용: 설정은 신경 쓰지 않고, DataSource 가 제공하는 getConnection() 만 호출에서 사용하면 된다.

 

 


 

  데이터소스 사용

 

void dataSourceConnectionPool() throws SQLException, InterruptedException {
//커넥션 풀링: HikariProxyConnection(Proxy) -> JdbcConnection(Target) 
    HikariDataSource dataSource = new HikariDataSource(); 
    dataSource.setJdbcUrl(URL);
    dataSource.setUsername(USERNAME); 
    dataSource.setPassword(PASSWORD); 
    dataSource.setMaximumPoolSize(10); 
    dataSource.setPoolName("MyPool");
    
    useDataSource(dataSource);
    Thread.sleep(1000); //커넥션 풀에서 커넥션 생성 시간 대기
}