본문 바로가기
Spring

Spring Framework (6) - MyBatis 설정

by 이도현 2021. 5. 19.

     관계형 데이터베이스와 통신을 통해 데이터를 받게 된다면 우리는 그 데이터를 어떻게 처리해야할까. 관계형 데이터베이스를 통해서 넘어오는 데이터는 단순 숫자값인 경우도 있을 수 있지만, 많은 데이터를 다루기위해 데이터베이스를 사용하는 것이므로 대부분의 경우는 다양한 형식의 데이터들이 엄청나게 많은 양의 데이터가 넘어오게 된다. 일단 이렇게 많은 데이터를 자바에서 보관을 하고, 가공하기 수월하게 하기 위해서 우리는 ORM(객체 관계 매핑,Object-relational mapping) 패키지를 사용한다. 그 중에서 한국에서 가장 많이 사용되는 것이 마이바티스이므로 여기서는 마이바티스의 사용법에 대해 설명한다. 

    마이바티스에서 스프링을 연동시키는 방법은 아래 주소를 통해 읽어볼 수 있다.

http://mybatis.org/spring/ko/index.html

    이제 pom.xml에 의존성 주입을 한다. 메이븐 리파지터리에서 MyBatis와 MyBatis Spring을 찾아서 주입해야한다.

<mybatis-version>3.5.5</mybatis-version>

<mybatis-spring-version>2.0.5</mybatis-spring-version>

    프로퍼티에 버전을 추가한다.

<!-- MyBatis  -->

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis</artifactId>

<version>${mybatis-version}</version>

</dependency>

 

<!-- MyBatis Spring -->

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis-spring</artifactId>

<version>${mybatis-spring-version}</version>

</dependency>

    의존성 주입을 한다.

src/main/webapp/WEB-INF/spring 에 mybatis-context.xml 라는 파일을 하나 생성한다.

생성한 후 아래와 같이 소스를 기입한다.

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

 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"

xsi:schemaLocation="

  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

  http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">

 

<!-- 이 설정으로 매퍼.java 파일의 위치를 찾아낸다 -->

<mybatis:scan base-package="com.doh.yun.*.mapper" />

 

<bean id="sqlSession"

class="org.mybatis.spring.SqlSessionTemplate">

<constructor-arg name="sqlSessionFactory"

ref="sqlSessionFactory" />

</bean>

 

<bean id="sqlSessionFactory"

class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource"></property>

<property name="configLocation"

value="classpath:/mybatis/mybatis-config.xml"></property>

<!-- 이 설정으로 매퍼.xml 파일의 위치를 찾아낸다 -->

<property name="mapperLocations"

value="classpath:/com/doh/yun/*/mapper/impl/*.xml"></property>

</bean>

</beans>

    mybatis:scan base-package 의 값과 property name="mapperLocations" 의 값은 각자의 경로에 맞게 적용한다. 지금 내가 설정한 경로는 내가 생각하는 편한 경로를 설정한 것이고, 실제로 사용되는 경우의 표준은 아니다. 하지만 추후 내가 왜 이렇게 경로를 설정했는지 소스를 작성하면서 설명하겠다. 

    이제 src/main/resources와 src/tset/resources하위에 mybatis라는 폴더를 하나 생성하고, 그 안에 mybatis-config.xml 라는 파일을 생성하자. 그리고 다음 소스를 기입한다. 

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

http://mybatis.org/dtd/mybatis-3-config.dtd">

 

<configuration>

 

<settings>

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

<setting name="defaultStatementTimeout" value="0" />

<setting name="jdbcTypeForNull" value="VARCHAR" />

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

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

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

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

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

<setting name="useGeneratedKeys" value="false" />

<setting name="autoMappingBehavior" value="PARTIAL" />

<setting name="defaultExecutorType" value="SIMPLE" />

<setting name="safeRowBoundsEnabled" value="false" />

<setting name="localCacheScope" value="STATEMENT" />

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

</settings>

 

</configuration>

    설정에 대한 세부 설명은 마이바티스의 홈페이지에서 읽을 수 있으며 설명 또한 인터넷 검색을 통해 찾아볼 수 있으므로 그냥 넘어가겠다. 일단 기본적인 설정은 마무리하였고, 실제 테스트를 통해 잘 동작하는지 확인해 보려한다. 이번에는 Junit을 활용하지 않고 소스파일만 첨부하겠다. 파일 전체를 붙여넣기 하였으므로 경로를 찾아서 패키지 생성해서 추가하는 등의 과정은 생략한다. 

 

/spring/src/main/webapp/WEB-INF/views/test.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8" session="false"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>TestPage</title>

</head>

<body>

<h1>Hello world!</h1>

<P>Server Time : ${serverTime}</P>

<P>Database connection : ${databaseConnectionResult}</P>

</body>

 

</html>

 

/spring/src/main/java/com/doh/yun/test/mapper/impl/TestMapperImpl.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.doh.yun.test.mapper.TestMapper">

 

<select id="testConnection" parameterType="java.util.HashMap" resultType="java.util.HashMap">

/* TestMapper.xml | testConnection | Lee Dohyun */

SELECT 

1 as test

FROM

dual

</select>

 

</mapper>

 

/spring/src/main/java/com/doh/yun/test/mapper/TestMapper.java

package com.doh.yun.test.mapper;

 

import java.util.List;

import java.util.Map;

 

import org.apache.ibatis.annotations.Mapper;

 

@Mapper

public interface TestMapper {

List<Map<String, Object>> testConnection(Map<String, Object> paramMap);

}

 

/spring/src/main/java/com/doh/yun/test/service/TestService.java

 

package com.doh.yun.test.service;

 

import java.util.List;

import java.util.Map;

 

import org.springframework.stereotype.Service;

 

@Service

public interface TestService {

List<Map<String, Object>> testConnection(Map<String, Object> paramMap);

}

 

/spring/src/main/java/com/doh/yun/test/service/impl/TestServiceImpl.java

package com.doh.yun.test.service.impl;

 

import java.util.List;

import java.util.Map;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

 

import com.doh.yun.test.mapper.TestMapper;

import com.doh.yun.test.service.TestService;

 

@Service

public class TestServiceImpl implements TestService {

private static final Logger logger = LoggerFactory.getLogger(TestServiceImpl.class);

 

@Autowired

TestMapper testMapper;

 

@Override

public List<Map<String, Object>> testConnection(Map<String, Object> paramMap) {

logger.info("TestServiceImpl testConnection");

return testMapper.testConnection(paramMap);

}

 

 

}

 

/spring/src/main/java/com/doh/yun/test/controller/TestController.java

 

package com.doh.yun.test.controller;

 

import java.text.DateFormat;

import java.util.Date;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Locale;

import java.util.Map;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

 

import com.doh.yun.test.service.TestService;

 

@Controller

public class TestController {

 

@Autowired

TestService testService;

 

private static final Logger logger = LoggerFactory.getLogger(TestController.class);

 

@RequestMapping(value = "/test", method = RequestMethod.GET)

public String home(Locale locale, Model model) {

logger.info("Welcome home! The client locale is {}.", locale);

 

Date date = new Date();

DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

 

String formattedDate = dateFormat.format(date);

Map<String, Object> paramMap = new LinkedHashMap();

List<Map<String, Object>> resultList = testService.testConnection(paramMap);

 

model.addAttribute("serverTime", formattedDate );

model.addAttribute("databaseConnectionResult", resultList.get(0).get("test") );

return "test";

}

 

}

 

 

http://localhost:8080/yun/test

접속 후 Database connection : 1 라는 내용이 나오면 정상으로 처리된 것이다.