본문 바로가기

Java

데이터베이스 역공학으로 DTO 및 DAO 코드 자동생성 메이븐 플러그인 검토


Maven 플러그인을 통한 코드 자동생성(Code Generator)


DTO 자동생성 플러그인 검토자료 (초안 - 작성중)



#1 첫번째 대상으로 jooq-codegen-maven을 적용

참고자료 https://www.jooq.org/doc/3.0/manual/code-generation/codegen-configuration/


오픈소스와 상용버전으로 나누어져 있는 것으로 보이며, 상용버전에 대한 로그가 비정상 동작중에 출력되어져 최종결과물은 확인하지 못하고 적용대상에서 제외함.


<plugin> <groupid>org.jooq</groupid> <artifactid>jooq-codegen-maven</artifactid> <executions> <execution> <id>reverse-engineer</id> <phase>generate-sources</phase> <goals> <goal>generate</goal> </goals> <configuration> <jdbc> <driver>com.mysql.jdbc.Driver</driver> <url>${jdbc.url}</url> <user>${jdbc.username}</user> <password>${jdbc.password}</password> </jdbc> <generator> <name>org.jooq.codegen.JavaGenerator</name> <database> <name>org.jooq.meta.mysql.MysqlDatabase</name> <includes>.*</includes> <dateastimestamp>true</dateastimestamp> <inputschema>${db.name}</inputschema> </database> <generate> <deprecated>false</deprecated> <instancefields>true</instancefields> <pojos>true</pojos> <records>true</records> </generate> <target> <packagename>${groupId}</packagename> <directory>src/main/java-gen</directory> </target> </generator> </configuration> </execution> </executions> <dependencies> <dependency> <groupid>${jdbc.groupId}</groupid> <artifactid>${jdbc.artifactId}</artifactid> <version>${jdbc.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency> <groupid>org.hibernate</groupid> <artifactid>hibernate-core</artifactid> <version>5.3.7.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager --> <dependency> <groupid>org.hibernate</groupid> <artifactid>hibernate-entitymanager</artifactid> <version>5.3.7.Final</version> </dependency> </dependencies> </plugin>



#2 두번째 대상으로 mybatis에서 제공하는 mybatis-generator-maven-plugin(MBG)


대상 DB에 Schema를 통해 역으로 Java기반 Model, Criteria, Mapper, Sample 클래스를 자동으로 생성해 하며, SQL Mapper 파일 생성도 가능한 것으로 소개되고 있지만 Spring Boot 1.5.17.RELEASE + Mybatis 기반의 Archetype에 적용할 플러그인을 검토중이므로 자바 클래스로 생성되는 Mapper 확인으로 검토 마무리 함


Mybatis 적용시 생성된 코드를 기반으로 CRUD를 구현을 마무리 해도 될만큼 필요한 API를 모두 갖추어 생성되어진다.


코드 자동생성 Maven 명령 : mvn mybatis-generator:generate


pom.xml 설정

   <project ...>
     ...
     <build>
       ...
       <plugins>
        ...
        <plugin>
          <groupId>org.mybatis.generator</groupId>
          <artifactId>mybatis-generator-maven-plugin</artifactId>
          <version>1.3.7</version>
          <executions>
            <execution>
              <id>Generate MyBatis Artifacts</id>
              <goals>
                <goal>generate</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        ...
      </plugins>
      ...
    </build>
    ...
  </project>


DB연동 설정은 별도의 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>
  <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />

  <context id="DB2Tables" targetRuntime="MyBatis3">
    <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
        connectionURL="jdbc:db2:TEST"
        userId="db2admin"
        password="db2admin">
    </jdbcConnection>

    <javaTypeResolver >
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

    <javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>

    <sqlMapGenerator targetPackage="test.xml"  targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

    <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"  targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

    <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
      <property name="useActualColumnNames" value="true"/>
      <generatedKey column="ID" sqlStatement="DB2" identity="true" />
      <columnOverride column="DATE_FIELD" property="startDate" />
      <ignoreColumn column="FRED" />
      <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
    </table>

  </context>
</generatorConfiguration>
pom.xml에서 configurationFile 설정값을 변경하지 않으면 generatorConfig 파일은 아래와 같이 존재해야 한다.
${basedir}/src/main/resources/generatorConfig.xml

위 예시 generatorConfig.xml을 적용하는 DB와 Schema정보를 확인하고 적용하면 된다.



#3 세번째 대상은 hibernate ORM을 적용할때 고려할 수 있는 hibernate3-maven-plugin

참고사이트

https://stackoverflow.com/questions/1900234/maven-java-source-code-generation-for-hibernate



pom.xml 적용방법

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>hibernate3-maven-plugin</artifactId>
    <version>2.2</version>
    <executions>
      <execution>
        <phase>generate-sources</phase>
        <goals>
          <goal>hbm2java</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <components>
        <component>
          <name>hbm2java</name>
          <implementation>configuration</implementation>
          <outputDirectory>target/generated-sources/hibernate3</outputDirectory>
        </component>
      </components>
      <componentProperties>
        <drop>true</drop>
        <jdk5>true</jdk5>
        <configurationfile>/src/main/resources/hibernate.cfg.xml</configurationfile>
      </componentProperties>
    </configuration>
  </plugin> 



hibernate.cfg.xml 예시

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <!-- Database connection settings -->
    <property name="connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
    <property name="connection.url">jdbc:derby://localhost:1527/mydatabase</property>
    <property name="connection.username">app</property>
    <property name="connection.password">app</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.DerbyDialect</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">false</property>

    <!-- Mapping files -->
    <mapping resource="Person.hbm.xml" />
  </session-factory>
</hibernate-configuration>


'Java' 카테고리의 다른 글

Mybatis 자동생성 메이븐 플러그인 mybatis-generator  (0) 2016.01.08