스프링프레임워크에 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. 실행 결과 입니다.
※ 예제소스
'프로그래밍 > 스프링프레임워크' 카테고리의 다른 글
Java Config로 Exception Resolver 설정하기 (0) | 2019.03.23 |
---|---|
Java Config로 메세지소스(MessageSource) 설정하기(다국어 지원) (0) | 2019.03.19 |
Maven 웹 프로젝트에 스프링프레임워크 적용하기 (0) | 2019.03.13 |
Maven 웹 프로젝트 서블릿 3.1로 업그레이드 하기 (8) | 2019.03.10 |
Eclipse에서 Maven 웹 프로젝트 만들기 (9) | 2019.03.06 |