본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/spring

MyBatis, mybatis 는 무엇인가?

by 미노드 2021. 1. 24.

MyBatis는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다.

MyBatis는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다.

MyBatis는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO(Plain Old Java Object) 를 설정해서 매핑하기 위해 XML과 어노테이션을 사용할 수 있다.

나는 data저장 및 사용을 위한 Persistence 계층을 이용하는 도구로서 사용한다.

같이 이용하는 도구로써 HikariCP라는 것도 있으나 이번 게시에는 mybatis에 대해서만 적어보려한다.

※ 테스트 하기 위해선 DB를 준비할 필요가 있다. 테스트용 데이터베이스를 준비하고 연결까지 완료해야하며, 이에대해선 별도로 다룰 예정이므로 DB연결에 대한 내용은 생략한다.

1. maven 을 이용하여 사용할 계획이므로 maven dependency를 추가한다.

먼저 mybatis, mybatis-spring 두가지를 추가해야한다.
mybatis는 mybatis 고유 영역에 해당하고, mybatis-spring은 mybatis를 spring서 이용하기 위한 호환용 으로 보면된다.
버전은 본인이 원하는데로 변경해도된다.
pom.xml에 추가

1
2
3
4
5
6
7
8
9
10
11
12
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>
 
 

 

2. SQLSessionFactory를 설정한다.

핵심적인 객체인 SQLSession과 SQLSessionFactory 인데, SQLSession이라는 것을 통해 Connection을 생성하거나 원하는 SQL을 전달하고 결과를 리턴받는 구조로 작성하게된다.
SQLSessionFactory는 이름그대로 SQLSession을 만들어내는 존재이므로 SQLSesstionFactory를 root-context에 설정해야한다.

그리고 사용할 mapper가 있는 경로를 mybatis-spring 을 이용하여 패키지 이름을 root-context에 입력한다.
mapper는 SQL과 그에 대한 처리를 지정하는 역할을 한다.
Mybatis-Spring을 이용하는 경우 Mapper를 XML과 인터페이스 또는 인터페이스와 어노테이션의 형태로 작성할 수 있으므로 원하는 방법대로 하면된다.

1
2
3
4
5
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
</bean>
    
<mybatis-spring:scan base-package="com.teck10.mapper"/>
 

 

3. mapper 패키지안에 mapper 인터페이스를 작성하고 테스트 해본다.

간단한 예제로 현재 시간을 구하는 getNow 메소드를 인터페이스에 구현해봤다.

1
2
3
4
5
6
7
8
9
10
11
package com.teck10.mapper;
 
import org.apache.ibatis.annotations.Select;
 
public interface TestMapper {
 
    @Select("select sysdate from dual")
    String getNow();
    
    String getNow2();    
}
 
 

getNow(), getNow2() 2개를 구현했는데, getNow() 상단에 있는 @Select 어노테이션은 mybatis에서 제공하는 어노테이션이다. @Select 어노테이션으로 sql을 등록했다.
후에 getNow()를 선언하면 등록한 sql의 결과가 String 형태로 리턴되는 구조다.
이런 방식으로 sql을 이용하여 원하는 결과를 가져올 수 있다.

getNow2()는 @Select 어노테이션을 사용하지 않고 xml파일을 따로 만들어서 sql문을 입력하여 관리할 수 있다.
xml파일을 만들때 패키지명과 파일명이 인터페이스와 같아야 한다.
즉 같은패키지 안에 있어도되고, 인터페이스는 java, xml은 resource에 있어도 상관없으나
패키지명과 파일명은 같아야한다.

1
2
3
4
5
6
7
<?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.teck10.mapper.TestMapper">
    <select id="getNow2" resultType="string">
    <![CDATA[select sysdate from dual]]>
    </select>
</mapper>
 
 

<![CDATA[쿼리]]> 형식으로 sql문을 입력하면 쿼리 안에 비교할때 쓰는 특수문자 > < 등을 쓸때 문자가 깨지지 않도록 할 수 있으며, 위의 예제처럼 특수문자가 필요없는 단순한 쿼리라면 단순하게 CDATA를 사용하지 않고 아래처럼 사용할 수도 있다.

<select id="getNow2" resultType="string>
select sysdate from dual
</select>

4. 예제로 테스트해서 getNow나 getNow2를 테스트해보면 된다.

 

 

출처 : MyBatis – 마이바티스 3 | 소개