1. MyBatis 개요 및 기본 구성 요소
MyBatis는 JDBC를 간소화하고 SQL 쿼리와 자바 객체 간의 매핑을 용이하게 해주는 프레임워크입니다. 다음은 MyBatis를 사용하는 간단한 예제입니다.
1.1 JDBC 대신 MyBatis 사용하기
다음은 JDBC를 직접 사용하는 코드의 예시입니다:
Connection conn = DriverManager.getConnection(url, username, password);
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
stmt.setInt(1, userId);
ResultSet rs = stmt.executeQuery();
위 코드를 MyBatis로 변환하면 다음과 같습니다:
SqlSession session = sqlSessionFactory.openSession();
User user = session.selectOne("getUserById", userId);
session.close();
1.2 MyBatis 주요 구성 요소
- XML 설정 파일: MyBatis 전반적인 설정을 정의합니다.
- SqlSessionFactory: SqlSession 인스턴스를 생성합니다.
- SqlSession: 데이터베이스와 상호작용하는 핵심 인터페이스입니다.
- Mapper: SQL 문장을 정의하고 실행하는 인터페이스 또는 XML 파일입니다.
2. Mapper XML 파일 작성법
2.1 간단한 조회 예제
다음은 사용자를 조회하는 간단한 Mapper XML 예제입니다:
<select id="selectUser" resultType="User">
SELECT id, username, email FROM users WHERE id = #{id}
</select>
2.2 삽입 및 업데이트
자동 생성된 키 값을 받기 위해 useGeneratedKeys 속성을 사용할 수 있습니다:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (username, email) VALUES (#{username}, #{email})
</insert>
3. 동적 SQL
조건에 따라 SQL 구문을 동적으로 조정할 수 있습니다. 예를 들어:
<select id="findUsers" resultType="User">
SELECT * FROM users
<where>
<if test="name != null">AND name LIKE '%${name}%'</if>
<if test="age != null">AND age = #{age}</if>
</where>
</select>
4. 고급 기능
4.1 결과 맵핑 resultMap
복잡한 객체 관계를 처리하기 위한 resultMap 예제입니다:
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<association property="profile" javaType="Profile">
<id property="id" column="profile_id"/>
<result property="bio" column="bio"/>
</association>
</resultMap>
4.2 캐싱
MyBatis에서는 쿼리 결과를 캐싱하여 성능을 최적화할 수 있습니다:
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
5. MyBatis Generator
MyBatis Generator(MBG)는 데이터베이스 스키마로부터 자동으로 Mapper와 Entity 클래스를 생성하는 도구입니다. 다음은 MBG 설정 파일의 예제입니다:
<generatorConfiguration>
<context id="default" targetRuntime="MyBatis3">
<jdbcConnection connectionURL="jdbc:mysql://localhost:3306/test"
driverClass="com.mysql.cj.jdbc.Driver"
userId="root"
password="password"/>
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
<table tableName="users"/>
</context>
</generatorConfiguration>
6. 로깅 설정
로그를 통해 쿼리 실행 여부와 캐싱 상태를 확인할 수 있습니다:
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.logger.org.mybatis=DEBUG