SQL Mapping 프레임워크로 흔히 분류된다.
개발자들은 JDBC 코드의 복잡하고 지루한 작업을 피하기 위해 사용한다.
<전통적인 JDBC프로그램과 MyBatis의 구조 비교>
전통적인 JDBC프로그램
close()
setXXX()
등Select
경우 ResultSet 직접 처리MyBatis
Connection close()
가능#{prop}
과 같이 속성 지정하여 자동 처리스프링은 다른 프레임워크들과의 연동을 쉽게 하는 추가적인 라이브러리들이 많다. MyBatis 또한 mybatis-spring 이라는 라이브러리를 통해 쉽게 연동이 가능하다.
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
MyBatis의 주요 Component와 동작 과정을 그림으로 표현하면 다음과 같다.
- MyBatis Config 파일을 읽어 SqlSessionFactoryBuilder 객체를 생성한다.
MyBatis Config 파일에는 DB설정 정보, mapper 파일 등록, typeAlias설정 등이 들어있다.- SqlSessionFactoryBuilder 객체를 이용해 SqlSessionFactory 객체를 생성한다.
- SqlSessionFactoryBuilder는 단순히 SqlSessionFactory 객체를 생성해주기 위한 용도다.
- 앱 실행 중(런타임)에 CRUD처리가 들어오면 SqlSessionFactory로 SqlSession 객체를 생성한다.
- SqlSession 객체를 이용해 DB요청을 한 후, 결과값을 받아온다.
먼저 MyBatis Config 파일은 XML
로 작성하고, 다음과 같이 작성할 수 있다.
아래 MyBatis Config XML
파일은 4개의 정보를 설정하고 있다.
<properties>: 프로퍼티 파일을 정의합니다.
<typeAliases>: mapper.xml에서 사용할 alias를 설정합니다. (긴 패키지 경로 대신 짧은 단어 하나로 사용하기 위해)
<environments>: DB 정보를 설정합니다. <property>에 ${driver}로 적은 것은 위 <properties>에서 가져온 내용을 대입한다는 의미입니다.
<mappers>: 어떤 XML 파일이 mapper 파일인지를 설정합니다.
SQLSession은 개발자가 이를 통해 Connection을 생성하거나 원하는 SQL을 전달하고, 결과를 리턴 받는 구조로 작성하게 된다.
<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:Configuraion.xml"/>
</beans:bean>
Mapper을 작성하는 것은 XML
을 이용할 수도 있지만 인터페이스로도 가능하다.
MyBatis가 동작할 때 이 Mapper를 인식할 수 있도록 root-context.xml
에 설정을 해야한다. 가장 간단한 방법은 <mybatis:scan>
태그를 이용하는 것이다.
root-context.xml > Namespaces > mybatis-spring
탭 선택
아래 코드 작성한다.
<mybatis-spring:scan base-package="com.test.mapper"/>
base-package
속성은 지정된 패키지의 모든 MyBatis 관련 어노테이션을 찾아 처리한다.
Mapper 사용 예시
[Configuration.xml]
<?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>
<!-- 자주 사용하는 type 의 별칭을 등록해놓고 Mapper xml 에서 사용할 수 있다. -->
<typeAliases>
<typeAlias type="com.gura.spring.users.dto.UsersDto" alias="usersDto"/>
<typeAlias type="com.gura.spring.file.dto.FileDto" alias="fileDto"/>
<typeAlias type="com.gura.spring.cafe.dto.CafeDto" alias="cafeDto"/>
<typeAlias type="com.gura.spring.cafe.dto.CafeCommentDto" alias="cafeCommentDto"/>
<typeAlias type="com.gura.spring.gallery.dto.GalleryDto" alias="galleryDto"/>
</typeAliases>
<!-- sql 문을 작성한 Mapper xml 문서가 어디에 있는지 목록을 작성해야 한다. -->
<mappers>
<mapper resource="mapper/UsersMapper.xml"/>
<mapper resource="mapper/FileMapper.xml"/>
<mapper resource="mapper/CafeMapper.xml"/>
<mapper resource="mapper/CafeCommentMapper.xml"/>
<mapper resource="mapper/GalleryMapper.xml"/>
</mappers>
</configuration>
[UserMapper.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="users">
<insert id="insert" parameterType="usersDto">
INSERT INTO USER_TB
(ID, PWD, EMAIL, REGDATE)
VALUES (#{id}, #{pwd}, #{email}, SYSDATE)
</insert>
<select id="getData" parameterType="string" resultType="usersDto">
SELECT ID, PWD, EMAIL, PROFILE, REGDATE
FROM USER_TB
WHERE ID = #{id}
</select>
<update id="updatePwd" parameterType="usersDto">
UPDATE USER_TB
SET PWD = #{newPwd}
WHERE ID = #{id}
</update>
<update id="update" parameterType="usersDto">
UPDATE USER_TB
SET EMAIL = #{email}, PROFILE = #{profile}
WHERE ID = #{id}
</update>
<delete id="delete" parameterType="string">
DELETE FROM USER_TB
WHERE ID = #{id}
</delete>
</mapper>