MyBatis 공부 정리

이웅·2026년 9월 6일
post-thumbnail

Spring을 공부하면서 데이터베이스와 연결하는 방법을 배우다가 MyBatis를 알게 되었다.

JDBC를 사용 할 때 직접 처리해야 햇던 여러 작업들을 줄여주고,JAVA 코드와 SQL을 분리해서 관리할 수 있도록 도와주는 프레임워크라는 것을 알게되었다.

이번 글에서는 MyBatis가 무엇인지, Spring에서 MyBatis가 어떤 구조로 사용되는지 정리해 보려고 한다.


1. MyBatis란?

JAVA 애플리케이션에서 데이터베이스를 쉽게 사용할 수 있도록 도와주는 SQL Mapper 프레임 워크이다.

가장 큰 특징은 SQL을 직접 작성하면서도 JDBC에서 반복적으로 작성해야 했던 코드를 줄일 수 이 있다느 것이다.

JDBC를 사용하면 다음과 같은 작업을 직접 처리해야 한다.

  • Connection 생성
  • PreparedStatement 생성
  • SQL 실행
  • ResultSet 처리
  • 예외 처리
  • Connection, Statement 등의 자원 해제

반면 MyBatis를 사용하면 이러한 데이터베이스 연결 및 실행 과정을 프레임워크가 상당한 부분을 처리해 준다.

동시에 개발자는 어떤 SQL을 실행할 것인지와 그 결과를 어떤 객체에 매핑할 것인지에 더 집중할 수 있다.


2. JDBC와 MyBatis 비교

JDBC를 사용했을 때를 예를 들면

Connection conn = null; 
PreparedStatement pstmt = null; 
ResultSet rs = null; 
	try { conn = DriverManager.getConnection(url, username, password); 
    	String sql = "SELECT * FROM member WHERE id = ?"; 
        pstmt = conn.prepareStatement(sql); 
        
        pstmt.setInt(1, id); 
        
        rs = pstmt.executeQuery(); 
        if (rs.next()) {
        	Member member = new Member(); 
            
            member.setId(rs.getInt("id"));
            member.setName(rs.getString("name")); 
            member.setEmail(rs.getString("email")); 
            } 
            
    } catch (SQLException e) { 
    	e.printStackTrace(); 
   } finally {
   // 자원 해제 
   }

SQL 하나를 실행하기 위해 상당히 많은 코드가 필요하다.
MyBatis를 사용하면 이러한 부분을 훨씬 간단하게 만들 수 있다.

<select id="findMember" resultType="Member">
    SELECT *
    FROM member
    WHERE id = #{id}
</select>

그리고 JAVA에서는 Mapper를 통해 호출한다.

Member findMember(int id);

즉, JDBC는 Java 코드에서 데이터베이스 작업을 직접 처리하는 부분이 많고,
MyBatis는 SQL 실행과 객체 매핑을 프레임 워크가 도와준다.
라고 이해 할 수 있다.


3. MyBatis의 핵심은 SQL Mapper.

MyBatis를 이해할 때 가장 중요하다고 생각했던 개념 중 하나가 Mapper 라고 생각했다.

Mapper 는 쉽게 말하면
" 이 Java 메서드가 실행되면 이 SQL을 실행하라." 라고 연결해주는 역할을 한다.

예를 들어 Java에서
Member findMember(int id);
라는 메서드가 있다면 XML Mapper 에서 다음과 같이 연결 할 수 있다.

<select id="findMember" resultType="Member">
    SELECT *
    FROM member
    WHERE id = #{id}
</select>

여기서 id = "findMember"가 Java의 findMember() 메서드와 연결된다.

이렇게 Java 코드와 SQL을 연결해 주는 것이 MyBatis의 핵심적인 역할이라고 이해했다.


4. #{}는 무엇일까?

공부하면서 #{} 부분도 헷갈렸다

SELECT *
FROM member
WHERE id = #{id}

가 있다면 #{id}는 전달받은 파라미터의 값을 의미한다.

Java에서 Member findMember(int id); 라고 호출 하면 MyBatis가 id 값을 SQL 연결해준다.

즉,

Java
↓
findMember(10)
↓
MyBatis
↓
WHERE id = #{id}
↓
id = 10

과 같은 방식으로 동작한다고 이해했다.

