본문 바로가기
JAVA/iBatis

[iBatis] iBatis란? 동적태그, 사용예제

by wook99 2025. 3. 5.

Java 애플리케이션에서 SQL 쿼리와 객체를 매핑할 때 다양한 ORM이나, 프레임워크를 사용한다.

 

iBatis는 MyBatis의 이전이름이다. SQL 중심의 매핑 프레임워크로,  SQL 쿼리를 직접 작성하고 그 SQL을 자바 객체 간의 매핑을 자동으로 처리하는데 도움을 주고,개발자가 SQL을 완전히 제어하면서도 객체와의 매핑을 자동화하여 코드의 생산성과 유지보수성을 높여준다.

 

iBatis는 ORM의 기능을 제공하지만, Hibernate와 같은 전통적인 ORM 프레임워크와는 조금 다른 접근 방식을 취한다.

그렇다면 iBatis는 ORM이 맞다,아니다 라는 표현들 중 어떤것이 맞을까?


iBatis vs 전통적인 ORM

일단 iBatis가 ORM으로 분류되는 이유는, 객체와 관계형 데이터베이스 간의 매핑을 처리하는 기능을 제공하므로, ORM의 일부 특성을 갖고 있다.
즉, SQL 쿼리의 결과를 자바 객체로 변환하거나, 자바 객체의 데이터를 SQL 쿼리로 변환하는 역할을 한다.

 

그러나 전통적인 ORM과의 차이점이 존재한다.

  • SQL 제어
    • 전통적인 ORM (예: Hibernate)은 객체와 데이터베이스 간의 매핑을 자동화하여,
      객체를 조작하면 해당 객체에 맞는 SQL 쿼리를 자동으로 생성한다.
    • 반면, iBatis는 SQL을 직접 작성하게 하며, 이 SQL을 자바 객체와 매핑한다.
      즉, iBatis에서는 SQL 제어권이 개발자에게 전적으로 주어진다.
  • 매핑 방식
    • 전통적인 ORM은 객체 중심의 매핑을 제공한다.
      객체를 먼저 설계하고, 이 객체가 데이터베이스 테이블에 어떻게 매핑될지를 자동으로 처리한다.
    • iBatis는 SQL 쿼리를 먼저 작성하고, 그 결과를 자바 객체에 매핑한다.
      SQL 중심으로 작동하므로, ORM이라기보다는 SQL 매핑 프레임워크로 보는 시각도 있다.

즉, iBatis는 ORM의 특성을 일부 가진 SQL 매핑 프레임워크라고 할 수 있다. 
iBatis를 ORM이라고 부를 수는 있지만, "SQL 중심의 ORM"으로 보는 것이 더 정확하다.

따라서 "iBatis는 ORM이다" 라는 표현을 받아들일 때는, 전통적인 ORM 프레임워크와의 차이를 염두에 두고 해석하는 것이 적절하다.


iBatis의 특징

 

  • SQL 직접 사용
    • iBatis는 SQL을 직접 작성한다.
      Hibernate와 같은 프레임워크가 SQL을 자동으로 생성하는 것과 달리, iBatis는 SQL을 명시적으로 작성해야 한다.
    • 이로 인해 개발자가 SQL을 보다 세밀하게 제어할 수 있다.
  • 객체 매핑
    • SQL 쿼리의 결과를 자바 객체로 자동 변환해주는 기능을 제공한다.
      예를 들어, SQL 결과에서 나온 행을 객체로 변환하여 사용할 수 있다.
  • XML 기반의 매핑 파일
    • SQL 쿼리와 객체 매핑 정보를 XML 파일에 정의한다.
      이러한 XML 파일에서 매핑을 설정하고, 이 파일을 통해 SQL을 실행하는 방식으로 작동한다.
    • 예: <select>, <insert>, <update>, <delete> 태그를 사용하여 SQL 문을 정의하고, 각 SQL 문을 자바 메서드에 연결한다.
  • SQL의 완전한 제어
    • iBatis는 SQL 쿼리를 개발자가 완전히 제어할 수 있게 해주므로, 복잡한 쿼리나 최적화가 필요한 쿼리를 효율적으로 작성할 수 있다.
  • 다양한 데이터베이스 지원
    • iBatis는 다양한 데이터베이스에서 작동할 수 있도록 지원한다. MySQL, PostgreSQL, Oracle 등 다양한 DBMS에서 사용할 수 있다.
  • Transaction 관리
    • iBatis는 트랜잭션 관리 기능을 제공하여, 데이터베이스 트랜잭션을 안전하게 처리할 수 있다.

