Post

[Mybatis] 마이바티스 원리와 사용법

📌 들어가며

이번 글에서는 MyBatis의 원리와 사용법을 정리한다.

Desktop View

MyBatis란? 스프링에서 데이터베이스 연동을 도와주는 프레임워크. JDBC의 중복 코드를 제거하고, SQL을 XML로 분리해 관리한다. 편리하지만 단점이 있어 JPA와 함께 쓰면 좋다.


1. 기존 JDBC의 문제

기존 방식은 하나의 DAO에 연결·SQL·해제가 모두 뒤섞여 있었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
public int writeArticle(BoardDto boardDto) throws SQLException {
    Connection conn = null;
    PreparedStatement pstmt = null;
    try {
        conn = dataSource.getConnection();               // 연결
        StringBuilder sql = new StringBuilder();
        sql.append("insert into board (...) values (?, ?, ?, 0, now())");  // SQL
        pstmt = conn.prepareStatement(sql.toString());
        pstmt.setString(1, boardDto.getUserId());        // 바인딩
        // ...
        return pstmt.executeUpdate();
    } finally {
        dbUtil.close(pstmt, conn);                       // 해제
    }
}

⚠️ 소스코드 안에 SQL이 들어가고, 드라이버 등록부터 연결 해제까지 반복 코드가 매번 필요했다. MyBatis는 이를 인터페이스 + XML로 분리한다.


2. MyBatis 구성 요소

구성 요소역할
Configuration file (XML)연결 대상·매핑 경로 등 설정 (스프링 통합 시 생략 가능)
SqlSessionFactorySqlSession 생성 (스프링이 대신 처리)
SqlSessionSQL 실행·트랜잭션 제어 API (가장 중요)
Mapper interface매핑 XML의 SQL을 호출하는 인터페이스 (구현 자동 생성)
Mapping file (XML)SQL과 O/R 매핑 설정

Mapper 인터페이스 — 메소드 선언만:

1
2
3
4
5
6
@Mapper
public interface BoardMapper {
    void write(BoardDto board);
    List<BoardDto> list();
    BoardDto getBoard(int articleNo);
}

Mapping XML — SQL을 여기에 작성:

1
2
3
4
5
6
7
8
9
10
11
<mapper namespace="com.ssafy.board.model.mapper.BoardMapper">
    <select id="list" resultMap="article">
        select b.article_no, b.user_id, m.user_name, b.subject ...
        from board b, members m where b.user_id = m.user_id
    </select>

    <insert id="write" parameterType="boardDto">
        insert into board(user_id, subject, content, hit, register_time)
        values(#{userId}, #{subject}, #{content}, 0, now())
    </insert>
</mapper>

💡 인터페이스의 메소드 이름(id)과 XML의 SQL이 매핑된다. #{userId}처럼 파라미터를 바인딩하고, resultMap으로 컬럼↔프로퍼티를 매핑한다. 구현체는 MyBatis가 자동 생성한다.


3. DB 접근 순서

Desktop View

1
2
3
4
5
6
7
8
9
[시작 시 1회]
① 앱 → SqlSessionFactory 빌드 요청
② 구성 파일 읽기
③ SqlSessionFactory 생성

[요청마다]
④~⑥ SqlSessionFactory → SqlSession 생성
⑦~⑧ 앱 → Mapper 구현체 → 메소드 호출
⑨~⑩ SqlSession이 XML의 SQL을 가져와 실행

MyBatis-Spring 통합 시에는 SqlSessionFactoryBean, MapperFactoryBean, SqlSessionTemplate스레드 안전한 매퍼를 만들어 DI로 주입한다.

Desktop View


4. MyBatis vs JPA

MyBatis 단점JPA 장점
스키마 변경 시 SQL 직접 수정쿼리 작성 불필요, 코드량↓
반복 쿼리 작업가독성 좋음
DB 종속 쿼리 발생간편한 수정
DB 변경 시 로직 수정캐시로 성능↑

💡 결론: CRUD 같은 단순 코드는 JPA, 복잡한 쿼리는 MyBatis로 사용하면 좋다. 서로의 장단점을 보완한다.


📝 정리

1
2
3
4
5
MyBatis
├─ 개념   SQL을 XML로 분리한 DB 연동 프레임워크
├─ 구성   Mapper 인터페이스 + Mapping XML (id로 매핑)
├─ 순서   SqlSessionFactory → SqlSession → Mapper → SQL 실행
└─ 조합   단순 CRUD는 JPA, 복잡 쿼리는 MyBatis
개념한 줄 정의
MyBatisSQL을 XML로 분리하는 프레임워크
Mapper인터페이스 ↔ XML SQL 매핑
SqlSessionSQL 실행·트랜잭션 API

MyBatis의 핵심은 “SQL을 코드에서 XML로 분리”하는 것이다. JDBC의 반복을 없애주지만 쿼리를 직접 관리해야 하므로, JPA와 역할을 나눠 쓰는 것이 실무의 좋은 전략이다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.