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값을 설정해줄 수 있다.