본문 바로가기
프로그래밍/스프링프레임워크

스프링프레임워크 Java config로 MyBatis 사용하기

by pentode 2019. 3. 17.

스프링프레임워크에 MyBatis + MySQL(MairaDB) 환경을 Java Config로 구성해 봅니다. 앞의 글 "Maven 웹 프로젝트에 스프링프레임워크 적용하기"에 추가하여 구성합니다.


"스프링 프레임웍에서 MyBatis, Oracle 사용하기"에서의 xml 설정을 Java Config로 옮겨본 것입니다. 데이터베이스는 Oracle 대신에 MariaDB를 사용했습니다. 전체 소스는 글 하단에 첨부 했습니다.



1. pom.xml 파일에 필요한 의존성을 추가합니다.


<!-- 스프링에서 JDBC 를 사용하기 위한 라이브러리 입니다. -->

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-jdbc</artifactId>

    <version>${org.springframework-version}</version>

</dependency>


<!-- JSP페이지에서 사용한 JSTL을 위한 라이브러리입니다. -->

<dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>jstl</artifactId>

    <version>1.2</version>

</dependency>


<!-- 데이터베이스 커넥션 풀을 위한 라이브러리입니다. -->

<dependency>

  <groupId>org.apache.commons</groupId>

  <artifactId>commons-dbcp2</artifactId>

  <version>2.6.0</version>

</dependency>


<!-- MySQL JDBC 드라이브 입니다. -->

<dependency>

  <groupId>mysql</groupId>

  <artifactId>mysql-connector-java</artifactId>

  <version>8.0.15</version>

</dependency>


<!-- MyBatis 라이브러리 -->

<dependency>

    <groupId>org.mybatis</groupId>

    <artifactId>mybatis</artifactId>

    <version>3.5.0</version>

</dependency>


<!-- 마이바티스와 스프링 연동을 위한 라이브러리 -->

<dependency>

    <groupId>org.mybatis</groupId>

    <artifactId>mybatis-spring</artifactId>

    <version>2.0.0</version>

</dependency>


2. 데이터베이스 연결과 트랜잭션 설정을 합니다.


@EnableTransactionManagement 아노테이션은 DataSourceTransactionManager 빈을 찾아 Transaction Manager로 사용합니다.


package com.tistory.offbyone.init;


import javax.sql.DataSource;


import org.apache.commons.dbcp2.BasicDataSource;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import org.springframework.transaction.annotation.EnableTransactionManagement;


/**

 * 데이터베이스 설정

 */

@Configuration

// 아노 테이션 기반 트랜잭션 관리를 사용 합니다.

// <tx:annotation-driven>

@EnableTransactionManagement

public class ContextDataSource {


    /**

     * 데이터소스 등록

* @return

*/

@Bean(destroyMethod="close")

public DataSource dataSource() {

BasicDataSource dataSource = new BasicDataSource();

dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");

dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=UTC");

dataSource.setUsername("testdbadm");

dataSource.setPassword("testdbadm");

dataSource.setDefaultAutoCommit(false);

return dataSource;

}


/**

* 트랜잭션 매니저 등록

* @return

*/

    @Bean

    public DataSourceTransactionManager transactionManager() {

        return new DataSourceTransactionManager(dataSource());

    }

}


3. MyBatis 설정을 합니다.


@MapperScan 아노테이션은 지정된 베이스 패키지에서 DAO(Mapper) 를 검색하여 등록합니다


package com.tistory.offbyone.init;


import java.io.IOException;


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.context.ApplicationContext;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;


@Configuration

@MapperScan(basePackages = {"com.tistory.offbyone.service.impl"})

public class ContextSqlMapper {


@Autowired

ApplicationContext applicationContext;


    @Bean

    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws IOException {

        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();

        factoryBean.setDataSource(dataSource);

        factoryBean.setConfigLocation(applicationContext.getResource("classpath:/mybatis/mybatis-config.xml"));

        factoryBean.setMapperLocations(applicationContext.getResources("classpath:/mybatis/mappers/*.xml"));

        return factoryBean;

    }


    @Bean

    public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) {

        return new SqlSessionTemplate(sqlSessionFactory);

    }

}


4. 루트 컨텍스트 설정에서 다른 설정들을 import 합니다.

package com.tistory.offbyone.init;


import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Import;


/**

 * 루트 컨텍스트 설정파일

 */

@Configuration

// 설정 클래스들을 import 합니다.

@Import({

  ContextDataSource.class

, ContextSqlMapper.class

})

// 서비스 빈 객체들을 등록합니다.

@ComponentScan(basePackages = {"com.tistory.offbyone.service.impl"})

public class RootContextConfiguration {

}


5. MyBatis 설정과 샘플 Mapper 파일 입니다.


mybatis-config.xml, TB_Board_SQL.xml 파일 입니다. 이 파일들도 Java 설정으로 만들 수 있지만 이 부분은 XML 파일로 두겠습니다.


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">


<configuration>

<!-- 여러가지 기본 옵션을 지정합니다. -->

<settings>

<!-- 필드 속성이 READ_COUNT 처럼 언더 스코어가 있을 때 VO 의 readCount 처럼 카멜 케이스로 변환 되게 합니다. -->

<setting name="mapUnderscoreToCamelCase" value="true"/>

</settings>


<typeAliases>

<typeAlias alias="boardVO" type="com.tistory.offbyone.service.BoardVO"/>

</typeAliases>

</configuration>


<?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">


<!-- 맵핑될 DAO 인터페이스의 Full name 을 줍니다. -->

<mapper namespace="com.tistory.offbyone.service.impl.BoardDAO">


<!-- id 속성은 DAO 의 메소드와 같아야 한다. 여기의 boardVO 는 mybatis-confg.xml 에 Alias 되어 있습니다. -->

<select id="selectBoardList" resultType="boardVO">

SELECT NUM

     , NAME

     , TITLE

     , CONTENT

     , READ_COUNT

     , WRITE_DATE

  FROM TB_BOARD

ORDER BY NUM DESC

</select>


<insert id="insertBoard">

INSERT INTO TB_BOARD VALUES (#{num}, '홍길동','게시물 작성', '글 내용', 0, NOW())

</insert>

</mapper>


6. 실행 결과 입니다.


실행결과



※ 예제소스

mavenweb.zip


반응형