CS/DB

[DB] MyBatis란?(JPA와 비교)

멍쟈뽀쨕 2026. 2. 8. 19:50

MyBatis는 무엇이고, 왜 쓰는 걸까?

최근에 MyBatis를 다시 정리하면서 느낀 건,
이건 ORM이 아니라 **‘SQL을 포기하지 않는 선택지’**라는 거였다.

Java에서 데이터베이스에 접근하는 방식은 크게 보면 세 가지 정도로 나뉜다.

  1. JDBC
  2. ORM (JPA, Hibernate 등)
  3. SQL Mapper (MyBatis)

JDBC는 너무 로우레벨이고, JPA는 매우 많은 걸 대신해준다.
MyBatis는 그 중간 어딘가에 있다.


1. JDBC부터 생각해보면

JDBC로 DB를 다뤄보면 이런 코드가 나온다.

  • Connection 열고
  • PreparedStatement 만들고
  • 파라미터 세팅하고
  • ResultSet 순회하고
  • 객체에 값 매핑하고
  • finally에서 닫고...

기능은 단순한데 코드가 길어진다.
그리고 실수할 여지도 많다.

그래서 등장한 게 ORM이다.


2. 그럼 JPA 쓰면 끝 아닌가?

JPA는 객체 중심으로 설계할 수 있고,
엔티티만 잘 설계하면 기본 CRUD는 거의 자동이다.

문제는 여기서 생긴다.

  • 복잡한 조인
  • 동적 조건 검색
  • 통계성 쿼리
  • 기존 레거시 SQL 유지

이런 상황에서는 오히려 SQL을 내가 직접 제어하고 싶어진다.

그때 선택지가 MyBatis다.


3. MyBatis의 정체성

MyBatis는 ORM이 아니다.
정확히 말하면 SQL Mapper다.

즉,

  • SQL은 내가 직접 작성한다
  • 대신 JDBC 반복 코드는 줄여준다
  • 결과 매핑은 자동으로 도와준다

이 구조가 핵심이다.


4. 기본 구조는 이렇게 동작한다

예를 들어 사용자 조회 쿼리를 만든다고 하면

① Mapper XML

<select id="findUserById" resultType="User">
  SELECT id, name, email
  FROM users
  WHERE id = #{id}
</select>

② Mapper Interface

public interface UserMapper {
    User findUserById(Long id);
}

이 둘을 연결하면
MyBatis가 내부에서 JDBC 작업을 대신 처리해주고
결과를 User 객체로 매핑해준다.

나는 SQL만 신경 쓰면 된다.


5. MyBatis의 장점

1) SQL을 완전히 통제할 수 있다

쿼리 튜닝이 필요하거나
복잡한 조인이 많은 시스템이라면 이게 굉장히 큰 장점이다.

JPA에서 쿼리 튜닝하다가 스트레스 받아본 사람은
이게 왜 좋은지 바로 안다.


2) 동적 SQL이 깔끔하다

MyBatis는 XML 안에서 조건을 제어할 수 있다.

<select id="searchUser" resultType="User">
  SELECT * FROM users
  WHERE 1=1
  <if test="name != null">
    AND name = #{name}
  </if>
</select>

조건이 있을 때만 쿼리가 붙는다.

문자열로 SQL 이어붙이던 시절 생각하면
훨씬 안전하다.


3) 레거시 친화적이다

이미 복잡한 SQL이 존재하는 프로젝트라면
그걸 그대로 활용하면서 Java와 연결하기 좋다.

JPA로 다 뜯어고치는 것보다 현실적일 때가 많다.


6. 단점도 분명하다

솔직히 말하면 단점도 있다.

  • CRUD를 일일이 작성해야 한다
  • 테이블이 많으면 Mapper 파일도 많아진다
  • 객체 중심 설계보다는 SQL 중심 설계가 된다

그래서

  • 도메인 중심 설계
  • DDD 기반 설계
  • 엔티티 그래프 중심 개발

이런 스타일에는 JPA가 더 잘 맞는다.


7. MyBatis vs JPA 정리

  MyBatis JPA
SQL 작성 직접 작성 자동 생성 중심
제어력 매우 높음 제한적
복잡한 쿼리 강함 다소 불편
생산성 중간 높음
객체 중심성 낮음 높음

 

JPA는 객체를 중심으로 세상을 본다.
MyBatis는 SQL을 중심으로 세상을 본다.


8. 언제 MyBatis를 쓰면 좋을까?

  • 통계성/리포트 쿼리가 많을 때
  • 쿼리 튜닝이 중요한 시스템일 때
  • 레거시 SQL이 이미 많을 때
  • DB 설계가 중심인 프로젝트일 때

반대로,

  • 빠르게 CRUD 중심 API를 만들고 싶을 때
  • 객체 설계를 중요하게 생각할 때

그때는 JPA가 더 편하다.


마무리

MyBatis를 공부하면서 느낀 건
이건 “JPA의 대체제”라기보다는
“SQL을 포기하지 않는 선택”이라는 점이다.

결국 어떤 기술이 더 좋다가 아니라
프로젝트의 성격에 따라 선택이 달라진다.

나는 JPA만 쓰다가 MyBatis를 보니까
오히려 SQL을 더 의식하게 됐다.