MyBatis는 무엇이고, 왜 쓰는 걸까?
최근에 MyBatis를 다시 정리하면서 느낀 건,
이건 ORM이 아니라 **‘SQL을 포기하지 않는 선택지’**라는 거였다.
Java에서 데이터베이스에 접근하는 방식은 크게 보면 세 가지 정도로 나뉜다.
- JDBC
- ORM (JPA, Hibernate 등)
- 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을 더 의식하게 됐다.
'CS > DB' 카테고리의 다른 글
| [DB] JAVA와 데이터베이스(JDBC, ORM,Java SQL 라이브러리,MyBatis) (0) | 2026.02.08 |
|---|---|
| [DB]DB Replication(DB 이중화)설정 - master slave 설정 (0) | 2025.03.16 |
| [DB]데이터 베이스 재해복구(Disaster Recovery, DR) (0) | 2025.03.16 |
| [mariadb] 가상머신으로 db 서버 만들기 (2) | 2024.12.24 |