mybatis-generator-maven-plugin 소개
MyBatis Generator는 데이터베이스 스키마를 분석하여 엔티티 클래스, 매퍼 인터페이스, XML 매핑 파일 등을 자동으로 만들어주는 Maven 플러그인입니다. 공식 문서에서 상세한 정보를 확인할 수 있습니다. 이 도구를 활용하면 반복적인 CRUD 코드 작성에서 벗어나 비즈니스 로직 개발에 집중할 수 있습니다.
주요 장점은 다음과 같습니다:
- 자동화된 코드 생성: 테이블 구조를 기반으로 일관된 형태의 Java 코드와 XML 파일을 생성
- 개발 생산성 향상: 반복적인 작업을 줄이고 핵심 로직 구현에 집중 가능
- 스키마 동기화: DB 변경 시 코드 재생성으로 불일치 문제 예방
- 유연한 커스터마이징: 다양한 설정 옵션으로 프로젝트 요구사항에 맞게 조정
프로젝트 설정
먼저 pom.xml에 플러그인과 필요한 의존성을 추가합니다.
<?xml version="1.0" encoding="UTF-8"? >
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
<relativePath/>
</parent>
<groupId>com.demo</groupId>
<artifactId>mybatis-generator-sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<mybatis-spring-boot.version>3.0.3</mybatis-spring-boot.version>
<mysql-driver.version>8.0.33</mysql-driver.version>
<generator-plugin.version>1.4.2</generator-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot.version}</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>${mysql-driver.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>${generator-plugin.version}</version>
<configuration>
<configurationFile>
${project.basedir}/src/main/resources/generatorConfig.xml
</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>${mysql-driver.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
의존성 동기화 후 Maven 탭에서 플러그인 목록을 확인합니다.
Generator 설정 파일 작성
src/main/resources 경로에 generatorConfig.xml 파일을 생성합니다.
<?xml version="1.0" encoding="UTF-8"? >
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="defaultContext" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- SQL 예약어 자동 이스케이프 -->
<property name="autoDelimitKeywords" value="true"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 주석 생성 비활성화 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
<!-- 데이터베이스 연결 정보 -->
<jdbcConnection
driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/sample_db?useSSL=false&serverTimezone=Asia/Seoul"
userId="app_user"
password="secure_pass">
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!-- 타입 변환 규칙 -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
<property name="useJSR310Types" value="true"/>
</javaTypeResolver>
<!-- 엔티티 클래스 출력 경로 -->
<javaModelGenerator
targetPackage="com.demo.sample.domain.entity"
targetProject="src/main/java"/>
<!-- XML 매퍼 파일 출력 경로 -->
<sqlMapGenerator
targetPackage="mappers"
targetProject="src/main/resources"/>
<!-- 매퍼 인터페이스 출력 경로 -->
<javaClientGenerator
type="XMLMAPPER"
targetPackage="com.demo.sample.domain.repository"
targetProject="src/main/java"/>
<!-- 대상 테이블 정의 -->
<table tableName="tb_member" domainObjectName="MemberEntity"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false">
<generatedKey column="member_id" sqlStatement="MySql" identity="true"/>
</table>
</context>
</generatorConfiguration>
설정 항목 상세 설명
| 요소 | 설명 |
|---|---|
context |
코드 생성 환경의 전역 설정을 담당. targetRuntime은 MyBatis3 고정, defaultModelType="flat"는 단일 클래스 모델 사용 |
jdbcConnection |
DB 접속 정보. nullCatalogMeansCurrent는 동일 이름 테이블 스키마 충돌 방지 |
javaTypeResolver |
useJSR310Types 설정 시 java.time 패키지의 LocalDateTime 등으로 날짜 타입 매핑 |
table |
enable*ByExample 속성들은 Example 클래스 생성 여부 제어. 불필요 시 false로 메서드 수 감소 |
generatedKey |
자동 증가 키 설정. identity="true"로 지정 시 useGeneratedKeys 자동 적용 |
코드 생성 실행
IDE의 Maven 패널에서 mybatis-generator → generate를 더블 클릭하거나 터미널에서 다음 명령어를 실행합니다:
./mvnw mybatis-generator:generate
빌드 성공 메시지 확인 후 지정한 패키지에 생성된 파일들을 검증합니다.
생성 후 추가 작업
플러그인이 생성한 엔티티 클래스는 Lombok 미적용 상태이므로 수동으로 개선이 필요합니다:
package com.demo.sample.domain.entity;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.time.LocalDateTime;
@Getter
@Setter
@ToString
public class MemberEntity {
private Long memberId;
private String accountName;
private String encryptedPassword;
private String emailAddr;
private LocalDateTime createdAt;
private LocalDateTime modifiedAt;
}
매퍼 인터페이스와 XML 파일은 생성된 그대로 사용하거나, 필요에 따라 ResultMap, SQL 조각 등을 추가로 정의합니다.
주의사항
- 재생성 시
overwrite="true"로 인해 기존 파일이 덮어써지므로, 커스텀 코드는 별도 영역에 분리하거나merge전략 사용 - Spring Boot 3.x는 Jakarta EE 기반으로 전환되었으나, MyBatis Generator는 여전히
java.sql패키지 사용. 생성 후 직접 타입 교체 필요 - 빌드 시 DTD 검증 오류 발생하면 IDE에서 외부 리소스 페치 또는 수동 DTD 다운로드