본문 바로가기

작업일지/신규업체 자동연동

#2 ) MyBatis와 SpringBoot 연동하기

자동연동 프로그램을 만들기 위해서

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

 

다음과 같이 패키지와 파일들을 만들어주었다.

project package 및 파일 구성

 

먼저 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개도 작업해주어야 한다 ^..^.....

반응형