JDBC에서 반복되는 “매핑/자원관리”를 줄인다
JDBC로 DAO를 작성할 수는 있다.
그리고 실제로 기본기는 JDBC로 충분히 잡는 게 맞다.
하지만 JDBC DAO를 계속 작성해보면
특정 패턴의 코드가 계속 반복되는 걸 느끼게 된다.
- Connection 얻기
- PreparedStatement 만들기
- 파라미터 setXXX 바인딩
- executeQuery/executeUpdate 호출
- ResultSet에서 꺼내서 VO로 매핑
- 자원 close 처리
이 중에서 특히 반복이 큰 부분이 두 가지다.
- ResultSet → 객체 매핑
- 자원 정리/예외 처리 패턴
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 |