개발/Mybatis
Mybatis란?
함수형 인간
2025. 1. 24. 07:20
MyBatis는 SQL 쿼리를 XML 파일이나 어노테이션으로 분리하여 작성하고, 자바 객체와 SQL 쿼리의 결과를 매핑해주는 자바용 퍼시스턴스 프레임워크이다.
MyBatis의 매핑 방식:
ResultMap 미사용 시 (기본 매핑):
- MyBatis는 SQL 쿼리의 결과 집합(ResultSet)의 컬럼 이름과 자바 객체(Result Object)의 필드 이름을 비교한다.
- 기본적으로 대소문자를 구분하지 않고 이름이 같으면 해당 필드에 값을 매핑한다.
- 만약 컬럼명과 필드명이 다른 경우, SQL 쿼리에서 별칭(Alias) 을 사용하여 필드명과 일치시켜 매핑한다.
예시:
Java
public class User {
private int userId; // 컬럼명과 일치 (대소문자 무시)
private String userName; // 컬럼명과 일치 (대소문자 무시)
// getters and setters
}
XML
<select id="getUserById" parameterType="int" resultType="User">
SELECT userid, username
FROM users
WHERE userid = #{userId}
</select>
SQL
-- 컬럼명: userid, username
SELECT userid, username FROM users WHERE userid = #{userId}
ResultMap 사용 시 (명시적 매핑):
- resultMap을 사용하면 컬럼명과 필드명을 명시적으로 매핑할 수 있다.
- 컬럼명과 필드명이 다르거나, typeHandler를 사용해야 하는 경우, 또는 중첩된 객체 매핑 등 복잡한 매핑을 처리할 때 유용하다.
- resultMap 내에서 <result> 태그를 사용하여 컬럼과 필드를 1:1로 매핑.
예시:
Java
public class User {
private int id; // 컬럼명과 다름
private String name; // 컬럼명과 다름
// getters and setters
}
XML
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id" />
<result property="name" column="user_name" />
</resultMap>
<select id="getUserById" parameterType="int" resultMap="userResultMap">
SELECT user_id, user_name
FROM users
WHERE user_id = #{userId}
</select>
SQL
-- 컬럼명: user_id, user_name
SELECT user_id, user_name FROM users WHERE user_id = #{userId}
카멜 케이스(Camel Case) 자동 매핑 (mapUnderscoreToCamelCase):
- MyBatis 설정에서 mapUnderscoreToCamelCase 옵션을 true로 설정하면, 데이터베이스의 언더스코어 표기법(user_name) 을 자바의 카멜 케이스 표기법(userName) 에 자동으로 매핑시켜준다.
예시:
XML
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
매핑 시 주의사항:
- 대소문자 구분: 기본적으로 컬럼명과 필드명을 비교할 때 대소문자를 구분하지 않지만, 데이터베이스나 JDBC 드라이버에 따라 다르게 동작할 수 있으므로 주의해야 한다.
- 타입 불일치: 컬럼 타입과 필드 타입이 호환되지 않으면 TypeException이 발생할 수 있다.
- NULL 값: null 값을 처리하는 방법에 유의해야 합니다. 기본형(primitive type)은 null을 가질 수 없으므로, Integer와 같은 Wrapper 클래스를 사용해야 한다.