DataSource

JIWOO YUN·2024년 4월 9일
0

SpringDB

목록 보기
4/11
post-custom-banner

DataSource

  • 커넥션을 획득하는 방법을 추상화 하는 인터페이스
    • 만약 DB 드라이버에서 HikariCP 커넥션 풀을 사용하게 변경을 진행하는 경우, 커넥션 획득 코드를 변경해줘야한다.
      • 의존관계가 변경되기 때문에
      • 획득하는 방법을 추상화 시켜서 사용하게 되는 경우
  • 대부분의 커넥션 풀은 DataSource 인터페이스를 이미 구현 해뒀기 때문에 위에 있는 있을 효과적으로 변경이 가능하다
    • 개발자의 경우 DataSource 인터페이스에만 의존하도록 애플리케이션 로직을 작성하면됨.
    • 커넥션 풀 구현기술을 다른걸 쓰고 싶을 때 -> 해당 구현체로 바꿔주기만 하면된다!

DriverManager는 DataSource 인터페이스를 사용하지 않기 때문에 직접사용해야함.

  • DriverManager를 사용하다가 DataSource 기반 커넥션풀을 사용하도록 변경시 관련코드를 다 변경해줘야함.
DriverManagerDataSource의 경우 DataSource를 구현한 클래스를 제공하기 때문에 이걸 사용하면 위의 문제가 발생하지 않는다.
  • DriverManagerDataSource를 통해서 DriverManager를 사용하다가 커넥션 풀을 사용하도록 코드를 변경해도 애플리케이션 로직은 변경할 필요가 없어진다.

DriverMagerTest 와 dataSourceDriverManager Test

@Test
void driverManager() throws SQLException {
    
    //DriverManager로 직접 connection
    Connection con1 = DriverManager.getConnection(ConnectionConst.URL, ConnectionConst.USERNAME, ConnectionConst.PASSWORD);
    Connection con2 = DriverManager.getConnection(ConnectionConst.URL, ConnectionConst.USERNAME, ConnectionConst.PASSWORD);

    log.info("connection={}, class ={}", con1, con1.getClass());
    log.info("connection={}, class ={}", con2, con2.getClass());

}

@Test
void dataSourceDriverManager() throws SQLException {

    //DriverMamgerDataSource를 통한 connection
    DriverManagerDataSource dataSource = new DriverManagerDataSource(ConnectionConst.URL, ConnectionConst.USERNAME, ConnectionConst.PASSWORD);

    useDataSource(dataSource);
}

private void useDataSource(DriverManagerDataSource dataSource) throws SQLException {

    Connection con1 = dataSource.getConnection();
    Connection con2 = dataSource.getConnection();

    log.info("connection={}, class ={}", con1, con1.getClass());
    log.info("connection={}, class ={}", con2, con2.getClass());

}
  • DriverMnager의 경우 커넥션을 획득할 때마다 URL,USERNAME,PASSWORD 같은 파라미터를 계속 전달해줘야함
  • DataSource를 사용하는 경우 처음 객체 생성시에만 필요한 파라미터를 넘겨주고, 커넥션을 획득 할 때 dataSource.getConnection() 을 호출 해주면된다.

이 둘의 차이점이 만드는 것

  • DataSource가 만들어지는 시점에 필요한 데이터를 넣어주게 되면 DataSource를 사용하는 곳은 dataSource.getConnection() 만 호출하면 되기 때문에 USERNAME이라던가, URL 등의 속성들에 의존하지 않아도된다.
    • repository는 DataSource만 의존하고 , 속성들은 몰라도 된다.
  • 객체를 설정하는 부분과 사용하는 부분을 명확하게 분리가 가능해짐.
    • 설정 : DataSource를 만들고 필요한 속성들을 사용해서 ,URL,USERNAME,PASSWORD 같은 부분을 입력하는 것 -> 설정과 관련된 속성이 한곳에 있는게 변경에 유연하게 대처 가능.
    • 사용 : 설정을 신경쓰지 않고, DataSource의 getConnection()만 호출해서 사용함.
profile
열심히하자
post-custom-banner

0개의 댓글