[66해빗 페이백 챌린지] 16일차

tree·2023년 5월 17일
0

2. 커넥션 풀과 데이터 소스 이해

커넥션 풀 이해

  • 데이터베이스 커넥션을 매번 획득

  • 애플리케이션 로직을 수행할 때마다 DB 커넥션을 새로 생성하는 것은 시간을 너무 많이 소모하고 리소스도 너무 많이 소모한다.

    • 사용자 응답 시간이 길어짐.
    • DB와 TCP/IP 연결할 때마다 3 way handshake를 하고, DB 내부 인증을 거쳐야 한다.
  • 커넥션 풀을 사용하면 이런 문제를 해결할 수 있다.

  • 커넥션 풀

  • 애플리케이션 시작 시점에 미리 여러 개의 커넥션을 생성하여 풀에 저장해둔다.

    • 보통 10개를 만들지만 상황에 따라 개수를 조정하면 된다.
  • 애플리케이션은 필요에 따라 풀에서 커넥션을 꺼내서 사용한다.

  • 사용을 마친 커넥션은 다시 풀에 반납한다.

  • HikariCP

    • commons-dbcp2 , tomcat-jdbc pool , HikariCP 등 여러 커넥션 풀 오픈 소스가 있다.
    • 스프링 부트 2.0부터는 HikariCP가 기본 커넥션 풀로 사용된다.
    • 성능, 편리함, 안정성이 검증됐다.

DataSource 이해

  • DB 커넥션을 획득하는 방법은 다양하다.
    • DriverManager를 사용해 필요할 때마다 커넥션을 생성할 수도 있고, 커넥션 풀을 통해 미리 생성된 커넥션을 가져다 쓸 수도 있다.
  • 커넥션 획득 방식 변경의 문제
  • 만약, DriverManager를 사용해 커넥션을 획득하다가 커넥션 풀을 사용해 커넥션을 획득하는 방식으로 변경하면 어떻게 될까?

  • DriverManager에 의존하던 애플리케이션 서버 코드를 커넥션 풀에 의존하도록 모두 다 바꿔야 한다.

  • 커넥션 획득 방식의 추상화

    • 자바는 javax.sql.DataSource라는 인터페이스를 통해 커넥션 획득 방식을 추상화 해두었다.
    public interface DataSource {
      Connection getConnection() throws SQLException;
    } // 커넥션 조회가 DataSource 인터페이스의 핵심
    • 애플리케이션 서버는 DataSource 인터페이스에만 의존하므로 커넥션 획득 방식이 바뀌어도 코드를 수정할 필요가 없다.
    • DriverManager는 DataSource 인터페이스를 구현하지 않지만 DriverManagerDataSource를 사용하면 DataSource 인터페이스에 의존하는 코드를 작성할 수 있다.

DataSource 예제1 - DriverManager

  • DriverManager 사용법

      DriverManager.getConnection(URL, USERNAME, PASSWORD);
      DriverManager.getConnection(URL, USERNAME, PASSWORD);
  • DriverManagerDataSource 사용법

    DriverManagerDataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD);
    
    Connection con1 = dataSource.getConnection();
    Connection con2 = dataSource.getConnection();
  • DriverManager vs DriverManagerDataSource

    • DriverManager는 커넥션 획득 시 항상 설정 속성을 메소드 인자로 전달해주어야 한다.
    • DriverManagerDataSource는 객체 생성 시점에 설정 속성을 한번 입력해두면 차후에 사용할 때는 더 이상 설정 속성을 메소드 인자로 전달해주지 않아도 된다.
  • 설정과 사용의 분리

    • 설정과 사용을 분리해두면 사용 코드는 설정을 몰라도 되는 장점이 있다.
    • 애플리케이션 개발 시, 보통 설정은 한곳에서 하지만 사용은 여러 곳에서 하는 경우가 많다.
    • 설정 부분과 사용 부분이 명확하게 구분된다.

DataSource 예제2 - 커넥션 풀

  • 커넥션 풀에서 커넥션을 생성하는 작업은 애플리케이션 실행 속도에 영향을 주지 않기 위해서 별도의 쓰레드에서 수행된다.

DataSource 적용

  • DB에 접근하는 객체가 DataSource에 의존하도록 하고 실제 구현 객체를 외부에서 주입(DI)해주면 커넥션 획득 방법이 변경되어도 코드를 수정할 필요가 없다(OCP).
  • 스프링은 JDBC를 편리하게 사용할 수 있는 JDBCUtils를 제공한다.
    • 리소스 정리 메소드

0개의 댓글