본문 바로가기

Programming/과거포스팅

Spring MVC(3) Mybatis 연동

이번엔 간단한 Mybatis 연동을 알아보자.

연동하고 데이터를 받는것에는 여러가지 방법이 있지만 

우선 디비 연동의 기본 틀만 알아보도록 하자. 트랜젝션이나 여러가지 데이터 구조를 잡는 것은 추후 공부를 하면서 포스팅하도록 하겠다.

pom.xml에 다음 dependency를 추가한다. DB연동을 위한 필수 라이브러리들이다.
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.18</version>
        </dependency>
        
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.0.6</version>
        </dependency>
        
        <!-- mybatis spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.0.2</version>
        </dependency>
        
        <!-- apache commons dbcp-->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.2.2</version>
        </dependency>
 

다음은 프로젝트 구조이다.

빨간 테두리 사각형이 오늘 추가할 부분들이다. 그럼 설정파일 부터 하나씩 알아보자. 




web.xml 에 보라색 부분을 추가한다. mybatis연동 정보를 담을 것이다.
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/root-context.xml
            /WEB-INF/mybatis/mybatis-context.xml
        </param-value>
    </context-param>
 

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"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
    <bean id="propertyPlaceholderConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>/WEB-INF/mybatis/jdbc.properties</value>   //jdbc프로퍼티를 읽어오겠단 말(db정보)
        </property>
    </bean>
    
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
      destroy-method="close">
      <property name="driverClassName" value="com.mysql.jdbc.Driver" /> jdbc로 읽어온 정보를 매핑시켜 가지고 있는 빈
      <property name="url" value="${jdbc.url}" />
      <property name="username" value="${jdbc.username}" />
      <property name="password" value="${jdbc.password}" />
    </bean>
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">     
      <property name="dataSource" ref="dataSource" />                                         //데이터베이스 정보
      <property name="mapperLocations" value="classpath:com/spring/dao/mybatis/map/*.xml" />  //매퍼 xml이 있는 경로 정의
      <property name="configLocation" value="/WEB-INF/mybatis/mybatis-config.xml" />          //mybatis config설정 이있는 xml 참조하는 곳 추후 포스팅할때 설명
      <property name="transactionFactory">                                                    //트랜젝션에 관련된 내용 추후 설명
            <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" />
          </property>
    </bean>
    
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
      <constructor-arg index="0" ref="sqlSessionFactory" /> 
    </bean>
    
<!-- =========================== DAO DEFINITIONS : IBATIS IMPLEMENTATIONS ============ -->    

    <bean id="userDaoImpl" class="com.fureun.mybatis.UserDaoImpl">                             //DB 연결하는 빈을 설정 아래와 같이 봐야한다.
        <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>
</beans>



jdbc.properties  
디비정보다
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?autoReconnect=true
jdbc.username=root
jdbc.password=1234

이것으로 기본 xml설정은 끝이 났다.

컨트롤러에서 이용하는 방법을 알아보자.

UserDao다 Dao는 Data Acess Object의 약자로 데이터 관련된 작업을 하는 녀석이다.

우선 인터페이스이다. User에 관련된 작업을 선언해 놓을 것이다.
package com.fureun.dao;

import java.util.Map;

public interface UserDao {
    public int getLoginResult(Map<String, String> map); // 파라미터를 맵으로 받을 것이다. @Param 어노테이션을 사용한 결과 패키지 명을 
// 예상치 못한 잔버그들이 발생하여서 @Param어노테이션을 사용하지 않을 것이다.
}

다음은 위의 인터페이스를 구현한 클래스 파일이다.
package com.fureun.mybatis;

import java.util.Map;

import org.mybatis.spring.support.SqlSessionDaoSupport;

import com.fureun.dao.UserDao;
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {

    @Override
    public int getLoginResult(Map<String, String> map) {
        // TODO Auto-generated method stub
        return (Integer) getSqlSession().selectOne("userDao.getLoginResult",map); // userDao는 xml매퍼파일의 네임스페이스, getLoginResult
// 쿼리를 설정한 ID이다. 그리고 파라미터를 map으로 넣었다.
} }
 

위에서 정의한 userDao.getLoginInfo를 사용하기 위해선 xml을 하나 만들어서 정의를 해야한다. 그것에 대해서 알아보자
UserMap.xml이다. 위에서 DB설정할 때 지정해둔 경로안에 넣어야 매핑이 된다. 
<?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="userDao">                                                      이쿼리를 이용하기 위해선 namespace명.id로 접근하면 된다.
    <select id="getLoginResult" parameterType="java.util.Map"  resultType="Integer"> //파라미터를 map으로 넘겼기 때문에 타입을 정의해줘야한다.
        SELECT                                                                       // resultType는 Integer로 줬다. int는 안된다 클래스 타입으로 줘야한다.
            COUNT(U_ID) 
        FROM login_user
        WHERE U_ID = #{id}
        AND U_PASSWORD = #{password}
    </select>
</mapper>
위에서 설정한 기능을 컨트롤러에서 사용해 보자.
package com.fureun.web.user;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.fureun.mybatis.UserDaoImpl;

@Controller
public class JoinController {
    
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
    
    @Resource(name="userDaoImpl")                 //위의 xml에서 
<bean id="userDaoImpl" class="com.fureun.mybatis.UserDaoImpl"> 와 같이 설정한                         //DB 연결하는 빈을 설정 아래와 같이 봐야한다.
private UserDaoImpl userDaoImpl; // 곳의 ID 이렇게 리소스를 주면 자동으로 객체가 주입이 된다. @RequestMapping("/join.blog") public ModelAndView main() { ModelAndView mav = new ModelAndView("main"); mav.setViewName("user/joinForm"); Map<String, String> map = new HashMap<String, String>(); //임의로 맵을 만들어서 map.put("id", "test"); //쿼리의 ${id}의 id와 같이 이름을 주고 값을 넣었다. map.put("password", "1234"); if(userDaoImpl.getLoginResult(map) == 1){ //이렇게 구현을 한다음 파라미터로 map을 넘겨서 결과를 받아온다. System.out.println("로그인 성공"); // 아이디와 패스워드가 일치하면 카운트가 1이 나올것이므로 } else { System.out.println("로그인 실패"); } return mav; } }
이렇게 설정을 하고 컨트롤러를 요청하자.
아래와같이 잘 나오는 것을 확인 할 수 있다.
 


좀 긴 포스팅이여서 빠진 부분이 있을 지도 모르겠다.. 궁금은 점은 댓글로 남겨주길..

마지막으로 오늘 최종 테스트가 완료된 프로젝트 파일이다 .war파일로 추출했고
jdbc 설정과 쿼리만 맞게 변경하면 잘 돌아갈 것이다.