본문 바로가기

Web/MyBatis

[ MyBatis ] ③ 마이바티스 XML 설정 파일

스프링-마이바티스 연동 관련 XML 파일 설정하기

(1) 마이바티스 관련 스프링 라이브러리

  • mybatis-3.0.5.jar
  • mybatis-spring-1.0.1.jar
  • ojdbc6.jar

 

(2) 스프링에서 사용할 빈을 생성하는데 필요한 XML 파일

  • Web.xml에서 MyBatis 설정파일 등록
  • Web.xml 파일

앞부분에서 context-param에서 action-mybatis.xml 설정파일 저장. 전역적으로 공유되는 루트 스프링 컨테이너의 정의.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets 
		and Filters -->
    <!-- MyBatis Bean 관련 설정파일 등록 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/action-mybatis.xml</param-value>
	</context-param>

	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- 한글 필터 기능. 한글 깨짐 현상 방지 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>
			org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<!-- CharacterEncodingFilter() -->
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern><!-- 모든 경로 설정 -->
	</filter-mapping>


	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

</web-app>

 

  • Context 부연설명

# contextConfigLocation 자세히 알기

Spring에 대해 정리해보자면 스프링은 WAR 독립 웹 모듈(애플리케이션)으로 주로 개발된다. 서블릿 컨테이너에 올라가는 웹 애플리케이션이다.
독립 웹 모듈로 만들어진 하나의 스프링 애플리케이션에 애플리케이션 컨텍스트는 몇 개가, 어떻게 만들어질까? 스프링을 제대로 공부했다면 두개가 만들어지는 것을 알 수 있댜.
하나는 ContextLoaderListener에 의해 만들어지는 Root WebApplicationContext이고, 다른 하나는 DispatcherServlet에 의해서 만들어지는 WebApplicationContext이다. 전자는 보통 서비스 계층과 DAO를 포함한 (웹 환경에 독립적인) 빈 들을 담아두고, 후자는 DispatcherServlet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈들을  빈을 등록하는 데 사용한다. 그리고 이둘은 Parent-Child Application Context 관계로 맺어진다. 따라서 ContextLoaderListener로 만들어지는 컨텍스트를 Root WAC라고 부르는 것이다.
그런데 Root WAC는 사실 없어도 된다. 당연히 스프링 앱에는 Root WAS를 등록하는 ContextLoaderListener가 필요한 것 같지만 실제론 강제되지 않는다. 대신 서블릿 레벨의 WAC에 웹용 빈들은 물론이고 서비스, DAO 계층의 빈들도 모두 넣으면 된다. 실제로 여러 개의 DispatcherServlet이 만들어질 것이 아니라면 Root WAC를 따로 등록하나 아니나 그게 그거다.
DispatcherServlet 단위의 WAC는 보통 서블릿이름-servlet.xml이라는 이름규칙을 가지고 설정파일을 찾는다. 하지만 이는 얼마든지 바꿀 수 있다. 서블릿 이름과 상관없이 직접 지정한 여러 개의 설정파일을 읽도록 만들어도 그만이다.
[출저] InsideSpring (3) 스프링 밖에서 WebApplicationContext에 접근하기

 

  • action-mybatis.xml 과 jdbc.properties 파일

* action-mybatis에서는 데이터베이스 연동 시 반환되는 값을 저장할 빈이나 트랜잭션, 데이터 소스 등 마이바티스 관련 정보를 설정합니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

	<bean id="propertyPlaceholderConfigurer"
	class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<property name="locations">
	<value>/WEB-INF/config/jdbc/jdbc.properties</value>
	</property>
	</bean>
	
 	<bean id="dataSource"
		class="org.apache.ibatis.datasource.pooled.PooledDataSource">
		<property name="driver" value="${jdbc.driverClassName}" />
		<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="configLocation"
			           value="classpath:mybatis/model/modelConfig.xml" />
		<property name="mapperLocations" 
		             value="classpath:mybatis/mappers/*.xml" />
	</bean>

	<bean id="sqlSession"
		class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
	</bean>


	<!-- Member DAO는 개발자가 만든 클래스이므로 XML에서 설정하지 않고 자바코드에서 애너테이션으로 설정
	<bean id="memberDAO"
		class="com.spring.member.dao.MemberDAOImpl">
		<property name="sqlSession" ref="sqlSession"></property>
	</bean> -->

