DB 연결 정보를 저장하고, Connection을 생성하고, Connection Pool에 등록하고, 관리하는 역할을 하는 것이 바로 DataSource이다.
DB와의 연결을 미리 생성하고, 그것을 관리하는 역할을 하는 오브젝트.
간단히 DataSource는 DB Connection을 관리하는 인터페이스라고 생각하면 된다.
보통 getConnection() 등의 메소드를 지원하며, JPA등 DB에 접근하고자 하는 툴들은 해당 메소드들을 통해서 DB Connection을 가져와 사용하고, 반납한다.
중요한 것이 getConnection파트이기 때문에 DataSource를 공부한다면, getConnection 메소드만 고려하면 된다고 한다.
DataSource의 선언은 아래와 같이 이루어진다.
Hikari DataSource에 대한 설정 코드이긴 하지만, 대부분의 DataSource가 위 코드와 같이 Driver, Url, Username, Password 등을 입력받는다.
Max Pool Size(setMaximumPoolSize), Timeout, Minimum Pool size(setMinimumIdle) 등 추가로 입력할 수 있는 값들도 있다.
DataSource의 근간이되는 interface. 위 설계도의 구현체는 반드시 getConnection을 구현해야 한다.
SimpleDriverDataSource
Connection Pool을 사용하지 않기 때문에 비효율적이다.
SingleConnectionDataSource
Connection을 하나만 만들어두고 이를 재활용한다.
SimpleDriverDataSource보다는 효율적이지만, 두 개 이상의 스레드가 동작하는 엔터프라이즈 환경에서는 사용하지 않는 것이 좋다.
Apache Common DBCP
Apache 재단에서 만든 유명한 DB Connection Pool 라이브러리.
Spring Boot 2.0 이전에는 Default DataSource로 사용됐다.
HikariCP
Spring Boot 2.0 이후에 표준이 된 DataSource.
오픈소스이고 안정적이며 빠르다.
DataSource의 Connection은 다음과 같이 사용할 수 있다.
public Optional<List<User>> findAll() {
List<User> Users = new ArrayList<>();
try {
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(SELECT_ALL_SQL);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
mapToUser(users, resultSet);
}
}
catch (SQLException e) {
throw new RuntimeException(e);
}
return Optional.of(Users);
}
원래는 application.yml
이나 application.properties
파일 명시하기만 하면 알아서 생성됐으며, JPA 등의 구현체가 알아서 JDBC 단을 추상화해줬기 때문에 DataSource에 대해서 크게 신경쓸 일이 없었다.
하지만 실제로 프로젝트를 진행하면서 DB와 Connection을 실제로 어떻게 연결되는지 알고 있다면, 그리고 어떤 값들을 조절할 수 있는지 정도까지 알고 있다면 좀 더 통제할 수 있는 범위가 넓어질 것이다.
참고 자료