HomeBlogGuestbookLab 

JDM's Blog

온갖 테스트 결과가 기록되는 이곳은 JDM's Blog입니다. :3

SpringBoot @ConfigurationProperties DataSource Setting

Spring2016-05-18

1. 이번 포스트는?

이번 포스트는 SpringBoot에서 @ConfigurationProperties 어노테이션을 이용해 DataSource 구성에 필요한 환경설정 값을 만들고 사용하는 법을 알아봅니다.

2. @ConfigurationProperties

@ConfigurationProperties 어노테이션은 환경설정 파일ex. application.properties에서 값을 추출해 주입해줍니다. 이로써 환경설정 값도 추상화가 가능합니다.

3. 환경 설정 파일 구성

SpringBoot 프로젝트를 기본 생성한다면 application.properties 파일에 어플리케이션 환경설정에 필요한 값을 삽입할 수 있습니다. 아래처럼 datasource를 prefix로 갖는 Datasource 환경설정을 삽입해 봅니다.

datasource.driverClassName=com.mysql.jdbc.Driver
datasource.url=jdbc:mysql://127.0.0.1:3306/test
datasource.username=test
datasource.password=test!@#$
datasource.default-read-only=true
datasource.initial-size=3
datasource.min-idle=1
datasource.max-idle=5
datasource.max-active=5
datasource.test-while-idle=true
datasource.validation-query=select 1

4. 예제 코드

그리고 실제로 @ConfigurationProperties 어노테이션을 사용해 Datasource Bean을 만드는 예제 코드입니다. 상세 설명은 코드 라인별로 주석을 달았습니다.

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.tomcat.jdbc.pool.PoolProperties;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;


@Configuration
@MapperScan(basePackages = "kr.jdm.dao", sqlSessionFactoryRef="getSqlSessionFactory")
@EnableTransactionManagement
public class DBConfig {

    // 패스워드만 가져오고 싶다면 @Value 를 사용할 수 있습니다.
    @Value("${datasource.password}")
    private String password;

    // 데이터소스를 만들기 위해 커넥션풀 프로퍼티 객체를 반환하는 빈을 선언합니다.
    // 해당 빈을 만들 때 @ConfigurationProperties 어노테이션을 사용합니다.
    // "prefix" 값을 이용해 해당 prefix로 시작하는 값들을 주입 받습니다.
    @Bean
    @ConfigurationProperties(prefix="datasource")
    public PoolProperties getPoolProperties(){
        return new PoolProperties();
    }

    // 데이터소스를 반환하는 빈을 선언합니다.
    // 해당 빈은 톰캣 JDBC 데이터소스 객체를 반환합니다.
    // 중간에 패스워드를 변경할 수 있다는 것을 코드를 통해 알 수 있습니다.
    @Bean
    public DataSource getDataSource() {
        org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(getPoolProperties());
        String catchPassword = password + "postfix";
        dataSource.setPassword(catchPassword);
        return dataSource;
    }

    // 이번 예제에서는 SQL 매퍼로 "Mybatis"를 사용합니다.
    // Mybatis에 관련된 SqlSessionFactory 객체를 반환하는 빈을 선언합니다.
    @Bean
    public SqlSessionFactory getSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(getDataSource());
        factory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:/config/mybatis-config.xml"));
        return factory.getObject();
    }

    // 트랜잭션 매니저를 반환하는 빈을 선언합니다.
    @Bean
    public DataSourceTransactionManager transactionManager() {
        DataSourceTransactionManager manager = new DataSourceTransactionManager(getDataSource());
        return manager;
    }
}

4.1. Mybatis 설정 파일(mybatis-config.xml)

위의 예제 코드에서 사용한 mybatis-config.xml 파일입니다. 이번 포스팅의 주제와는 거리가 있지만 참고 차원에서 남겨봅니다. 자세한 설정 방법은 Mybatis3 - 매퍼 설정을 참고하세요.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="defaultExecutorType" value="REUSE" />
        <setting name="defaultStatementTimeout" value="20000" />
    </settings>
    <typeAliases>
        <package name="kr.jdm.model" />
    </typeAliases>
</configuration>