MyBatis 개요

TopOfTheHead·2026년 4월 17일

MyBatis / JPA

목록 보기
1/10

MyBatis
SQL을 통해 DB 상호작용 시 자동으로 객체매핑하는 SQL Mapper 역할의 프레임워크
▶ 이전 버전은 iBatis라고 한다.

MyBatis를 통해 SQLJAVA 코드와 독립되어 분리되어있으므로, SQL을 따로 관리가능

CRUD 과정IoC를 통해 개발자가 아닌, MyBatis Framework가 수행

단일 책임 원칙에 따라서 DAO 역할만 수행하며, DB Connection사용자가 직접 정의해야한다.

MyBatis는 기본적으로 DBMS에 대해 Auto Commit비활성화된 상태.
SqlSession객체.commit()을 통해 일일이 Commit을 수행

Mybatis 설정

  • SQL Mapper
    SQL을 통한 데이터 조회 시 해당 데이터객체매핑하는 용도의 도구

MyBatis 설정 시 주의사항

  • Mapper.xml 파일resources 이하 디렉토리에서 반드시 매핑되는 Mapper 인터페이스와 동일한 디렉토리명.파일명으로 등록해야한다.
    ex ) src/main/java/mapper/TestMapper.Interface인 경우 src/main/resources/mapper/TestMapper.xml로 설정


MyBatis설정파일은 반드시 <configuration>, <environments>, <environment>, <transactionManager> , <dataSource> 태그를 가져야한다.

。각 태그Java에서 Java Bean으로 가질 수 있다.

  • <configuration>
    Java Bean 생성
Configuration configuration = new Configuration(Environment객체);

Configuration객체.getEnvironment()
MyBatis 전역설정파일<Environment> 태그자바 객체로서 가져오는 메서드

Configuration객체.setMapUnderscoreToCamelCase(Boolean)
JavacamelCase를 자동으로 DBMSsnake_case로 변환하는 메서드

Configuration객체.addMapper("디렉토리" or "디렉토리.인터페이스명")
。참조할 Mapper 인터페이스를 지정하는 메서드
디렉토리 내 여러 Mapper 인터페이스 등록 시 인터페이스들을 저장중인 디렉토리를 설정

<mappers> -> <package> 태그 역할과 유사

  • <environment>
    Java Bean 생성
Environment environment = new Environment(
			"환경ID",
			TransactionFactory객체,
			DataSource객체
		);

Environment객체.getDataSource()
MyBatis 전역설정파일<DataSource> 태그자바 객체로서 가져오는 메서드

  • <dataSource type="POOLED"> :
    <property>를 통해 DB 접속정보를 정의하는 태그
    MyBatis사용자DB Connection을 따로 설정해야하므로, <dataSource>를 통해 DB 접속정보 정의
    type="UNPOOLED" : Connection Pool이 없는 경우 선언

    type="POOLED" : MyBatis에 구현된 Connection Pool을 사용하도록 선언
    POOLED 설정 시 MyBatis는 기본적으로 제공하는 PooledDataSource로 제공

    type="설정클래스명" : 해당 설정 클래스에서 반환하는 DataSource객체Connection Pool로 지정
    HikariCP를 지원하지 않으므로, 다른 방법으로 HikariCP를 사용하도록 직접 설정해야함

    Java Bean 생성
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3304/mybatis_shop";
	private static final String USER = "root";
	private static final String PASSWORD = "wjd747";
PooledDataSource pooledDataSource = new PooledDataSource();
		pooledDataSource.setDriver(DRIVER);
		pooledDataSource.setUrl(URL);
		pooledDataSource.setUsername(USER);
		pooledDataSource.setPassword(PASSWORD);
  • <transactionManager> :
    DB에서 발생하는 트랜잭션IoC 역할로서 관리하는 역할을 수행.
    type="JDBC" : JDBC를 통해 발생하는 트랜잭션을 관리

    Java Bean 생성
JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();
  • <mappers>
    MyBatis 전역설정파일에서 활용할 Mapper를 등록하는 Mapper Registry 역할의 태그
    MyBatis는 기본적으로 어떤 Mapper를 사용할 건지 자동으로 식별하지 못하므로, 특정 Mapper 파일를 사용하도록 등록해야함.

    Mapper를 등록하는 방법

    • <mapper resource="Mapper.xml파일경로"> 태그를 통해 Mapper를 직접 등록
      src/main/resources 기준 절대경로로서 사용할 Mapper 파일경로를 직접 설정
          <mappers>
            <mapper resource="mapper/TestMapper.xml"/>
        </mappers>
    • <package name="디렉토리 경로"> 태그를 통해 인터페이스를 등록
      <package name="인터페이스 디렉토리 경로"> 설정 시 해당 패키지 내 모든 Mapper 인터페이스를 자동으로 검색 및 등록

      src/main/java 기준 절대경로로서 인터페이스가 위치한 패키지 경로를 설정
      ex ) com.uos.mybatis.s1 = src/main/java/com/uos/mybatis/s1
     <mappers>
    <!--        package 태그는 반드시 name 속성을 포함      -->
    <!--        src/main/java를 기준으로 인터페이스가 위치한 패키지명을 입력-->
            <package name = "com.uos.mybatis.s1"/>
        </mappers>

<mapper namespace="그룹명"> or <mapper namespace="패키지명.인터페이스명">
Mapper.xml 파일 내에서 SQL매핑태그들을 묶는 역할을 수행하는 태그
▶ 주로 SQL QueryJava InterfaceMapping하는 역할을 수행

。 내부에 CRUDParameter Binding 기능이 포함된 태그( select / insert / update / delete )를 구현하여 DB Query를 작성

namespace="패키지명.인터페이스명" : src/main/java를 기준으로 절대경로로서 연결할 Mapper 인터페이스를 지정
▶ 지정 시 MyBatisMapper 인터페이스를 자동으로 스캔하여 식별


<mapper> 내 SQL매핑태그 종류

  • <select> : 조회
    SELECT SQL문매핑하는 태그

  • <insert>
    INSERT SQL문매핑하는 태그

  • <update>
    UPDATE SQL문매핑하는 태그

  • <delete>
    DELETE SQL문매핑하는 태그

    SQL매핑태그 속성

    • id="식별자" / id="인터페이스 추상메서드명" :
      。각 SQL Query를 식별하는 식별자 속성
      ▶ 반드시 겹치면 안되고, 유일하게 식별 가능해야한다.

      SqlSession객체.selectOne() 사용 시 namespace명.id명을 통해 식별

      인터페이스 방식 사용 시 id="인터페이스 추상메서드명"으로 지정
      ▶ 설정 시 인터페이스 추상메서드SQL매핑태그는 서로 바인딩되어 연동되므로, 추상메서드 호출 시 SQL매핑태그에 정의된 SQL문이 실행

    • resultType="반환타입" :
      <select> 실행 시 반환 Type을 지정하는 속성

      자바 클래스반환 Type 지정 시 TypeAliasRegistry를 통해 해당 자바 클래스가 저장된 패키지 경로로 설정하여 SQL매핑태그Return Type으로서 정의할 수 있도록 설정

SqlSessionFactory
MyBatisDB 접속정보를 포함한 전체 설정 정보실행 환경을 내부에 포함하고 있는 컨테이너 객체
디자인패턴 : 팩토리 패턴으로 구현되어 주로 SqlSession 객체를 생성하는 용도로 사용

 // 전역설정파일.xml 을 통해 생성 시
 new SqlSessionFactoryBuilder.build(InputStream객체); 
 // 전역설정을 Java Bean에서 수행하여 Configuration 객체를 정의해서 생성 시
 new SqlSessionFactoryBuilder.build(Configuration객체); 

SqlSessionFactoryBuilder디자인패턴 : 빌더 패턴을 통해 구현

  • SqlSessionFactory객체.openSession()
    SqlSession 객체를 생성하는 메서드

    openSession(true) : Auto Commit활성화SqlSession 객체를 생성

  • SqlSessionFactory객체.getConfiguration()
    MyBatis 전역설정파일<Configuration> 태그자바 객체로서 가져오는 메서드

SqlSession
MyBatis에서 DAO 역할을 수행하는 객체
PreparedStatement와 유사

SqlSessionFactory객체.openSession()에 의해 MyBatis 전역설정파일의 설정을 기반으로 생성
openSession(true)를 통해 생성된 경우 Auto Commit활성화

。 내부에 MyBatis 전역설정파일에 포함된 DB 접속정보를 기반으로 자동으로 DB Connection을 생성 및 포함하므로, try ~ with문을 통해 SqlSession 객체를 종료해야함.

Thread Safe 하지 않은 특징이 존재하므로, Thread Pool을 통한 병렬 작업은 가급적 지양하는게 좋다.
SqlSession스레드SqlSession 객체를 단 한개만 생성하여 작업

  • SqlSession객체.getMapper(Mapper인터페이스.class)
    클래스리터럴을 통해 Mapper 인터페이스클래스 타입을 정의한 인터페이스 구현체를 생성
    구현체에 포함된 메타데이터를 이용하여 인터페이스추상 메서드를 사용하도록 설정

    Mapper 인터페이스 구현체인스턴스 메서드 호출 시 Mapper.xml파일에서 바인딩SQL태그SQL문을 자동 실행하도록 설정됨
