[상태 유지와 공통 처리] 4. MyBatis는 무엇을 해결하는가

2026. 3. 30. 13:12·Web/Web Basics

 

JDBC에서 반복되는 “매핑/자원관리”를 줄인다

JDBC로 DAO를 작성할 수는 있다.
그리고 실제로 기본기는 JDBC로 충분히 잡는 게 맞다.

하지만 JDBC DAO를 계속 작성해보면
특정 패턴의 코드가 계속 반복되는 걸 느끼게 된다.

  • Connection 얻기
  • PreparedStatement 만들기
  • 파라미터 setXXX 바인딩
  • executeQuery/executeUpdate 호출
  • ResultSet에서 꺼내서 VO로 매핑
  • 자원 close 처리

이 중에서 특히 반복이 큰 부분이 두 가지다.

  1. ResultSet → 객체 매핑
  2. 자원 정리/예외 처리 패턴

MyBatis는 이 반복을 줄이기 위해 등장한 SQL 매핑 프레임워크이다.

 

 

MyBatis는 “SQL 매핑 프레임워크”이다

MyBatis를 한 문장으로 말하면 이렇다.

SQL 실행 결과를 자바 객체로 매핑해주는 도구

 

즉 “SQL을 없애는 프레임워크”가 아니다.
오히려 SQL을 그대로 쓰면서, 자바 코드의 반복을 줄여준다.

그래서 MyBatis는 이런 상황에서 잘 맞는다.

  • SQL을 직접 통제하고 싶다
  • 복잡한 쿼리를 그대로 쓰고 싶다
  • JDBC 반복 코드를 줄이고 싶다

 

 

MyBatis가 줄여주는 것 1: ResultSet 매핑

JDBC에서는 직접 이런 작업을 한다.

  • rs.getLong("tno")
  • rs.getString("title")
  • new TodoVO(...)

MyBatis는 결과 컬럼과 객체 필드를 매핑해서
이 과정을 상당 부분 자동화한다.

즉 “결과를 객체로 만드는 반복”이 줄어든다.

MyBatis가 줄여주는 것 2: 자원 정리/예외 처리

JDBC에서는 Connection/Statement/ResultSet을 닫아야 한다.
try-with-resources로 깔끔하게 만들 수는 있지만
그래도 반복되는 틀은 남는다.

MyBatis(+스프링 연동)를 쓰면

  • 연결 획득/반납
  • Statement/ResultSet close

같은 자원 관리가 더 자동화된다.

// ================================
// [JDBC DAO에서 반복되는 코드] 자원 얻기/닫기 + ResultSet 매핑
// - MyBatis가 주로 줄여주는 부분이 여기다
// ================================

public class TodoJdbcDao {

    private final DataSource ds;

    public TodoJdbcDao(DataSource ds) {
        this.ds = ds;
    }

    public List<TodoVO> findAll() throws SQLException {

        String sql = "select tno, title, finished from tbl_todo order by tno desc";

        try (Connection conn = ds.getConnection();
             PreparedStatement ps = conn.prepareStatement(sql);
             ResultSet rs = ps.executeQuery()) {

            List<TodoVO> list = new ArrayList<>();

            while (rs.next()) {
                TodoVO vo = new TodoVO(
                        rs.getLong("tno"),
                        rs.getString("title"),
                        rs.getBoolean("finished")
                );
                list.add(vo);
            }
            return list;
        }
    }
}

 

 

Mapper 인터페이스라는 방식이 핵심이다

MyBatis를 쓰면 DAO 구현 클래스를 직접 만들지 않고
Mapper 인터페이스만 정의하는 방식이 가능해진다.

예를 들어 아래처럼 인터페이스만 정의한다.

  • findAll()
  • insert(...)

그리고 MyBatis가 이 인터페이스의 구현체(프록시 객체)를 만들어준다.

즉 개발자는

  • “메서드 시그니처만 정의”하고
  • “SQL 매핑만 연결”해두면
  • 실제 실행은 MyBatis가 대신한다

