back-end/spring boot

DataSource 설정 예제

study-minjeong 2024. 7. 11. 14:35

DataSource

커넥션을 획득하는 방법을 추상화 한 인터페이스이다.

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

 

DataSource에 설정해 준 메타 데이터들을 토대로 DB와의 Connection을 생성하고, 자신의 Connection Pool에 따로 저장한다. 그리고 이 connection을 사용할 수 있도록 getConnection()을 고정적으로 제공한다.

    @Bean
    public DataSource dataSource() {
    	BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

-> BasicDataSource 객체를 제공하는데, Common DBCP의 속성을 설정하기 위한 것이다.

-> Driver, url, username, password를 설정해주었다.

 

dataSource.getConnection()을 사용하여, db와 상호작용을 할 수 있다.

 

 

DataSourceConfig

@Configuration
@PropertySource("classpath:xxx/xxx/application-dev.yml")
@MapperScan(
        basePackages = "package.test",
        annotationClass = Repository.class,
        sqlSessionFactoryRef = "sqlSessionFactory"
)
public class DataSourceConfig {
}

- @PropertySource에 db 정보를 가진 파일의 path를 명시해준다. (그냥 application.yml은 자동으로 작동)

- @MapperScan 사용해서 매퍼를 하나씩 등록시키는 게 아니라 패키지 경로를 지정해 이하 위치에 있는 인터페이스들을 전부 매퍼로 사용한다.

 

@Bean
@Primary
@ConfigurationProperties(prefix="spring.datasource")
public DataSourceProperties primaryDataSourceProperties() {
    DataSourceProperties sourceProperty = new DataSourceProperties();
    return sourceProperty;
}

- 읽어드릴 property에 해당하는 prefix를 명시해준다.

- DataSourceProperties 객체를 반환한다. 반환과 동시에 Bean으로 등록되고, primaryDataSource(DataSourceProperties properties)를 호출할 때 스프링이 알아서 binding 시킨 후 파라미터로 넘겨준다.

 

@Bean
@Primary
@Qualifier("primaryDataSource")
public DataSource primaryDataSource(DataSourceProperties dataSourceProperties) {
    return properties.initializeDataSourceBuilder().build();
}

- DataSource를 생성한다.

- DB 정보를 가진 DataSourceProperties를 parameter로 받아, DataSource를 생성한다. (parameter로 받지 않으면 primaryDataSourceProperties()를 직접 호출하여 DataSource를 생성해도 된다.)

 

    @Bean(name="sqlSessionFactory")
    @Primary
    SqlSessionFactory sqlSessionFactory(
            @Autowired @Qualifier("dataSource") DataSource dataSource, ApplicationContext applicationContext)
            throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean()
        factoryBean.setDataSource(dataSource)
        // mybatis 쿼리 정보
        factoryBean.setMapperLocations(applicationContext.getResources("classpath*:*.xml"))
        return factoryBean.getObject()
    }
    
    @Bean
    @Primary
    SqlSessionTemplate sqlSessionTemplate(@Autowired @Qualifier("sqlSessionFactory") SqlSessionFactory factory) {
        return new SqlSessionTemplate(factory)
    }

    @Bean
    @Primary
    DataSourceTransactionManager transactionManager(@Autowired @Qualifier("dataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource)
    }

- SqlSessionFactory, SqlSessionTemplate,DataSrouceTransactionManager에 대한 재정의도 필요하다.

- SqlSessionFactory : SqlSessionTemplate에서 사용할 SqlSession을 생성하는 factory

- SqlSessionTemplate : mybatis와 spring을 연결하여 mybatis의 sql session을 사용할 수 있게 해주는 클래스

- DataSrouceTransactionManager : DataSource에서 Transaction 관리를 위한 Manager 클래스 등록

* SqlSession : mapper.xml에 등록된 sql문을 실행하고 트랜잭션을 관리하는 클래스(인터페이스)

 

 

+) application.yml을 이용해서 DB Property값을 설정해줄 수 있다.