</beans>

 

Beans Graph

* jdbc.properties 파일

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:XE
jdbc.username=scott
jdbc.password=tiger

 

  • class.xml AND modelConfig.xml

action-mybatis.xml 에서는 sqlSessionFactory와 sqlSession, dataSource 객체를 xml에 기술하여 미리 생성(컨테이너에 등록)합니다. 

(1) dataSource에는 DB연결정보가 담겨있고, 

(2) sqlSessionFacory 클래스는 sqlSession을 만드는 역할을 하며, 

(3) SqlSession 클래스는 Sql문을 실제 호출해주는 역할을 한니다. SqlSessionFactory 클래스의 빈 생성만 따로 보면 dataSource객체를 생성하고, modelConfig와 mapper 위치를 지정해 주는 것을 볼 수 있습니다.

 	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation"
			           value="classpath:mybatis/model/modelConfig.xml" />
		<property name="mapperLocations" 
		             value="classpath:mybatis/mappers/*.xml" />
	</bean>

 

mybatis 패키지

위의 패키지를 생성하여 모델과 sql을 기술할 class.xml과 모델들을 한꺼번에 쉽게(alias) 관리할 modelConfig.xml  파일을 생성합니다.

 

  • class.xml 예제

member.xml 파일을 살펴보면 아래와 같습니다. <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="mapper.member">

<!-- List<MemberVO> -->
<resultMap type="memberVO" id="memResult">
<result property="id" column="id"/>
<result property="pwd" column="pwd"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
<result property="joinDate" column="joinDate"/>
</resultMap>

<!-- 여러건의 정보 resultMapt -->
<select id="listAllMembers" resultMap="memResult">
   select * from t_member order by joinDate desc
</select>
<!-- 한건 정보 resultType -->
<select id="selectMemberInfo" parameterType="String" resultType="memberVO">
   select * from t_member where id=#{id}
</select>

<update id="updateMemberInfo" parameterType="memberVO">
  update t_member
       set pwd=#{pwd},
            name=#{name},
            email=#{email}
  where id=#{id}
</update>

<insert id="insertMember" parameterType="memberVO">
   insert into t_member(id,pwd,name,email)
   values(#{id},#{pwd},#{name},#{email})
</insert>


<select id="selectMemberDBPwd" parameterType="memberVO" resultType="String">
     select pwd from t_member where id=#{id} and pwd=#{pwd}
</select>

<delete id="deleteMember" parameterType="String">
   delete t_member where id=#{id}
</delete>

<select id="selectMemberInfoBymemberVO" 
            parameterType="memberVO" resultType="memberVO">
  select * from t_member where id=#{id} and pwd=#{pwd}
</select>
</mapper>

 

  • modelConfig.xml 예제

아래의 파일은 modelConfig.xml 파일입니다. modelConfig 파일에서는 <typeAliases> 태그를 이용하여 긴 클래스명을 간략하게 사용할 수 있도록 합니다. 또한 모델을 등록함으로써 모델들을 관리하는 역할도 할 수 있습니다.

<?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.spring.pro27.member.vo.MemberVO"  alias="memberVO" />
	</typeAliases>
</configuration>

 

References

  1. 자바 웹을 다루는 기술

'Web > MyBatis' 카테고리의 다른 글

[ MyBatis ] MyBatis Framework란?  (0) 2022.07.05
[ MyBatis ] ② 마이바티스의 기능과 SqlSession 클래스  (0) 2019.08.12