코딩하는 문과생

[Spring] 4. 스프링 기본(3) - DAO에서 MyBatis를 이용해 DB접근 본문

웹 프로그래밍/Spring

[Spring] 4. 스프링 기본(3) - DAO에서 MyBatis를 이용해 DB접근

코딩하는 문과생 2020. 2. 4. 15:48

MyBatis 개요

[root-context.xml 설정]

MyBatis에 관한 내용이 root-context.xml에 들어간다.

root-context를 namespace로 연다.->전체 체크

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xmlns:c="http://www.springframework.org/schema/c"
	xmlns:cache="http://www.springframework.org/schema/cache"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:lang="http://www.springframework.org/schema/lang"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:task="http://www.springframework.org/schema/task"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
		http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.3.xsd
		http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
		
	<!-- 1. DataSource 설정추가하고 JUnit 연결 테스트하기: 드라이버 정보제공 -->
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"></property>
		<property name="username" value="hr"></property>
		<property name="password" value="hr"></property>
	</bean>
		
	<!-- 2. MyBatis 연동을 위한 추가 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       		<property name="dataSource" ref="dataSource" />
    <!-- 3. resource에 mybatis-config.xml 만들고 추가하기: MyBatis환경설정-->
       		<property name="configLocation" value="classpath:mybatis-config.xml" />
	<!-- 4. resource에 mappers 디렉토리를 만들고 추가하기 mybatis: DQM -->
       		<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml" />
   	</bean>	
   	
   	<!-- 6. @repository 에서 의존성 주입을 위한 설정: Connection -->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
	</bean>
	
</beans>

[UserDaoImpl에서 DB connection 체크]

package com.sinc.intern.user.model.sql;

import javax.annotation.Resource;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

//DB와 연동시킨다.
//매개변수가 없어도 되지만, 넣어주는 게 좋다.
@Repository("userD")
public class UserDaoImpl implements UserDao{
	
	@Resource(name="sqlSession")
	private SqlSession session;
	
	@Override
	public Object loginRow(Object obj) {
		System.out.println("user dao loginRow : " + obj);
		System.out.println("user dao conn : " + session);
		return null;
	}
}

[mybatis-config.xml]

src/main/resources내에 MyBatis와 Mapper파일 복붙

<?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>
	
	
	
</configuration>

[testMapper.xml]

src/main/resources내에 MyBatis와 Mapper파일 복붙

<?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.sinc.intern.test">
		
</mapper>  

콘솔 출력

 


[UserDaoImpl]

object를 넣는다. object를 받는다.

//DB와 연동시킨다.
//매개변수가 없어도 되지만, 넣어주는 게 좋다.
@Repository("userD")
public class UserDaoImpl implements UserDao{
	
	@Resource(name="sqlSession")
	private SqlSession session;
	
	public static final String PREFIX = "com.sinc.intern.test";
	
	@Override
	public Object loginRow(Object obj) {
		System.out.println("user dao loginRow : " + obj);
		System.out.println("user dao conn : " + session);
		
		//testMapper.xml의 login에 해당되는 부분을 실행하고 객체를 받는다.
		Object result = session.selectOne(PREFIX+".login", obj) ;
		return null;
	}
}

[mybatis-config.xml - alias 설정]

<?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>
	
	<typeAliases>
		<typeAlias type="com.sinc.intern.user.model.vo.UserDTO" alias="userdto" />
		<typeAlias type="com.sinc.intern.user.model.vo.UserVO" alias="uservo" />
	</typeAliases>
	
</configuration>

[testMapper.xml - sql문 작성]

<?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">
  
<!-- 해당 객체의 set과 get을 이용해 접근한다. -->
<mapper namespace="com.sinc.intern.test">
		<select id="login" parameterType="userdto" resultType="uservo">
			SELECT 	ID, PWD, NAME, POINT, DEPT
			FROM	INTERN_USER_TBL
			WHERE	ID = #{id} AND PWD = #{pwd} 
		</select>
</mapper>  

[UserDaoImpl]

package com.sinc.intern.user.model.sql;

import javax.annotation.Resource;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

//DB와 연동시킨다.
//매개변수가 없어도 되지만, 넣어주는 게 좋다.
@Repository("userD")
public class UserDaoImpl implements UserDao{
	
	@Resource(name="sqlSession")
	private SqlSession session;
	
	public static final String PREFIX = "com.sinc.intern.test";
	
	@Override
	public Object loginRow(Object obj) {
		System.out.println("user dao loginRow : " + obj);
		System.out.println("user dao conn : " + session);
		
		//testMapper.xml의 login에 해당되는 부분을 실행하고 객체를 받는다.
		Object result = session.selectOne(PREFIX+".login", obj) ;
		System.out.println("dao loginRow result : " + result);
		return result;
	}
}

[UserCtrl 반환값 수정]

	@RequestMapping(value="/login.do", method=RequestMethod.POST)
	public String login(UserDTO dto, HttpSession session) { //단순 데이터라면 session이 아닌 Model model을 이용하면 된다.
		System.out.println("user login dto : " + dto);
		Object user = service.login(dto);
		if(user != null) {
			//model.addAttribute("loginSession", user);
			//데이터 유효시간이 request되는 페이지에만 유효하다.
			session.setAttribute("loginUser", user);
		}
		return "redirect:/main.do";
	}