Mapping

 

userConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
	<sqlMap resource="com.example.userMapper"/>	<!-- exam.xml의 namespace -->

</sqlMapConfig>

 

user.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="com.example.userMapper">
	    <!-- SQL 쿼리 정의 -->
</sqlMap>

 


Tags

 

기본태그

  • <select>: 데이터를 조회할 때 사용.
  • <insert>: 데이터를 삽입할 때 사용.
  • <update>: 데이터를 수정할 때 사용.
  • <delete>: 데이터를 삭제할 때 사용.
<select id="selectUser" resultClass="User">
    SELECT * FROM users WHERE id = #id#
</select>

 

<insert id="insertUser">
    INSERT INTO users (id, name, email)
    VALUES (#id#, #name#, #email#)
</insert>
<update id="updateUser">
    UPDATE users
    SET name = #name#, email = #email#
    WHERE id = #id#
</update>
<delete id="deleteUser">
    DELETE FROM users WHERE id = #id#
</delete>

 

 

 

동적 태그 (자주 쓰이는)

  • <dynamic>
    • 조건에 따라 SQL의 일부를 동적으로 생성한다.
    • 이 태그는 복잡한 조건에 따라 SQL을 작성할 때 사용된다.
      (단, iBatis에서는 이 태그의 사용을 자주 권장하지 않는다.)
<select id="selectUser">
    SELECT * FROM users
    <dynamic>
        <isNotEmpty property="name">
            WHERE name = #name#
        </isNotEmpty>
        <isNotEmpty property="email">
            AND email = #email#
        </isNotEmpty>
    </dynamic>
</select>

 

users 테이블에서 모든 컬럼을 조회한다. property의 name과 emaiil이  null이 아니거나 ""이 아니면 
WHERE name = #name# AND email = #email# 조건이 붙는다.

 

  • <isEmpty>, <isNotEmpty>
    • 전달된 파라미터가 null이거나 ""일 때, / null이 아니거나 ""이 아닐때 해당 SQL을 포함한다.
    • iBatis에서는 <isEmpty>와 <isNotEmpty>를 함께 사용하여 조건에 맞는 SQL을 동적으로 생성할 수 있다.
<select id="selectUser">
    SELECT * FROM users
    <isEmpty property="name">
        WHERE name IS NULL
    </isEmpty>
</select>

<select id="selectUser">
    SELECT * FROM users
    <isNotEmpty property="name">
        WHERE name = #name#
    </isNotEmpty>
</select>

 

  • <isNull>, <isNotNull> 
    • 전달된 파라미터가 null이면 / null이 아니면  해당 SQL을 포함한다.
<select id="selectUser">
    SELECT * FROM users
    <isNull property="name">
        WHERE name IS NULL
    </isNull>
</select>

<select id="selectUser">
    SELECT * FROM users
    <isNotNull property="name">
        WHERE name IS NOT NULL
    </isNotNull>
</select>

 

  • <equal>, <notEqual>
    • 파라미터가 특정 값과 같을 때 / 같지 않을 때 해당 SQL을 포함한다.
<select id="selectUser">
    SELECT * FROM users
    <equal property="status" compareValue="active">
        WHERE status = 'active'
    </equal>
</select>

<select id="selectUser">
    SELECT * FROM users
    <notEqual property="status" compareValue="active">
        WHERE status != 'active'
    </notEqual>
</select>