ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MyBatis] MyBatis?
    IT/코딩히스토리_BE 2025. 1. 12. 16:20

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

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

    마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해

    XML과 애노테이션을 사용할 수 있다.

    (마이바티스3 문서: https://mybatis.org/mybatis-3/ko/index.html)

     

    위에 설명은 마이바티스3 문서에서 나온 마이바티스에 대한 설명인데 

    한마디로 마이바티스라는 프레임워크를 사용하면 JDBC에서 사용했던 불편함을 개선할 수 있는 것이다.

     

    즉, MyBatis는 자바 기반의 SQL 매퍼 프레임워크로, 개발자가 데이터베이스와 상호작용할 때 SQL을 직접 작성하면서도 번거로운 JDBC 코드(예: Connection, Statement 관리)를 단순화하도록 도와준다.

     

    JAVA로 RDBMS를 연결해서 개발을 하면 JDBC라는 표준 API를 사용할 것이다.

    그런데 이 JDBC로 사용하면 SQL을 실행할때마다 자원을 열고 닫고, SQL 코드가 JAVA코드안에서 작성되거나 

    호출하는 케이스가 늘어날수록 반복되는 코드가 늘어나고 지저분해진다.

     

    마이바티스를 사용하면 SQL문을 XML로 분리할 수 있어 관리 측면에서 더 깔끔하고

    HikariCP같은 커넥션풀 프레임워크와 연동해 SQL 실행시 자원을 열고 닫고하는 것도 해결하여 코드가 간결해지고

    개발도 편하게 할 수 있다.

     

    아래는 JDBC를 사용할때 예제 코드이다. 

    import java.sql.*;
    
    public class JdbcExample {
        public static void main(String[] args) {
            String url = "jdbc:mysql://localhost:3306/testdb";
            String username = "root";
            String password = "password";
    
            Connection connection = null;
            PreparedStatement statement = null;
            ResultSet resultSet = null;
    
            try {
                // 데이터베이스 연결, SQL을 실행하기 위해 이렇게 연결을 직접 해줘야함
                connection = DriverManager.getConnection(url, username, password);
    
                // SQL 작성 및 실행
                String sql = "SELECT id, name FROM users WHERE id = ?";
                statement = connection.prepareStatement(sql);
                statement.setInt(1, 1);
                resultSet = statement.executeQuery();
    
                // 결과 처리, 결과를 이렇게 직접 담아줘야함
                while (resultSet.next()) {
                    int id = resultSet.getInt("id");
                    String name = resultSet.getString("name");
                    System.out.println("ID: " + id + ", Name: " + name);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                // 자원 해제, 실행 후 이렇게 자원을 직접 해제해줘야함 
                try {
                    if (resultSet != null) resultSet.close();
                    if (statement != null) statement.close();
                    if (connection != null) connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

     

    - MyBatis(3.0 이상)를 사용했을때 예제 코드

    <mapper namespace="com.example.mapper.UserMapper">
        <select id="findById" parameterType="int" resultType="com.example.model.User">
            SELECT id, name FROM users WHERE id = #{id}
        </select>
    </mapper>

     

    @Mapper
    public interface UserMapper {
        User findById(int id);
    }

     

    @Service
    public class UserService {
    
        @Autowired
        private UserMapper userMapper;
    
        public User getUserById(int id) {
            return userMapper.findById(id); // 매퍼 호출
        }
    }

     

    SQL, 호출객체, 비지니스 로직 등등을 분리해서 사용하니 더 간결해진 것을 알 수 있다. 

Designed by Tistory.