본문 바로가기
SpringBoot

[Spring Boot] 04. DB Connection Pool (Multi Source 포함)

by 청양호박이 2019. 11. 10.

앞으로 MVC구조를 실질적으로 구현해보고, Controller를 통한 URL요청부터 Mapper의 DB Query리턴까지 동작이 되기 위해서는 DBCP(Database Connection Pool)을 사용해야 합니다. 이는 JDBC와의 Connection을 위해 사용하는 세션이며, DB와의 연결을 유지하고 해당 Pool을 통해서 발생하는 요청을 처리합니다.

 

기존에는 JDBC Connection Pool이 주로 쓰였으나, Spring Boot 2.X부터 HikariCP가 표준으로 사용되게 됩니다. Application을 실행하고, DB에 Query를 요청하는 순간에 HikariPool이 활성화 됩니다. 해당 표준은 기존대비 속도가 어마어마하게 개선되었으며 여러가지 장점이 있다고 합니다.

 

그럼 MVC구조로 DataSource를 사용하려면, 기존에 DB연결 테스트 했던 DataSource 설정으로는 한계가 있습니다. 왜냐하면 Mapper, DTO등의 설정들이 추가되어야 하기 때문이죠. 그럼 역시나~ 따라하는 방식으로 구성을 해보겠습니다. 향후 Multi DataSource등의 설정을 고려하여, Single DataSource 설정을 진행해 보겠습니다.

 

방식은 아래의 단계로 진행됩니다.

  • DataSource Configuration class 추가
  • Multi DataSource를 위한 POM.xml에 dependency추가
  • Application.yml 변경

 

1. DataSource Configuration class 추가


저는 보통 Main내부에 Config를 위한 폴더를 만들고 이곳에 관련 @Configuration이 있는 아이들을 모아 놓습니다.

 

Annotation 추가 - @Configuration 은 class위에 추가하며, 해당 Annotation이 들어가면, Spring Boot내 설정으로 인식

                        하게 됩니다.

                      - @Primary - Multi DataSource를 위해서 메인이 되는 설정에 해당 Annotation을 추가 합니다.

                      - @ConfigurationProperties - application.yml내 DataSource설정이 들어간 위치를 지정합니다.

SqlSessionFactory 추가 - Mapper xml 위치 및 DTO의 위치를 명기하여, Project내에서 해당 class의 위치를 Spring Boot

                                 가 인지할 수 있도록 합니다.

SqlSessionTemplate 추가

@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "com.example.ayoteralab.main"
            , sqlSessionFactoryRef = "mainSqlSessionFactory"
            , sqlSessionTemplateRef = "mainSqlSessionTemplate")
public class DatabaseConfiguraton {
	
	@Primary
	@Bean(name = "main")
	@ConfigurationProperties(prefix = "spring.datasource.hikari.main")
	public DataSource dataSource() {
		return DataSourceBuilder.create().type(HikariDataSource.class).build();
	}
	
	@Autowired
	private ApplicationContext applicationContext;
	
	@Bean(name = "mainSqlSessionFactory")
	public SqlSessionFactory mainSqlSessionFactory(@Qualifier("main") DataSource dataSource) throws Exception{
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(dataSource);
		sqlSessionFactoryBean.setTypeAliasesPackage("com.example.ayoteralab.main.dto");
		sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:main_mapper/**/*.xml"));
		return sqlSessionFactoryBean.getObject();
	}
	
	@Bean(name = "mainSqlSessionTemplate")
	public SqlSessionTemplate mainSqlSessionTemplate(SqlSessionFactory mainSqlSessionFactory) {
		return new SqlSessionTemplate(mainSqlSessionFactory);
	}

}

 

2. Multi DataSource를 위한 POM.xml에 dependency추가


위에서 @ConfigurationProperties를 추가하면 아래와 같이 warnning이 발생하는데, 클릭을 통해서 아주 가볍게 dependency가 추가됩니다.

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>

 

3. Application.yml 변경


Multi Data Source를 위해서 아래와 같이 설정을 변경합니다. 추가 Data Source가 있다면, Main과 동일한 Level로 추가해주면 됩니다.

spring:
  datasource:
    hikari:
      main: 
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=UTF-8
        username: root
        password: test

 

 

이제 모든 설정이 완료 되었습니다. 이 다음 블로그가 더 먼저 올라왔는데... 서로 확인하면서 작성하느라 이번 블로그가 몇분더 늦게 작성되었습니다. 

 

Spring Boot를 본격적으로 시작하신 여러분들 환영합니다~~!!

 

-Ayotera Lab-

 

 

 

댓글