
MyBatis는 Java에서 SQL을 직접 작성하여 데이터베이스와 연동할 수 있게 해주는 SQL Mapper 프레임워크이다.
ORM(JPA)처럼 객체 중심이 아니라, SQL 중심 개발을 지향한다.
👉 “SQL은 내가 짠다. 대신 Java 객체와의 매핑은 MyBatis가 해준다.”
SQL을 직접 작성 → 쿼리 제어력 최상
기존 DB, 레거시 SQL과 궁합이 좋음
복잡한 JOIN / 서브쿼리 처리에 강함
성능 튜닝이 쉬움
SQL을 직접 관리해야 함
코드량이 JPA보다 많음
DB 종속적인 SQL이 될 가능성 있음
| 구분 | MyBatis | JPA |
|---|---|---|
| 개발 방식 | SQL 중심 | 객체(Entity) 중심 |
| SQL 작성 | 직접 작성 | 자동 생성 |
| 복잡한 쿼리 | 매우 강함 | 상대적으로 불리 |
| 러닝 커브 | 낮음 | 높음 |
| 실무 사용 | 레거시/운영 | 신규 서비스 |
Controller
↓
Service
↓
Mapper Interface (DAO)
↓
Mapper XML (SQL)
↓
Database (MSSQL)
@Mapper
public interface UserMapper {
int insertUser(UserDTO user);
UserDTO selectUserById(Long id);
}
<?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">
<insert id="insertUser" parameterType="UserDTO">
INSERT INTO users (name, email)
VALUES (#{name}, #{email})
</insert>
<select id="selectUserById" parameterType="long" resultType="UserDTO">
SELECT *
FROM users
WHERE id = #{id}
</select>
</mapper>
✔ SQL을 XML로 명확하게 분리
✔ #{} → 파라미터 바인딩 (SQL Injection 방지)
@Getter
@Setter
public class UserDTO {
private Long id;
private String name;
private String email;
}
application.yml
mybatis:
mapper-locations: classpath:/mapper/**/*.xml
type-aliases-package: com.example.domain
1️⃣ Controller에서 요청
2️⃣ Service에서 비즈니스 로직 처리
3️⃣ Mapper Interface 호출
4️⃣ Mapper XML의 SQL 실행
5️⃣ 결과를 DTO로 매핑
6️⃣ Service → Controller 반환
WHERE id = #{id}
WHERE name = #{name}
AND email = #{email}
UserDTO find(@Param("name") String name,
@Param("email") String email);
WHERE name = #{name}
AND email = #{email}
<select id="findUser" resultType="UserDTO">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
✔ 필요할 때만 조건 추가
✔ 복잡한 검색 조건에 매우 유리
int count = userMapper.insertUser(user);
if (count > 0) {
log.info("저장 성공");
}
✔ 맞다.
MyBatis에서는 보통
Mapper = DAO = Repository 역할
즉,
@Repository 대신 @Mapper 를 사용한다.
MyBatis는 SQL 중심 데이터 접근 프레임워크
JPA보다 자유도와 성능 제어력이 뛰어남
실무, 운영 시스템에서 매우 많이 사용
Spring Boot + MSSQL 조합에서 특히 강력