자동연동 프로그램을 만들기 위해서
SpringBoot와 MyBatis를 연동해보고자 한다.
이번에 사용한 빌드툴은 maven이다.
그래서 먼저 pom.xml에 MySql과 MyBatis를 추가해준다!
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
그리고 application.yml 혹은 properties에 다음처럼 설정한다.
먼저 커넥션 하나만 연동해보려고 mysqlDev - devdbmall만 설정했다.
spring:
profiles:
active:
- mysqlDev
- mysqlReal
.
.
.
.
spring:
profiles: mysqlDev
devdbmall:
datasource:
hikari:
jdbc-url: jdbc:mysql://DB서버IP 혹은 도메인:PORT번호/?&autoReconnect=true
username: 계정ID
password: 계정PW
driverClassName: com.mysql.cj.jdbc.Driver
maximum-pool-size: 10
#minimum-idle: 100
max-lifetime: 1800000 #1800000
connection-timeout: 30000 #30000
validation-timeout: 5000
#connection-test-query: SELECT 1
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
다음과 같이 패키지와 파일들을 만들어주었다.
먼저 configuration부터 진행했다.
package com.smartplus.connect.judy.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
@Configuration
@MapperScan(value="com.smartplus.connect.judy.mapper.dbmall.*", sqlSessionFactoryRef="devdbmallSqlSessionFactory")
//@EnableTransactionManagement
@Slf4j
public class DevDbMallConfig {
@Autowired
private Environment env;
private static final String prefix = "spring.devdbmall.datasource.hikari.";
@Bean(name = "devdbmallSource", destroyMethod = "close")
@Primary
public HikariDataSource devdbmallSource() {
HikariConfig config = new HikariConfig();
config.setUsername(env.getProperty(prefix+"username"));
config.setPassword(env.getProperty(prefix+"password"));
// config.setDriverClassName(env.getProperty(prefix+"driverClassName"));
config.setJdbcUrl( env.getProperty(prefix+"jdbc-url") );
config.setMaxLifetime( Long.parseLong(env.getProperty(prefix+"max-lifetime")) );
config.setConnectionTimeout(Long.parseLong( env.getProperty(prefix+"connection-timeout")));
config.setValidationTimeout(Long.parseLong( env.getProperty(prefix+"validation-timeout")));
config.addDataSourceProperty( "cachePrepStmts" , env.getProperty(prefix+"data-source-properties.cachePrepStmts"));
config.addDataSourceProperty( "prepStmtCacheSize" , env.getProperty(prefix+"data-source-properties.prepStmtCacheSize"));
config.addDataSourceProperty( "prepStmtCacheSqlLimit" , env.getProperty(prefix+"data-source-properties.prepStmtCacheSqlLimit") );
config.addDataSourceProperty( "useServerPrepStmts" , env.getProperty(prefix+"data-source-properties.useServerPrepStmts") );
config = new HikariDataSource( config );
HikariDataSource dataSource = new HikariDataSource( config );
return dataSource;
}
@Bean(name = "devdbmallSqlSessionFactory")
@Primary
public SqlSessionFactory dbmallSqlSessionFactory(@Qualifier("devdbmallSource") DataSource devdbmallSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(devdbmallSource);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:dbmall/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean(name = "devdbmallSqlSessionTemplate")
@Primary
public SqlSessionTemplate dbMallSqlSessionTemplate(SqlSessionFactory devdbmallSqlSessionFactory) throws Exception {
return new SqlSessionTemplate(devdbmallSqlSessionFactory);
}
@Bean(name="devdbMallTransactionManager")
@Primary
public PlatformTransactionManager dbMallTransactionManager(@Qualifier("devdbmallSource") DataSource devdbmallSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(devdbmallSource);
return transactionManager;
}
}
Hikari를 이용해서 DataSource를 만들면 connection을 pool에 넣어놓고 필요할 때 꺼내쓰는 방식으로 진행되어
자원을 덜 먹는 장점이 있다. 실제로 connection을 맺는 과정은 상당히 복잡하고 컴퓨터의 자원을 많이 소모하는 작업이다.
SqlSessionFactory는 DB연결과 SQL 실행에 대한 모든것을 가진 객체이다.
이 객체가 DataSource를 참조해서 MyBatis와 Mysql 서버를 연동시켜준다.
DevMalldbMapper.interface
package com.smartplus.connect.judy.mapper.dbmall;
import org.apache.ibatis.annotations.Mapper;
import java.util.HashMap;
import java.util.List;
@Mapper
public interface DevMalldbMapper {
List<HashMap<String, Object>> selectAuthInfo();
}
먼저 하나만 선언(?)했다.
DevMalldbMysql.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 사용할 인터페이스의 경로 -->
<mapper namespace="com.smartplus.connect.judy.mapper.dbmall.DevMalldbMapper">
<select id="selectAuthInfo" parameterType="java.util.HashMap" resultType="java.util.HashMap">
SELECT * FROM db_mall.tb_api_auth_info
</select>
</mapper>
mapper에서 선언한 메소드이름과 같은 id값으로 간단한 SELECT문을 만들었다.
DevTestContoller.java
package com.smartplus.connect.judy.controller;
import com.smartplus.connect.judy.service.DevTestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping(value="/dev/connect")
public class DevTestController {
@Autowired
DevTestService devTestService;
/**
* 개발서버 신규업체 연동 시작
*/
@RequestMapping(value = "/start")
public String startConnection(){
String aa = "마이바티스 연동 되는지 확인 작업 중";
devTestService.getMallInfo();
return aa;
}
}
너무 성의없어 보일 수 있으나 연동확인만 하려고 만든거니까 넘어가주자...ㅎㅎ
DevTestService.java
package com.smartplus.connect.judy.service;
import com.smartplus.connect.judy.mapper.dbmall.DevMalldbMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
@Slf4j
@Service
public class DevTestService {
@Resource
private DevMalldbMapper devMalldbMapper;
public void getMallInfo(){
List<HashMap<String, Object>> list = devMalldbMapper.selectAuthInfo();
}
}
이렇게 작성 후 디버깅모드로 실행해서 list에 SELECT문 실행결과가 잘 담기는지 확인하였다.
아주 잘 들어온다~!
이제 나머지 DB커넥션 3개도 작업해주어야 한다 ^..^.....
'작업일지 > 신규업체 자동연동' 카테고리의 다른 글
#4 ) log4j 이용해서 로그에 쿼리 남기기 (1) | 2021.03.26 |
---|---|
#3 ) Db Connection 4개 연동하기 with MyBatis (0) | 2021.03.25 |
#1 ) 신규업체 자동연동 프로그램을 만들어보자 (0) | 2021.03.25 |