Spring - [MyBatis] Spring + Mybatis 설정하기 - Ibatis 와 비슷하게 설정하기 - Ibatis/Mybatis
목록  
제 목 [MyBatis] Spring + Mybatis 설정하기 - Ibatis 와 비슷하게 설정하기 - Ibatis/Mybatis
작성자 박세청 작성일 2014/01/17 16:17



[MyBatis] Spring + Mybatis 설정하기 - Ibatis 와 비슷하게 설정하기 -  Ibatis/Mybatis 

2013/08/19 22:39

복사http://blog.naver.com/platinasnow/30174311054

전용뷰어 보기

아이바티스가 마이바티스로 넘어가고, 새로운 업데이트가 생기지 않게 된지 꽤나 오랜 시간이 지났습니다.

 

아직 아이바티스도 충분히 현역이라고 할 수 있겠지만, 새로운 기술이 지원되지 않는 것은 꽤 큰 문제입니다. 

 

아이바티스에 익숙하여 계속 쓰다가 대세가 마이바티스로 기우는 듯하여 갈아타려고 하다보니 생소한 점들이 많이 있었습니다.

 

마이바티스는 아이바티스와 다르게 맵퍼를 이용하여 dao를 자동 생성해주는 기능이 있는데, 이 부분이 기존의 방식과 달라 다소 난해했습니다.

 

따라서 1편에서는 기존 아이바티스와 아주 비슷한 설정방법을 제시하고 그 다음엔 맵퍼를 이용한 방법을 소개해보려고 합니다.

 

 

1. Libary


mybatis-3.2.2.jar

 

mybatis-spring-1.2.0.jar

 

이 두 파일이 필요합니다 버전은 쓴 날짜인 2013년 8월 20일 기준으로 했습니다.. 

 

스프링 프레임워크의 라이브러리가 필요한건 당연한 것이니 생략합니다.

 

dependency는 아래와 같습니다.

 

 <dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis</artifactId>

<version>3.2.2</version>

</dependency>

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis-spring</artifactId>

<version>1.2.0</version>

</dependency>

 

 

2. Setting



 

2.1 mybatis 환경설정

 

마이바티스의 환경설정에 앞서 환경설정 파일을 쓰기 위해 web.xml파일에 마이바티스의 환경설정 파일을 등록하게끔 만듭시다.

 

 <context-param>

  <param-name>contextConfigLocation</param-name>

  <param-value>

  /WEB-INF/spring-servlet.xml

  /WEB-INF/mybatis-context.xml

  </param-value>

  </context-param>

  <listener>

  <listener-class>

  org.springframework.web.context.ContextLoaderListener

  </listener-class>

  </listener>

 

<servlet>

<servlet-name>spring</servlet-name> 

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>spring</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

 

spring-servlet 에는 스프링 설정을 한 것이고 중요한 마이바티스의 환경 설정 파일은 mybatis-context에 넣을 것입니다.

 

그럼 mybatis-context.xml을 살펴봅시다.

 

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

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

 

<context:component-scan base-package="com.exam.service" />

<!-- mssql-->  

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 

<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>

<property name="url" value="jdbc:sqlserver://localhost:1433;selectMethod=cursor;"/> 

<property name="username" value="userid"/> 

<property name="password" value="password"/> 

</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

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

   <property name="typeAliasesPackage" value="com.exam.model"/>

    <property name="mapperLocations" value="classpath*:com/exam/mapper/*.xml" />

  <property name="configLocation" value="/WEB-INF/config/mybatisConfig.xml"/>

</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">

  <constructor-arg index="0" ref="sqlSessionFactory" />

</bean>

 

<!-- 트랜잭션 매니저 -->

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

</bean>

 

<!-- Annotation 기반 트랜잭션 설정 -->

<tx:annotation-driven transaction-manager="transactionManager" />

</beans>


 

아이바티스에서는 SqlMapClientFactoryBean 과 SqlMapClientTemplete을 이용했지만, 마이바티스에서는 SqlSessionFactoryBean과 

 

SqlSessionTemplate을 이용합니다. 그리고 실제로 dao 에서 호출 될 것은  sqlSession이 되겠습니다. dataSource는 MSSQL기준으로 짜있으니 

 

다른 DB를 사용하는 사람들은 다르게 설정해야 합니다.

 

