학습목표
들어가기 앞서 마이바티스가 어떻게 동작하고 빈으로 관리되는데 어떤식으로 진행되는지 살펴보자.
public HikariConfig hikariConfig() 먼저 실행 @Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari") // yml파일에 있는 정보를 읽어옴.(오라클에대한 정보를 갖고있음)
public HikariConfig hikariConfig() {
return new HikariConfig();
} // 그 객체를 리턴타입으로 주입한다.
무슨 역할을 하는가? yml파일에 있는 정보를 읽어온다.

yml 파일을 살펴보면, hikari: 이 부분을 참고하여 주입한다.
application.yml 파일을 쪼개서 보면
spring.datasource.hikari.
spring.output.ansi.enabled = always
spring.mvc.view.prefix="/WEB-INF/views/"
spring.datasource.hikari.jdbc-url="jdbc:oracle:thin:@localhost:1521/orcl11"
gradle 환경에선 반복되는 낱말카드를 내려쓰기와 들여쓰기로 구분하기로 했다. (반복되는 문자열을 생략했다.)
@ConfigurationProperties(prefix = "spring.datasource.hikari") 을 참조한다.
public DataSource dataSource() 먼저 실행 @Bean
public DataSource dataSource() { // HikariDataSource는 Oracle connection을 도와주는 것
DataSource dataSource = new HikariDataSource(hikariConfig()); // hikariConfig() 이렇게 메소드를 호출하면 return으로
// 객체가주입된다.()
logger.info("datasource : {}", dataSource); // 오라클 정보를 쥐고있는 dataSource의 객체를 return한다.
return dataSource;
}
Oracle Connection을 도와주는 역할을한다.
new HikariDataSource(hikariConfig()) : hikariConfig() "메소드를 호출한다(위)" hikariConfig는 객체를 생성하여 파라미터로 주입한다.public SqlSessionFactory sqlSessionFactory(DataSource dataSource) @Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
// classpath는 src/main/resourcs이고 해당 쿼리가 있는 xml 위치는 본인의 취향대로 위치키시고 그에 맞도록 설정해주면
// 된다.
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:/mapper/**/*.xml"));
// getResources: resource안에서 찾는다.
return sqlSessionFactoryBean.getObject();
}
sqlSessionFactoryBean.setMapperLocations() 을 통해서 xml파일과 매핑한다.(set한다.)SqlSessionFactoryBean.class
private DataSource dataSource;
private Resource[] mapperLocations;
public void setMapperLocations(Resource... mapperLocations) {
this.mapperLocations = mapperLocations;
}
경로 및 전역변수로 관리되는 2가지가 set 된다.
sqlSessionFactoryBean은 2가지에 대한 정보를 쥐고있다.
그리고 나서 리턴으로 sqlSessionFactoryBean.getObject() 메소드를 실행하게 되면
SqlSessionFactoryBean.class
private SqlSessionFactory sqlSessionFactory;
@Override
public SqlSessionFactory getObject() throws Exception {
if (this.sqlSessionFactory == null) {
afterPropertiesSet();
}
return this.sqlSessionFactory;
}
SqlSessionFactory가 리턴된다. 그래서
SqlSessionTemplate을 받을 떄, SqlSessionFactory로 받는 것이다. 위 내용이 저장된값을 새로 객체로 생성된다.
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
그렇다면 Dao에서
@Autowired
SqlSessionTemplate sqlSessionTemplate = null;
라고 적는다면 이 리턴된 값을 주입받는 것이다.
그러면 sqlSessionTemplate(오라클 정보 + Connection 완료)
NullPointerException이 발생하지 않는다.
@Autowired