Spring DB - 커넥션풀, 데이터소스

SeungTaek·2022년 6월 29일
0
post-thumbnail

본 게시물은 스스로의 공부를 위한 글입니다.
잘못된 내용이 있으면 댓글로 알려주세요!

커넥션풀

애플리케이션 로직에서 DB 드라이버에 커넥션을 요청한다.

Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

사실 이는 내부에서 복잡한 과정이 일어난다. DB 드라이버는 DB와 TCP 연결(3 way handshake), 내부 인증, DB 세션 생성 등등..
이렇게 커넥션을 새로 만드는 것은 시간이 많이 소모되는 일이며, 커넥션을 새로 생성하기 위한 리소스를 매번 사용해야 한다.

이를 해결하기 위해 커넥션 풀을 사용하게 된다. 커넥션 풀이란 추가 요청이 필요할 때 연결을 재사용할 수 있도록 관리되는 데이터베이스 연결의 캐시이다.
애플리케이션 시작 시 커넥션 풀에 필요만큼의 커넥션을 미리 확보 후 풀에 보관한다. 주로 기본값은 10개이다.
커넥션 풀에 들어있는 커넥션들은 모두 DB와 이미 연결이 되어 있는 상태기 때문에, 언제든지 SQL을 DB에 전달할 수 있다.

애플리케이션 로직에서는 DB 드라이버에 매번 새로운 커넥션을 획득할 필요 없다. 단지 커넥션 풀에 있는 커넥션을 꺼내서 쓰면 된다. 모두 사용 후에는 커넥션을 종료(DB와 연결 종료)를 하는것이 아니라, 다시 커넥션 풀에 반환하면 된다.

이런 커넥션 풀이 얻는 이점이 매우 크기 때문에, 실무에서는 항상 기본으로 사용한다. 또한 대표적인 오픈소스(HikariCP)가 있기 때문에, 고민할 필요 없이 사용하면 된다. 또한 스프링 부트 2.0부터는 기본 커넥션 풀로 제공한다. 만약 그 이전 버전을 사용한다면 외부 라이브러리를 추가하자. HikariCP 커넥션 풀에 대한 자세한 내용은 공식 사이트 참고



DataSource

전편에서는 DriverManager을 통해서 새로운 커넥션을 생성 후 획득하는 방법을 알아보았다. 위에서는 커넥션 풀에서 조회 후 획득하는 방법을 알아보았다. 이 두 방식은 똑같은 커넥션 획득이지만, 사용법이 다르고 또한 커넥션 풀의 오픈소스에 따라서도 사용법이 다를 수 있다. 따라서 자바에서는 커넥션을 획득하는 방법을 javax.sql.DataSource라는 인터페이스로 추상화해서 제공한다.

따라서 개발자는 DataSource의 인터페이스를 사용하면 되고, 구현 기술을 바꾸고 싶다면 구현체로 갈아끼우기만 하면 된다.
참고로, DriverManager은 DataSource 인터페이스를 사용하지 않는다. 이를 위해 스프링에서 DriverManagerDataSource을 제공한다.



Connection 획득 예시

1. DriverManagerDataSource

public Connection dataSourceDriverManager() throws SQLException {
  // DriverManagerDataSource -> 항상 새로운 커넥션을 획득
  DriverManagerDataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD);
  Connection con1 = dataSource.getConnection();
  Connection con2 = dataSource.getConnection(); // URL, USERNAME 등은 dataSource 생성시 한번만
  return con1;
}

2. Connection pool (HikariCP)

public Connection dataSourceConnectionPool() throws SQLException, InterruptedException {
  HikariDataSource dataSource = new HikariDataSource();
  dataSource.setJdbcUrl(URL);
  dataSource.setUsername(USERNAME);
  dataSource.setPassword(PASSWORD);
  dataSource.setMaximumPoolSize(10); // 디폴트 10개
  dataSource.setPoolName("MyPool");

  Connection con1 = dataSource.getConnection();
  Connection con2 = dataSource.getConnection(); // URL, USERNAME 등은 dataSource 생성시 한번만
  return con1;
}	




Reference

인프런 '스프링 DB - 데이터 접근 핵심 원리'(김영한)

profile
I Think So!

0개의 댓글