또한 #{}는 내부적으로 PreparedStatement 방식으로 값을 전달하기 때문에 SQL Injection 방지에도 도움이 된다.


5. resultType

조회 결과를 Java 객채로 변환할 때 resultType을 사용할 수 있다.

<select id="findMember" resultType="Member">
    SELECT *
    FROM member
    WHERE id = #{id}
</select>

여기서

resultType="Member"

는 조회 결과를 Member 객체로 매핑하겠다는 의미이다.

예를 들면 DB에 id name email
1 홍길동 test@test.com
라는 데이터가 있다고 가정해보면

MyBatis가 조회 결과를 받아서 Member member 객체에 매핑해준다.

즉, JDBC에서 직접 작성했던

member.setId(rs.getInt("id"));
member.setName(rs.getString("name"));
member.setEmail(rs.getString("email"));

같은 작업을 MyBatis가 대신 처리해주는 것이다.


6. Spring에서 MyBatis 사용 구조

Spring 에서 MyBatis를 사용하면 일반적으로 다음과 같은 구조를 구성할 수 있다.

Controller
↓
Service
↓
Mapper
↓
MyBatis
↓
Database

각 계층의 역할을 간단하게 정리하면 다음과 같다


Controller

사용자의 요청을 받는다.
GET/member/1 같은 요청이 들어오면 Controller가 처리한다.


Service

실제 비즈니스 로직을 처리한다.
예를 들어 회원 조회,회원 가입 등의 작업을 담당한다.


Mapper

Service에서 요청한 데이터베이스 작업을 MyBatis와 연결한다
Member findMember(int id);


MyBatis

Mapper와 SQL을 연결하고 SQL을 실행한다,


Database

실제 데이터가 저장되어 있는 곳이다.


7. MyBatis의 장점

1. SQL을 직접 작성할 수 있다.

MyBatis는 SQL을 숨기기보다는 개발자가 직접 SQL을 작성하도록 한다.
따라서 복잡한 SQL을 직접 제어해야 하는 경우 유용하다.

2. JDBC 코드가 줄어든다.

Connection이나 PrepardStatment, ResultSet 등을 직접 관리 하는 코드가 크게 줄어든다.

3. SQL과 Java 코드를 분리할 수 있다.

XML Mapper를 사용하면 Java 코드와 SQL을 분리해서 관리할 수 있다.

Java
→ 비즈니스 로직

XML
→ SQL

처럼 역할을 나눌 수 있다.

4. 객체와 DB 결과를 쉽게 연결할 수 있다.

조회 결과를 JAva 객체로 매핑해주기 때문에 반복적인 setXXX() 코드를 줄일 수 있다.


8. 단점

MyBatis는 SQL을 직접 작성하기 때문에 SQL에 대한 이해가 필요하다.

예를 들어 다음과 같은 SQL을 개발자가 직접 작성해야 한다.

SELECT *
FROM member
WHERE id = #{id}

SQL을 잘 모른다면 MyBatis를 제대로 활용하기 어렵다.

또한 SQL이 Java 코드와 분리되어 있기 때문에 프로젝트가 커질수록 어떤 Mapper에서 어떤
SQL을 사용하는지 관리하는 것도 중요하다.


9. 공부하면서 이해한 핵심

단순히 JDBC 코드를 줄여주는 것이 아니라, Java 객체와 SQL을 연결해주는 SQL Mapper 프레임워크라고 보는 것이 더 정확한 것 같다.

특히 다음 구조를 이해하는 것이 중요하다고 생각한다.

Controller
↓
Service
↓
Mapper Interface
↓
Mapper XML
↓
SQL
↓
Database

그리고 MyBatis가 그 사이에서

Java 객체
↕
SQL
↕
Database

를 연결해주는 역할을 한다.


마무리하며

이번에 MyBatis를 공부하면서 JDBC를 사용할 때 직접 처리해야 했던 작업들이 상당히 많았다는 것을 느꼈다.

특히 Connection, PreparedStatement, ResultSet 등을 직접 관리하는 대신 MyBatis가 이러한 작업을 대신 처리하고, 개발자는 SQL과 객채 간의 매핑에 집중할 수 있다는 점이 가장 큰 특징이라고 생각한다.

profile
안녕하세요 이웅입니다.

0개의 댓글