구멍가게 IT 공부방

iBatis 와 MyBatis 의 차이점 본문

DataBase/iBatis & myBatis

iBatis 와 MyBatis 의 차이점

방구석코딩 2020. 7. 7. 23:15

 

🧾 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
문법 복잡하고 직관성 낮음 더 간결하고 명확함
확장성 낮음 높음
유지보수 어렵고 오래됨 최신 기술과 호환 잘됨

'DataBase > iBatis & myBatis' 카테고리의 다른 글

[iBatis] remapResults="true"  (0) 2019.05.03
Comments