DataSoruce - 커넥션 획득 방법 뽑아내기

Jang990·2026년 1월 28일

DataSource 생성

public interface MyDataSource {
    Connection getConnection() throws SQLException;
}


public class DriverManagerDataSource implements MyDataSource {
    private final DBConfig dbConfig;

	// 원래 url, username, password를 직접 받지만, 지금은 묶어서 받도록 구현했다.
    public DriverManagerDataSource(DBConfig dbConfig) {
        this.dbConfig = dbConfig;
    }

    @Override
    public Connection getConnection() throws SQLException {
        return DriverManager.getConnection(
        	dbConfig.getUrl(), 
            dbConfig.getUsername(), 
            dbConfig.getPassword()
        );
    }
}

단순하다.
DriverManager.getConnection 부분을 뽑아낸 것이다.
기존 코드에서도 Connection을 직접 생성하는 코드를 DriverManager대신 DataSource를 사용하도록 바꾸면 된다.


커넥션 풀의 close는?

이렇게 뽑아내면 나중에 커넥션 풀을 도입하기 쉬워진다.
커넥션 풀을 도입했다고 해보자.

커넥션풀DataSource.getConnection()을 했는데 connection.close()로 닫으면 어떡하나?

Connection을 프록시로 감싸서 반환해주면 될 것 같다.

수도 코드로 만들어보자.

public class 커넥션풀DataSource implements MyDataSource {
    private final DBConfig dbConfig;
    public DriverManagerDataSource(DBConfig dbConfig) { ... }

    @Override
    public Connection getConnection() throws SQLException {
        Connection conn = DriverManager.getConnection(...);
        return new 커넥션풀_Proxy_Connection(conn);
    }
    
    public static class 커넥션풀_Proxy_Connection implement Connection {
    	private final Connection delegate;
    	...
        execute() { delegate.execute(); } // 기타 코드는 실제 커넥션에 위임
        close() { 커넥션풀에_반환(); }
    }
}

이러면 Connectionclose()를 호출해도 커넥션을 닫지 않고, 커넥션 풀에 반환될 것이다.

profile
개발 기록 아카이브

0개의 댓글