DataSource 자동구성 클래스

Sol's·2023년 6월 5일
0

토비의 스프링 부트

목록 보기
28/31

DataSourceConfig 자동구성 클래스와 빈을 만들어 보겠습니다.

DataSourceConfig

어떤 클래스가 존재할때만 Bean으로 등록할 것이기 때문에 @ConditionalMyOnClass를 사용하였습니다.
따라서 hikariDataSource가 있다면 사용하고 없다면 @ConditionalOnMissingBean으로 인하여 SimpleDriverDataSource 가 빈으로 등록됩니다!

  • hikariDataSource 는 커넥션 풀을사용합니다
  • SimpleDriverDataSource는 커넥션을 요청마다 생성합니다.

커넥션 풀의 대해서는 아래에서 설명하겠습니다!

@MyAutoConfiguration
@ConditionalMyOnClass("org.springframework.jdbc.core.JdbcOperations")
@EnableMyConfigurationProperties(MyDataSourceProperties.class)
public class DataSourceConfig {

    @Bean
    @ConditionalMyOnClass("com.zaxxer.hikari.HikariDataSource")
    @ConditionalOnMissingBean
    DataSource hikariDataSource(MyDataSourceProperties properties) {
        // 매번 커넥션을 만들어냄
        HikariDataSource dataSource = new HikariDataSource();

        dataSource.setDriverClassName(properties.getDriverClassName());
        dataSource.setJdbcUrl(properties.getUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());

        return dataSource;
    }

    @Bean
    @ConditionalOnMissingBean
    DataSource dataSource(MyDataSourceProperties properties) throws ClassNotFoundException {
        // 매번 커넥션을 만들어냄
        SimpleDriverDataSource dataSource = new SimpleDriverDataSource();

        dataSource.setDriverClass((Class<? extends Driver>) Class.forName(properties.getDriverClassName()));
        dataSource.setUrl(properties.getUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());

        return dataSource;
    }
}

커넥션 풀을 사용하는 이유

커넥션을 매번 요청마다 생성한다면 커넥션 또한 DB와의 tcp/ip 연결이기 떄문에 비용이 많이 들어갑니다.

커넥션풀을 만들어 미리 커넥션을 생성해 놓고, 요청이 올때 만들어진 커넥션을 사용하고 반납하는 식으로 한다면, 커넥션이 생성되는 비용을 줄일 수 있습니다!

  • 기본적으로 커넥션풀의 커넥션은 20개가 할당됩니다!
    개발자가 커넥션 풀의 초기생성 커넥션을 설정 할 수있습니다!

DataSoruce Properties 설정

DB와 커넥션을 하기 위해 환경설정 정보를 application.properties (yml)파일에서 읽어와야 합니다.

@MyConfigurationProperties(prefix = "data")
prefix로 data를 적용하여 application.properties (yml)파일에 일지하는 key값을 찾습니다.

@MyConfigurationProperties(prefix = "data")
public class MyDataSourceProperties {
    private String driverClassName;
    private String url;
    private String username;
    private String password;

	// getter setter
    
}
  • application.properties
server.contextPath=/app
server.port=9090
data.driver-class-name=org.h2.Driver
data.url=jdbc:h2:mem:
data.username=sa
data.password=

Test환경에서 Properties 설정

애플리케이션이 작동할때는 Properties의 값들을 잘 읽어왔지만, Test환경에서는 적용이 안되었습니다.
TestPropertySource를 사용해서 Properties의 경로를 설정할 수 있습니다!

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = HellobootApplication.class)
@TestPropertySource("classpath:/application.properties")
public class DataSourceTest {
    @Autowired
    DataSource dataSource;

    @Test
    void connection() throws SQLException {
        Connection connection = dataSource.getConnection();
        connection.close();
    }
}

적용한 hikariDataSource 가 잘 작동하는것을확인하였습니다!

profile
배우고, 생각하고, 행동해라

0개의 댓글