Spring : MyBatis 소스분석

지환·2023년 12월 21일

Spring

목록 보기
6/7
post-thumbnail

학습목표

들어가기 앞서 마이바티스가 어떻게 동작하고 빈으로 관리되는데 어떤식으로 진행되는지 살펴보자.

MyBatis

  1. @Bean : 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") 을 참조한다.

  1. @Bean : 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는 객체를 생성하여 파라미터로 주입한다.

    • 그러면 HikariDataSource() 메소드를 통해서 Connection 역할을 한다.
  1. 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

  • 필요한 의존 객체의 “타입"에 해당하는 빈을 찾아 주입한다.

profile
아는만큼보인다.

0개의 댓글