Spring Boot 3.x 환경에서 MyBatis 코드 자동 생성 도구 활용하기

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&amp;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 다운로드

태그: MyBatis Spring Boot 3 maven MySQL Code Generator

6월 8일 02:03에 게시됨