MyBatis는 객체, 데이터베이스, 그리고 Mapper를 독립적으로 작성하여 DTO에 해당하는 부분과 SQL 실행 결과를 매핑하는 작업을 지원하는 프레임워크이다. 기존에는 DAO에 모든 SQL문이 자바 소스 코드 내에 위치했지만, MyBatis를 통해 SQL은 XML 설정 파일로 분리되어 관리할 수 있다.
이 방식은 SQL 구문을 XML로 관리함으로써 유지보수성을 높인다. 예를 들어, SQL에 변경이 필요할 경우, Java 코드를 수정할 필요 없이 설정 파일만 수정하면 되므로 편리하다. 또한, 매개변수와 리턴 타입을 DTO와 매핑하는 작업도 설정 파일에서 일괄적으로 처리할 수 있어 직관적이고 효율적이다.
아래는 MyBatis의 기본 설정 및 SQL 매핑을 XML 파일로 정의하는 예제이다.
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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="user"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
<?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="selectUser" parameterType="int" resultType="com.example.dto.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
package com.example.dto;
public class User {
private int id;
private String name;
private String email;
// Getters and Setters
}
package com.example.dao;
import org.apache.ibatis.session.SqlSession;
import com.example.dto.User;
import java.util.Optional;
public class UserDAO {
private final SqlSession sqlSession;
public UserDAO(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
public Optional<User> getUserById(int id) {
return Optional.ofNullable(sqlSession.selectOne("com.example.mapper.UserMapper.selectUser", id));
}
}
MyBatis는 SQL을 XML로 분리하여 관리함으로써 코드와 쿼리의 분리가 가능하게 하고, 유지보수를 효율적으로 만든다. 데이터베이스에 대한 쿼리 작업이 많을 때 특히 유용하며, DTO와의 매핑을 설정 파일에서 정의할 수 있어 직관적이다. 이러한 구조는 개발 생산성을 높이고, 코드의 관리와 유지보수를 단순하게 한다.