MyBatis란?

최승혁·2026년 1월 12일
post-thumbnail

MyBatis는 Java에서 SQL을 직접 작성하여 데이터베이스와 연동할 수 있게 해주는 SQL Mapper 프레임워크이다.
ORM(JPA)처럼 객체 중심이 아니라, SQL 중심 개발을 지향한다.

👉 “SQL은 내가 짠다. 대신 Java 객체와의 매핑은 MyBatis가 해준다.”


MyBatis를 사용하는 이유

✅ 장점

  • SQL을 직접 작성 → 쿼리 제어력 최상

  • 기존 DB, 레거시 SQL과 궁합이 좋음

  • 복잡한 JOIN / 서브쿼리 처리에 강함

  • 성능 튜닝이 쉬움

❌ 단점

  • SQL을 직접 관리해야 함

  • 코드량이 JPA보다 많음

  • DB 종속적인 SQL이 될 가능성 있음


MyBatis vs JPA 간단 비교

구분MyBatisJPA
개발 방식SQL 중심객체(Entity) 중심
SQL 작성직접 작성자동 생성
복잡한 쿼리매우 강함상대적으로 불리
러닝 커브낮음높음
실무 사용레거시/운영신규 서비스

MyBatis 전체 구조

Controller
   ↓
Service
   ↓
Mapper Interface (DAO)
   ↓
Mapper XML (SQL)
   ↓
Database (MSSQL)

MyBatis 핵심 구성 요소

1️⃣ Mapper Interface (DAO)

@Mapper
public interface UserMapper {
    int insertUser(UserDTO user);
    UserDTO selectUserById(Long id);
}
  • SQL과 Java를 연결하는 인터페이스
  • 실제 구현체는 MyBatis가 자동 생성

2️⃣ Mapper XML (SQL 작성 공간)

<?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 방지)


3️⃣ DTO (Data Transfer Object)

@Getter
@Setter
public class UserDTO {
    private Long id;
    private String name;
    private String email;
}
  • MyBatis는 Entity 개념이 없음
  • 대신 DTO/VO로 데이터 전달

Spring Boot + MyBatis 설정

application.yml

mybatis:
  mapper-locations: classpath:/mapper/**/*.xml
  type-aliases-package: com.example.domain

MyBatis 동작 흐름 (중요 ⭐)

1️⃣ Controller에서 요청
2️⃣ Service에서 비즈니스 로직 처리
3️⃣ Mapper Interface 호출
4️⃣ Mapper XML의 SQL 실행
5️⃣ 결과를 DTO로 매핑
6️⃣ Service → Controller 반환


MyBatis 파라미터 처리

단일 파라미터

WHERE id = #{id}

객체 파라미터

WHERE name = #{name}
AND email = #{email}

여러 파라미터 (@Param)

UserDTO find(@Param("name") String name,
             @Param("email") String email);
WHERE name = #{name}
AND email = #{email}

동적 SQL (MyBatis의 강력한 기능)

조건에 따라 SQL 변경

<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>

✔ 필요할 때만 조건 추가
✔ 복잡한 검색 조건에 매우 유리


MyBatis에서 insert 결과 확인

int count = userMapper.insertUser(user);

if (count > 0) {
    log.info("저장 성공");
}
  • 반환값 = 영향받은 row 수
  • 저장 성공 여부 판단에 자주 사용

MyBatis는 Repository가 없다?

✔ 맞다.
MyBatis에서는 보통

Mapper = DAO = Repository 역할

즉,
@Repository 대신 @Mapper 를 사용한다.


정리

  • MyBatis는 SQL 중심 데이터 접근 프레임워크

  • JPA보다 자유도와 성능 제어력이 뛰어남

  • 실무, 운영 시스템에서 매우 많이 사용

  • Spring Boot + MSSQL 조합에서 특히 강력

profile
Full-Stack Developer

0개의 댓글