SqlSession sqlSession = build.openSession();
// Mapper Interface 구현체 생성
TestMapper mapper = sqlSession.getMapper(TestMapper.class); 
// 추상메서드 호출 시 바인딩된 SQL매핑태그를 자동실행 
Integer test = mapper.test(); 
sqlSession.close();
  • SqlSession객체.commit() / SqlSession객체.rollback()
    Commit / Rollback을 수행
    MyBatisAuto Commit이 기본적으로 비활성화되어 있으므로 다음 메서드를 활용

    SqlSessionFactory객체.openSession(true)를 설정 시 Auto Commit활성화 시킬 수 있다.

Mybatis 의존성 정의
build.gradle 설정파일에 정의
Mybatis

  // Source: https://mvnrepository.com/artifact/org.mybatis/mybatis
implementation 'org.mybatis:mybatis:3.5.19'

MyBatis 전역 설정 파일 정의
DBMapping되는 명세를 정의하는 파일
MyBatis 관련 객체 생성 시 해당 파일의 설정을 기반으로 생성

Mybatis 공식문서 참고

src - main - resources 아래 mybatis-config.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>
    <environments default="exp1">
        <environment id="exp1">
            <!--   Transaction Manager   :  IoC 역할 수행  -->
            <transactionManager type="JDBC"/>
            <!--  dataSource  -->
            <dataSource type="POOLED">
                <!--    접속정보 정의   -->
                <property name = "driver" value="com.mysql.cj.jdbc.Driver"/> <!-- 자기 닫힘 태그 -->
                <property name = "url" value="jdbc:mysql://localhost:3304/practice_db"/> <!-- 자기 닫힘 태그 -->
                <property name = "username" value="kf16"/> <!-- 자기 닫힘 태그 -->
                <property name = "password" value="wjd747"/> <!-- 자기 닫힘 태그 -->
            </dataSource>
        </environment>
    </environments>
    <!-- Mapper Repository -->
  	<mappers>
<!--        각 도메인별 TestMapper 데이터를 수동 정의 -->
        <mapper resource="mapper/TestMapper.xml"/>
    </mappers>
</configuration>

MyBatis Mapper 파일 정의
。실제 실행할 SQL 규칙을 작성

  • metadata<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="test">
    <select id="test" resultType="int">
        -- SQL 구문 입력
        SELECT 1
    </select>
</mapper>

<select> 식별 시 test.test로 식별.
sqlSession.selectOne("test.test");

Java 코드 작성
MyBatis 전역설정파일 ( = mybatis-config.xml )의 패키지.파일명를 전달하여 InputStream 생성 -> SqlSessionFactory 객체 생성 -> SqlSession 객체 생성

public class SessionFactory {
	public static void main(String[] args) throws IOException {
        // MyBatis 전역설정 XML파일에 대한 src/main/resources 기준 절대경로의 파일명을 지정
		String xmlFilerDir = "mybatis-config.xml";
        // 전역설정파일을 기반으로 InputStream으로 변환
		InputStream inputStream = Resources.getResourceAsStream(xmlFilerDir);
        // SqlSessionFactory 객체 생성
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // SqlSession 객체 생성 : 내부에 Connection을 포함하므로 반드시 close
		try(
			SqlSession sqlSession = sqlSessionFactory.openSession();
			){
            // 전역설정파일 내 <dataSource> 태그 정보를 자바객체로 가져옴
			DataSource dataSource  = sqlSession.getConfiguration()
				.getEnvironment()
				.getDataSource();
			System.out.println("DataSource Class :" + dataSource.getClass().getName());
            // 전역설정파일의 <mappers>로 등록된 Mapper 파일(mapper/TestMapper.xml)에 정의된 SQL태그를 호출
            // Mapper파일 내 "namespace명.id명"으로 SQL태그를 식별 및 실행
			Integer i = sqlSession.selectOne("test.test");
			System.out.println("result : " + i);
		} catch ( Exception e ) {
			e.printStackTrace();
		}
	}
}

DataSource Class : org.apache.ibatis.datasource.pooled.PooledDataSource 출력
전역설정파일<dataSource type="POOLED">로 설정되어있으므로, MyBatisConnection Pool(= PooledDataSource)를 사용하여 SqlSession 객체를 생성하도록 설정

profile
공부기록 블로그

0개의 댓글