🧾 1. iBatis란?
- Apache 소속에서 시작한 ORM-lite(반쪽 ORM) 프레임워크
- 개발자가 직접 SQL을 작성하고, 그 SQL과 자바 객체를 매핑(mapping) 해주는 방식
- XML 기반 설정
이름 의미: iBatis = “Internet + Abatis” (Abatis는 방어 구조물 → SQL과 Java 사이 방어막이라는 의미)
🔁 2. MyBatis란?
- iBatis의 후속 프로젝트로, iBatis 3.0부터 이름이 MyBatis로 변경됨
- Apache 프로젝트에서 독립되어 Google Code → GitHub로 이동
- XML 설정 + 애노테이션 방식 둘 다 지원
- iBatis보다 더 현대적인 개발 방식과 기능 제공
즉, MyBatis = iBatis의 진화된 버전입니다.
🔍 3. iBatis vs MyBatis 주요 차이점
항목 |
iBatis |
MyBatis |
프로젝트 주체 |
Apache Software Foundation |
독립 커뮤니티 (GitHub 등) |
지원 종료 |
개발 중단됨 |
현재도 활발히 유지보수 중 |
버전 |
iBatis 2.x까지 존재 |
MyBatis 3.x 이상 |
기반 |
XML 기반 |
XML + 애노테이션(Annotation) 지원 |
성능 |
비교적 느림 |
개선됨 |
유연성 |
낮음 |
높은 유연성 및 확장성 |
동적 SQL 지원 |
<isEqual> 등 복잡한 태그 기반 |
if, choose, foreach 등 더 직관적 |
커스터마이징 |
제한적 |
인터셉터, 플러그인 등 확장 가능 |
설정 구조 |
복잡하고 불편함 |
간결해짐 |
Spring 연동 |
불편함 |
Spring Boot 등과 통합 용이 |
📂 4. 예제 코드 비교
✅ iBatis 예제 (기존 방식)
<!-- User.xml -->
<select id="getUser" parameterClass="int" resultClass="User">
SELECT * FROM users WHERE id = #id#
</select>
// Java 코드
User user = (User) sqlMapClient.queryForObject("getUser", 1);
✅ MyBatis 예제 (현대 방식)
<!-- UserMapper.xml -->
<select id="getUser" parameterType="int" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
// 인터페이스 기반
public interface UserMapper {
User getUser(int id);
}
// 호출
User user = sqlSession.getMapper(UserMapper.class).getUser(1);
⚙️ 5. MyBatis의 장점 요약
✅ 유지보수 쉬움
✅ Spring Boot와 통합 용이
✅ 동적 SQL 작성 간편
✅ XML과 Annotation 병행 가능
✅ SQL 중심 개발 스타일 유지 (JPA보다 SQL 직접 제어 가능)
🧠 결론 요약
질문 |
답 |
iBatis는 계속 쓰이나요? |
❌ 아니요, MyBatis로 대체됨 |
MyBatis는 iBatis 호환되나요? |
기본적인 구조는 유사하지만 변경 사항 많아 마이그레이션 필요 |
둘 중 어떤 걸 써야 하나요? |
✅ MyBatis 권장 (더 현대적이고 지원 활발) |
📊 iBatis vs MyBatis 명령어 비교표
기능 |
iBatis (2.x) 명령어 |
MyBatis (3.x 이상) 명령어 |
설명 |
매핑 파일 루트 태그 |
<sqlMap> |
<mapper> |
전체 매핑 파일의 루트 |
쿼리(SELECT) |
<select> |
<select> |
동일하지만 속성명 변경됨 |
INSERT |
<insert> |
<insert> |
거의 동일 |
UPDATE |
<update> |
<update> |
거의 동일 |
DELETE |
<delete> |
<delete> |
거의 동일 |
파라미터 타입 지정 |
parameterClass |
parameterType |
속성 이름이 변경됨 |
결과 타입 지정 |
resultClass |
resultType |
속성 이름이 변경됨 |
동적 SQL 조건 |
<isEqual property="id"> |
<if test="id != null"> |
MyBatis가 훨씬 직관적 |
OR 조건 |
<isNotEmpty> 등 |
<choose>, <when>, <otherwise> |
더 강력한 분기 처리 |
반복 처리 |
<iterate> |
<foreach> |
foreach가 문법적으로 훨씬 유연 |
SQL 조각 추출 |
<sql> + <include> |
동일 (<sql>, <include>) |
재사용 가능한 SQL 정의 |
인터페이스 매핑 |
지원 안 함 |
지원 (Mapper 인터페이스) |
MyBatis는 인터페이스 기반 가능 |
결과 매핑 |
<resultMap> |
<resultMap> |
거의 동일하지만 설정 방식 개선됨 |
설정 파일 루트 |
<sqlMapConfig> |
<configuration> |
전체 설정 파일 루트 태그 |
🔄 주요 변경 포인트 정리
변경 항목 |
iBatis |
MyBatis |
비고 |
파라미터 바인딩 |
#id# |
#{id} 또는 ${id} |
MyBatis는 SQL Injection 방어 기능 향상 |
조건문 태그 |
<isEqual>, <isNotEmpty> |
<if>, <choose> 등 |
MyBatis는 더 직관적인 문법 |
반복문 |
<iterate> |
<foreach> |
foreach는 리스트, 맵 등 유연하게 반복 가능 |
인터페이스 연동 |
❌ |
✅ |
MyBatis는 Mapper 인터페이스 직접 매핑 가능 |
✅ 결론 요약
항목 |
iBatis |
MyBatis |
문법 |
복잡하고 직관성 낮음 |
더 간결하고 명확함 |
확장성 |
낮음 |
높음 |
유지보수 |
어렵고 오래됨 |
최신 기술과 호환 잘됨 |