sqlSessionFactory의 typeAliasePackage는 지정한 패키지의 Value Object를 자동으로 검색해서 연결해주는 기능입니다. 여기선 Model 패키지를 연결했습니다.

 

mapperLocation은 sql쿼리 파일들을 불러오는 설정입니다. 쿼리가 담긴 mapper라는 패키지를 *.xml 를 사용하여 전체 검색하게 했습니다.

 

configLocation은  cacheEnabled,lazyLoadingEnabled, useGeneratedKeys 등의 설정을 하는 파일을 말합니다. 디폴트로 하고 싶다면 쓰지 않아도 됩니다.

 

그 밑은 트렌젝션에 대한 설정입니다.

 

2.2. mapper

 

Value Object 인 UserInfoVO 는 name 과 userId를 넣었습니다.

 

맵퍼로써 쿼리문이 담긴 xml은 아래와 같습니다.

 

 <mapper namespace="user">

 

<select id="getUserList" resultType="UserInfoVO">

SELECT name, userId

FROM User_Table

</select>

<select id="getUserItem" resultType="UserInfoVO">

SELECT name, userId

FROM User_Table

WHERE principle = #{principle}

</select>

</mapper>

 

Ibatis의 sqlMap 대신 mapper를 사용합니다. resultType은 결과 타입인데 mapper안에는 typeAliase를 선언하지 못하기 때문에 MyBatis

 

설정인 mybatis-context에서 Value Object를 자동 검색하게 해두었습니다. resultMap은 아직 건재하여 맵핑하고 싶다면 이쪽을 사용하면

 

됩니다.

 

또한 파라미터를 받는법이 다소 달라졌는데, 기존 아이바티스에선 다음처럼 # # 으로 파라미터를 받았지만,

 

 SELECT name, userId

FROM User_Table

WHERE userId = #userId# 

 

마이바티스에서는 다음처럼 #{ } 으로 파라미터를 전송받습니다.

 

 SELECT name, userId

FROM User_Table

WHERE userId = #{userId} 


 

또한 ${ } 도 가능한데 이는 # # 이나 #{ } 은 쿼리에 자동으로 '' 을 만들어 넣는 반면, ${ }는 ''를 수동으로 써줘야 합니다.

 

이는 문자열을 더하는 경우에 매우 요긴할 수 있으나 sql 인젝션 공격의 우려가 있으므로 조심히 사용해야 합니다.

 

 SELECT name, userId

FROM User_Table

WHERE userId = '${userId}' 


 

 

2.3. Dao

 

Dao인 UserInfoDao는 다음과 같습니다.

 

 @Component

public class UserInfoDao {

 

@Autowired

private SqlSession sqlSession;

 

public List<UserInfoVO> getUserList() {

return sqlSession.selectList("user.getUserList");

}

}

DAO로 주입하기 위해서 @Component를 선언했고, sqlSession을 @autowired하여 주입했습니다.

 

그리고 sqlSession에 접근하여 사용하면 됩니다. 아이바티스에서는 queryForObject 나 queryForList로 조회를 했지만, 마이바티스는

 

selectOne 이나 selectList로 접근합니다.  insert, update, delete는 동일합니다. 

 

 

2.4. Service

 

 @Service

public class UserInfoService {

 

@Autowired

private UserInfoDao userInfoDao;

 

public List<UserInfoVO> getUserList() {

return userInfoDao.getUserList();

}

}

 

서비스로 사용하기 위해 @service를 선언한 후 Dao를 @autowired로 주입합니다.

 

그 후 Dao를 마음대로 사용하면 됩니다.

 

2.5 . Controller

 

@Controller

public class MainController {

 

@Autowired

private UserInfoService userInfoService;

 

@RequestMapping("/index.do")

public String index(Model model) {

model.addAttribute("list", userInfoService.getUserList());

return "/index";

}

}


 

컨트롤러에서는 서비스를 주입받아서 사용하면 됩니다.

 

이것으로 기존의 아이바티스와 비슷한 설정으로 마이바티스를 사용할 수 있게 되었습니다.

 

다음은 mapper를 이용하여 dao를 자동생성하는 기능을 해보겠습니다.





이전글 Spring + Mybatis 설정하기 - Mapper를 이용하여 DAO자동생성하기
다음글 maven + spring + mybatis 설정

목록