Back-End/Spring

[Spring DB][커넥션풀과 데이터소스 이해] - DataSource의 이해

얄루몬 2022. 6. 24. 21:59

💻본 포스팅은 '스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 김영한'님의 강의를 듣고 작성되었습니다.

https://inf.run/As6W

 

스프링 DB 1편 - 데이터 접근 핵심 원리 - 인프런 | 강의

백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., - 강의

www.inflearn.com


목차
1. DataSource와 커넥션 풀
2. DriveManager와 DataSource(DriveManagerDataSource)
3. HikariDataSource
4. DataSource 데이터베이스에 적용
5. Connection Pool과 DataSource 간단 정리

1. DataSource와 커넥션 풀

  • DriveManager를 사용해서 커넥션을 요청할 경우 매번 새로운 커넥션을 돌려받는다. 이는 Connection 고갈의 문제를 만들 수 있고 또한 TCP/IP에서 커넥션을 연결 요청 작업이 시간이 많이 걸리기 때문에 이를 보완하기 위해서 커넥션 풀이라는 개념을 사용했다.
  • DataSource는 커넥션 풀을 지원하는 인터페이스로 미리 커넥션을 만들어 두고 필요할 때 커넥션을 꺼내 쓸 수 있는 개념을 커넥션 풀이라고 한다.

2. DriveManager와 DataSource(DriveManagerDataSource)

DriveManager은 매번 새로운 커넥션을 반환하기 때문에 문제가 생길 수 있다 했다. 이런 문제를 해결하기 위해서는 커넥션 풀을 지원하는 인터페이스인 DataSource를 사용해야 하는데, DriveManager의 경우엔 이를 지원하지 않기에 DriveManagerDataSource를 사용해야 한다. 

DriveManagerDataSource의 설정과 사용의 분리

DriverManagerDataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD);
  • 설정부로 이 부분을 설정해 준뒤 사용할 땐 설정부가 어떤지 몰라도 사용이 가능하다.
//사용부
useDataSource(dataSource);
  • 사용부로 설정이 어떻게 구성되어있는지 몰라도 된다.

커넥션 풀에 있는 커넥션보다 많은 커넥션을 연결한다면?

자동으로 block 처리를 해주고 개발자는 커넥션 풀이 다 찼을 때 얼만큼의 대기 시간을 설정할 것인가가 중요하다.

3. HikariDataSource

  • DataSource를 구현한 구현체로 여러 훌륭한 Open Source가 제공되고 있다. HikariDataSource는 그 중 하나이다.
  • DataSource를 DI(Dependency Injection) 의존관계 주입 해주어 사용하고 있다면 어떤 DataSource 구현체를 사용하더라도 코드의 변경 없이 구현체 변경이 가능하다.
  • 이때, DriveManagerDataSource도 DataSource를 상속하고 있기 때문에 이 역시도 커넥션 풀 구현체를 변경할 때 코드 변경 없이 사용이 가능하다. 

4. DataSource 데이터베이스에 적용

  1. 의존 관계 주입(DataSource)
  2. DataSource의 생성자 작성
  3. getConnection을 DataSource껄로 변경
    • private Connection getConnection() throws SQLException {
          Connection con = dataSource.getConnection();
          log.info("get connection = {}, class={}",con, con.getClass());
          return con;
      }
  4. close() 메소드는 직접 만든 DBConnectionUtil이 아닌 JdbcUtil을 사용해 관련 메서드를 사용해 코드를 간결하게 한다.
    • JdbcUtils.closeResultSet(rs);
      JdbcUtils.closeStatement(stmt);
      JdbcUtils.closeConnection(con);


5. Connection Pool과 DataSource 간단 정리

  • DataSource는 커넥션 풀을 지원하는 인터페이스이다.
  • 데이터 소스를 구현한 구현체들은 내가 직접 만들수도 있지만 실제 Open Source로 좋은 것들이 많이 구현되어 있으니 찾아서 쓰는 것이 좋다. 
  • 커넥션 풀에 있는 커넥션을 다 쓰고 있는 상황에서 close를 해주면 그 시간이 반환되고 다시 반환된 커넥션을 요청에 보내준다.
  • 커넥션 풀을 사용한다는 것은 같은 커넥션을 계속 재활용하여 사용할 수 있음을 의미한다.
  • 또한 DataSource의 DI로 인해서 구현체가 변경되더라도 그 부분만 변경이 될 뿐 코드의 변경은 없게 된다.