이게 생산성을 크게 올려준다.

// ================================
// [MyBatis Mapper 인터페이스 예시] (어노테이션 기반)
// - 구현 클래스를 내가 만들지 않는다
// - MyBatis가 프록시 구현체를 만들어준다
// ================================

@Mapper
public interface TodoMapper {

    @Select("select tno, title, finished from tbl_todo order by tno desc")
    List<TodoVO> findAll();

    @Insert("insert into tbl_todo(title, finished) values(#{title}, #{finished})")
    int insert(TodoVO vo);
}

 

SQL은 어디에 두는가: 어노테이션 vs XML

MyBatis는 SQL을 두는 방식이 두 가지가 있다.

1) 어노테이션(@Select, @Insert 등)

  • 간단한 SQL은 빠르게 작성 가능
  • 하지만 SQL이 길어지면 가독성이 떨어진다
  • 변경 시 전체 빌드/컴파일 영향이 있을 수 있다

2) XML 매퍼 파일

  • SQL을 파일로 분리해서 관리하기 좋다
  • SQL이 길거나 복잡할수록 유리하다
  • 실무에서는 XML 방식을 선호하는 경우가 많다

즉 SQL이 커질수록 XML 분리가 더 편해진다.

 

 

핵심 정리

  • MyBatis는 SQL을 없애는 게 아니라, SQL을 “매핑”해주는 프레임워크이다
  • JDBC에서 반복되는 ResultSet 매핑과 자원 관리 코드를 줄여준다
  • Mapper 인터페이스만 정의하고 구현체는 MyBatis가 프록시로 만든다
  • SQL은 어노테이션으로 둘 수도 있고, XML로 분리할 수도 있다

'Web > Web Basics' 카테고리의 다른 글

[스프링과 스프링 MVC] 1. DI와 빈(Bean)  (0) 2026.03.30
[상태 유지와 공통 처리] 5. MyBatis 설정 흐름  (0) 2026.03.30
[상태 유지와 공통 처리] 3. Connection Pool / DataSource / HikariCP  (0) 2026.03.30
[상태 유지와 공통 처리] 2. JDBC란?  (0) 2026.03.30
[데이터 처리와 DB연동] 1. DTO / VO(Entity) / DAO / Service는 왜 나누는가?  (0) 2026.03.30
'Web/Web Basics' 카테고리의 다른 글
  • [스프링과 스프링 MVC] 1. DI와 빈(Bean)
  • [상태 유지와 공통 처리] 5. MyBatis 설정 흐름
  • [상태 유지와 공통 처리] 3. Connection Pool / DataSource / HikariCP
  • [상태 유지와 공통 처리] 2. JDBC란?
sqaxe1
sqaxe1
woojoo-devlog 님의 블로그 입니다.
  • sqaxe1
    Woojoo's Devlog
    sqaxe1
  • 전체
    오늘
    어제
    • 분류 전체보기 (148)
      • Backend (9)
        • Servlet (7)
        • Spring (2)
      • Frontend (1)
      • CS (0)
      • Book (33)
        • 자바 웹 프로그래밍 Next Step (30)
        • 테스트 주도 개발: 고품질 쾌속개발을 위한 TDD.. (1)
        • 성공과 실패를 결정하는 1%의 네트워크 원리 (2)
      • Engineering (0)
        • Testing (0)
      • Infra (6)
        • AWS (6)
      • Java (4)
      • Network (1)
      • 김영한 (28)
        • 자바 입문 (8)
        • 실전 자바 - 기본편 (6)
        • 실전 자바 - 중급편 (10)
        • 실전 자바 - 고급편 (4)
      • Web (39)
        • Web Basics (39)
      • Project (24)
        • NeoSquare (0)
        • Memo Evolution (24)
      • 정보처리기사 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java
    aws
    개발서적
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sqaxe1
[상태 유지와 공통 처리] 4. MyBatis는 무엇을 해결하는가
상단으로

티스토리툴바