개발/SpringBoot

[SpringBoot] DB Connection (HikariCP DataSoure 연동)

mylee99 2023. 1. 26. 09:36
CP : Connection Pool (Connection의 과부하를 막기 위해 사용)
- Connection을 미리 만들고 Connection Pool에 두었다가, 사용자의 요청이 발생할 경우 Connection을 제공하고, 요청이 끝나면 다시 Connection Pool에 보관함.
- DB 접속 설정 객체를 미리 연결하여 메모리 상에 등록해 놓기 때문에, Client의 빠른 DB 접속이 가능함.
- DB 서버의 환경 변경 시 쉬운 유지보수 가능
HikariCP : SpringBoot 2.0부터 default로 설정되어 있는 DB Connection Pool

 

1. Common Property - [application.yml]

 datasoure: 맨 아래에 추가할 DB 정보 입력 (jdbc-url, driver-class-name, username, password)

 

2. DB Config Setting - [DataSourceConfig.java]

기존에 있는 다른 DataSoureConfig 파일을 참고해서 새로운 이름으로 같은 파일 생성

기본으로 주입받아서 사용하던 DataSource와 SqlSessionFactory에 대한 재정의가 필요하여,

필요한 DB 연결 수만큼 이런식으로 DataSoure, SqlSessionFactory, SqlTemplate 등을 확장해서 만들어주는 과정

(필요에 따라 DB 별로 Config 파일을 분리)

 

* 아래 코드에서 [pjtname] 자리에 추가할 DB명이나 약자 넣기

@Configuration
@MapperScan(basePackages="com.mylee.pjtname", sqlSessionFactoryRef="pjtnameSqlSessionFactory")
@EnableTransactionManagement
//application 파일의 설정정보를 토대로 hikariCp 설정
public class pjtnameDataSourceConfig {

    //CP를 관리하는 데이터소스를 받아오는 빈 선언
    @Bean(name="pjtnameDataSoure", destoryMethod="close")
    @Qualifier("pjtnameDataSoure")
    @ConfigurationProperties(prefix = "spring.datasource.hikari.pjtname") //읽어올 설정 정보의 prefix 지정
    public DataSource pjtnameDataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }
    
    //SQL Mapper로 Mybatis를 사용하기 때문에, 그와 관련된 SqlSessionFactory 객체를 반환하는 빈 선언
    @Bean(name="pjtnameSqlSessionFactory")
    public SqlSessionFactory pjtnameSqlSessionFactory(DataSource pjtnameDataSource) throws Exception {
        //Mybatis는 jdbcTemplate 대신 Connection 객체를 통한 질의를 위해 SqlSession 사용
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(pjtnameDataSource);
        
        //Mybatis Mapper Source(SqlSession에서 불러올 쿼리 정보)
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*.xml"));
        
        //Mybatis Config Setting(Mybatis 설정파일)
        bean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));

        return bean.getObject();
    }
    
    //SqlSession을 이용해 DataSoure(DB 연결정보)로 실제로 DB에 접근하는 빈 선언
    @Bean(name="pjtnameSqlSessionTemplate")
    public SqlSessionTemplate pjtnameSqlSessionTemplate(SqlSessionFactory ptnameSqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(ptnameSqlSessionFactory);
    }
    
    //트랜잭션 관리를 위해 매니저를 반환하는 빈 선언
    @Bean(name="pjtnameTransaction")
    public TransactionManager pjtnameTransactionManager() throws Exception {
    	return new DataSourceTransactionManager(pjtnameDataSource());
    }
}

 

ERROR

- 모든 설정 완료 후 화면에 데이터를 뿌리는 과정에서 났던 오류

org.apache.ibatis.binding.BindingException : Invalid bound statement (not found)

→ 기존의 mapper.xml 파일을 복붙하여 수정하면서 맨 위의 namespace를 수정 안함.

해당 mapper.java 파일의 경로명과 똑같이 일치하는지 꼭 확인하기!