Mybatis 원리
Mybatis 원리에 대해 설명합니다.
원리
Mybatis의 핵심 원리는 애플리케이션의 비즈니스 로직과 SQL 쿼리분을 분리하는 것입니다. 개발자는 SQL 쿼리를 XML 설정 파일이나 어노테이션에 선언적으로 정의하고, 이 SQL을 호출하기 위한 Mapper Interface를 별도로 생성합니다.
Mapper Interface
Mybatis는 Mapper Interface에 대한 구현 클래스를 자동으로 생성합니다. 이 Interface는 SQL 쿼리를 감추는 역할을 담당하며, 개발자는 이 Interface의 메서드를 호출하는 것만으로 연결된 SQL문을 실행할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
@Mapper
public interface UserMapper {
User selectUserById(int id);
List<User> selectAllUsers();
int insertUser(User user);
int updateUser(User user);
int deleteUser(int id);
}
XML 매핑 파일
SQL 쿼리, 캐시 설정, 결과 매핑 등 DB 관련 설정을 이곳에 작성합니다. 매핑 파일은 각 쿼리문이 고유한 id 를 가지며, id 를 매퍼 인터페이스 이름과 연결하여 동작합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?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.example.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.dto.User">
SELECT id, name, email
FROM users
WHERE id = #{id}
</select>
<select id="selectAllUsers" resultType="com.example.dto.User">
SELECT id, name, email
FROM users
</select>
<insert id="insertUser" parameterType="com.example.dto.User">
INSERT INTO users (name, email)
VALUES (#{name}, #{email})
</insert>
<update id="updateUser" parameterType="com.example.dto.User">
UPDATE users
SET name = #{name}, email = #{email}
WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM users
WHERE id = #{id}
</delete>
</mapper>
Mybatis의 동작은 SqlSessionFactory 와 SqlSession 이라는 핵심 컴포넌트를 기반으로 합니다.
SqlSessionFactory는 애플리케이션 시작 시 한 번만 생성되는 싱글톤 객체이며,SqlSession을 생성하여 역할을 담당합니다.SqlSession은 JDBCConnection과 유사하게 단일 DB 세션을 나타내는 객체로, 매 요청마다 할당하고 사용 후 닫아야 합니다.
Spring과 연동 시에는 MyBatis-Spring 라이브러리를 통해 이과정을 자동화합니다.
SqlSessionFactoryBean는 DataSource(DB 연결정보), XML 매핑 파일, Mybatis 설정파일을 이용해서SqlSessionFactory를 생성합니다.MapperFactoryBean이SqlSessionTemplate사용하여 Mapper Interface에 대한 프록시 객체를 생성합니다. 이 프록시 객체는 Spring DI Container에 싱글톤 빈으로 등록되어 애플리케이션 전반에서 사용됩니다.
Mybatis의 쿼리 실행 과정
- 애플리케이션의 비즈니스 로직 UserService에서 DI된 매퍼 객체의 메서드를 호출합니다.
- Mybatis 프록시는 호출된 메서드에 해당하는
SqlSessionTemplate의 메서드를 호출하고 SQL 실행을 요청합니다. SqlSessionTemplate은 내부적으로 스레드에 안전한SqlSession객체를 생성하여 XML 매핑파일에서 해당 SQL 쿼리를 가져와 실행하고, 결과 값을 자바 객체로 매핑하여 반환합니다.
이러한 구조는 개발자가 DB 스키마와 SQL 쿼리를 먼저 고려한 다음, 이를 기반으로 객체를 생성하는 SQL 우선 사고방식을 유도합니다. 이 방식은 복잡한 쿼리에 대한 세밀한 제어와 성능 튜닝을 가능하게 하는 장점을 제공합니다. 그러나 스키마 변경시 관련 SQL 쿼리를 수동으로 수정해야 하므로 DB에 대한 종속성이 발생한다는 한계도 동시에 지닙니다.
This post is licensed under CC BY 4.0 by the author.
