본문 바로가기
Spring

마이바티스(MyBatis)

qbang 2021. 10. 1.

마이바티스

개념

 

The MyBatis Blog

A blog about the the MyBatis data mapper framework.

blog.mybatis.org

마이바티스는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 어노테이션을 사용하여 저장 프로시저나 SQL 문으로 객체들을 연결한다. Mybatis는 JDBC를 이용할 때 1) 1개 클래스에서 반복된 코드가 나타나거나 2) 한 파일 안에 자바와 sql이 섞여있는 단점 등을 개선하기 위한 기능을 제공한다.

 

스프링에서 마이바티스(Mybatis) 사용하기

마이바티스(MyBatis) 마이바티스 개념 The MyBatis Blog A blog about the the MyBatis data mapper framework. blog.mybatis.org 마이바티스는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 어노테이션을..

bangsj1224.tistory.com

마이바티스 사용법은 위 포스팅을 참고하자.

 

특징

  • SQL 실행 결과를 사용자 정의 DTO, Map 등에 매핑할 수 있다.
  • SQL을 소스코드가 아닌 XML로 분리하여 작성할 수 있다.
  • 데이터소스 기능과 트랜잭션 처리 기능을 제공한다.
  • 동적 SQL을 사용함으로써 유지보수성 향상

 

종류

어노테이션 기반

public interface StudentMapper{
    @Select("select * from Student where id = #{id}")
    Student selectStudent(int id);
}
StudentMapper mp = session.getMapper(StudentMapper.class);
Student student = mp.selectStudent(1780);

 

 

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="org.mybatis.example.StudentMapper">
    <select id="selectStudent" parameterType="int" resultType="Student">
        select * from Student where id = #{id}
    </select>
</mapper>

 

Student student = session.selectOne("org.mybatis.example.StudentMapper.selectStudent", 1780);

 

 

 

MyBatis-Spring의 주요 컴포넌트

  • org.mybatis.spring.SqlSessionFactoryBean: SqlSessionFactory를 작성하고 Spring DI 컨테이너에 개체를 저장하는 구성 요소이다.
  • org.mybatis.spring.mapper.MapperFactoryBean: Singleton Mapper 객체를 만들고 Spring DI 컨테이너에 객체를 저장하는 구성 요소이다.
  • org.mybatis.spring.SqlSessionTemplate: SqlSession 인터페이스를 구현하는 싱글톤 버전의 SqlSession 구성 요소이다. 

 

동작 순서

출처: https://juyoungit.tistory.com/303

 

애플리케이션 시작 시 수행되는 프로세스

1. SqlSessionFactoryBean이 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청

2. 애플리케이션이 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession을 가져옴

3.  SqlSessionFactoryBuilder가 Mybatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성한다.(생성된 SqlSessionFactory는 스프링 DI 컨테이너에 의해 저장)

4. MapperFactoryBean이 안전한 SqlSession(SqlSessionTemplate) 및 스레드 안전 매퍼 개체를 생성

 

클라이언트 요청 시 수행되는 프로세스

5. 클라이언트가 애플리케이션에 프로세스를 요청

6. 애플리케이션이 DI 컨테이너에 주입한 mapper 객체의 메서드를 호출

7. mapper 객체가 호출된 메서드에 해당하는 SqlSession 메서드를 호출

8. SqlSession이 SqlSession 메서드를 호출

9. 프록시 사용 및 스레드 안전 SqlSession이 트랜잭션에 할당된 MyBatis 표준 SqlSession을 사용

10. SqlSessionFactory가 Mybatis 표준 SqlSession을 반환

11. Mybatis 표준 SqlSession이 mapping 파일에서 실행할 SQL을 가져와 실행

 

주요 컴포넌트의 스코프(Scope) 와 생명주기(Lifecycle)

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 인스턴스는 SqlSessionFactory클래스를 build한 후 유지할 필요가 없다. 따라서 SqlSessionFactoryBuilder의 가장 좋은 스코프는 지역변수이다. 즉 SqlSessionFactory이후 인스턴스 객체가 메모리에서 해제 될수 있도록 하는것이 제일 좋다.

 

SqlSessionFactory

SqlSessionFactory은 최초 생성된 이후 애플리케이션을 실행하는 동안 계속 존재해야 한다, 즉 애플리케이션 스코프를 가져야 한다. DB에 연결 정보를 가지고 있고 Sql을 실행할 수 있는 SqlSession 객체를  Open할 수 있는 객체이기 때문이다. 

 

SqlSession

SqlSession은 각 스레드마다 인스턴스를 가지는 것이 좋다. SqlSession 인스턴스는 공유되지 않고 스레드에 안전하지 않기 때문에 요청스코프나 메소드 스코프를 가져야 한다. 그리고 SqlSession은 메소드 스코프이기 때문에 항상 Session을 닫아주어야 한다.

 

아이바티스(iBatis)

SQL에 기반한 DB와 자바, 닷넷, 루비 등을 연결시켜 주는 역할을 하는 퍼시스턴스 프레임워크(= 영속성 프레임워크)이다.

  • 퍼시스턴스 프레임워크는 데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들의 집합이다. 종류로는 1) SQL 문장으로 직접 데이터를 다루는 SQL 맵퍼(마이바티스)2) 자바 객체를 통해 간접적으로 데이터를 다루는 객체 관계 맵퍼(하이버네이트)가 있다.

마이바티스와의 차이점은 https://uwostudy.tistory.com/19에서 자세히 확인할 수 있다.

 

참고

 

'Spring' 카테고리의 다른 글

프로토타입 빈(Prototype Bean)  (0) 2021.10.09
JSON vs XML  (0) 2021.10.03
Spring Project 시작하기  (0) 2021.09.24
AOP  (0) 2021.09.24
Spring Framework 개요  (0) 2021.09.24

댓글