ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Jooq- 테이블을 클래스로 생성하기
    Database/Jooq 2019. 12. 17. 08:44
    반응형

    Code Generate 

     

     Jooq 에서 실제 데이터 베이스안에 있는 테이블들을 클래스화 시켜서 사용이 가능하다. 그렇기 때문에 컴파일러 단계 나 IDE 에서 코딩하는 단계에서 컬럼에 맞지 않는 상황이 발생하면 바로 캐치가 가능하다. ORM 스러운 부분이다. 사람마다 Jooq 은 ORM 이라고 할수 있다 없다 라고 하지만 그런걸 다 떠나서 충분히 활용 범위는 넓은것 같다. 

     

    일단 테이블 정보를 불러오려면 Code Generate 를 해야 한다. 그러기 위해선 설정이 필요하다 현재 maven 프로젝트를 이용하기 때문에 pom.xml 을 기본적으로 설정 하면된다.

    <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.jooq</groupId>
                    <artifactId>jooq-codegen-maven</artifactId>
                    <version>${jooq.version}</version>
                    <!-- The plugin should hook into the generate goal -->
                    <executions>
    
                        <!-- case1 코드 제너레이터 -->
                        <execution>
                            <id>case1</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>generate</goal>
                            </goals>
                            <configuration>
                                <configurationFile>src/main/resources/jooq/config/case1.xml</configurationFile>
                            </configuration>
                        </execution>
                        <!-- case2 코드 제너레이터 설정 멀티 스키마 설정 예시 -->
                        <execution>
                            <id>case2</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>generate</goal>
                            </goals>
                            <configuration>
                                <configurationFile>src/main/resources/jooq/config/case2.xml</configurationFile>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>

    이 예제의 핵심은 멀티로 데이터베이스를 연결 할경우에도 지원이 된다는점이다 원리는 간단하다. code generater 가 해당 지정된 데이터베이스에 접속하여 지정된 스키마의 모든 테이블을 클래스화 하여 생성하는것이다. 그러기 위해 준비를 위와 같이 진행 하면 된다. 

     설정이 다됬다면 case 별 xml 을 생성 하면 된다. 지금 내가 사용하는 프로젝트는 기본적으로 resource 에 jooq 이란폴더를 잡고 그안에 config 설정을 데이터베이스 별로 분리 하여 저장하고 있다. 

     

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    
    <configuration>
        <!-- JDBC connection parameters -->
        <jdbc>
            <driver>org.mariadb.jdbc.Driver</driver>
            <url>jdbc:mariadb://xxx.xxx.xxx.xx:3306</url>
            <user>xxxxxx</user>
            <password>1223445435345</password>
        </jdbc>
    
        <!-- Generator parameters -->
        <generator>
            <name>org.jooq.codegen.JavaGenerator</name>
            <strategy>
                <name>org.jooq.codegen.example.JPrefixGeneratorStrategy</name>
            </strategy>
            <database>
                <name>org.jooq.meta.mysql.MySQLDatabase</name>
                <includes>.*</includes>
                <excludes></excludes>
                <!-- In case your database supports catalogs, e.g. SQL Server:
                <inputCatalog>public</inputCatalog>
                  -->
                <schemata>
                    <schema>
                        <inputSchema>test1</inputSchema>
                    </schema>
                    <schema>
                        <inputSchema>test2</inputSchema>
                    </schema>
                </schemata>
                <unsignedTypes>false</unsignedTypes>
            </database>
            <target>
                <packageName>com.test.entity</packageName>
                <directory>target/generated-sources/jooq</directory>
            </target>
            <generate>
                <indexes>true</indexes>
                <relations>true</relations>
                <javaTimeTypes>true</javaTimeTypes>
                <springAnnotations>true</springAnnotations>
                <!--<deprecated>true</deprecated>-->
                <!--<instanceFields>true</instanceFields>-->
                <!--<generatedAnnotation>true</generatedAnnotation>-->
                <!--<records>true</records>-->
                <!--<pojos>true</pojos>-->
                <!--<immutablePojos>false</immutablePojos>-->
                <!--<interfaces>false</interfaces>-->
                <!--<daos>true</daos>-->
                <!--<jpaAnnotations>true</jpaAnnotations>-->
                <!--<validationAnnotations>false</validationAnnotations>-->
                <!--<globalObjectReferences>true</globalObjectReferences>-->
                <!--<fluentSetters>true</fluentSetters>-->
            </generate>
        </generator>
    </configuration>

    간단히 case1 에 대한 xml 하나만 보려고한다. 추가되는 데이터베이스는 똑같은 구성으로 생성해주면된다. 

    여깃 볼것은 기본적으로 데이터베이스의 접속정보를 넣어 줘야 한다는것이고 왠만하면 실제 운영 데이터베이스 정보를 가지고 있는것이 좋다. 왜냐하면 개발하거나 테스트할때 운영 기준으로 해야 코딩시에도 버그가 생길 확률이 적기 때문이다. 운영정보를 가지고 불러도 문제가 없는것은 실제 데이터를 건드는것이 아니라 단순 테이블 구성만 가져오는것이기 때문에 서비스에 큰 영향을 주지 않는다. 

    < schemta> 옵션을 통해서 각각의 스키마들을 지정해줄수 있으면 아무것도 안지정하면 모든 스키마를 다가져오게 된다. 개인적으로는 스키마를 지정해주는것이 좋은거 같다. 

     마지막으로 봐야 할것은 <generate> 부분이다 , 뭔가 굉장히 많다. 일종의 generate 옵션 같은 것들이다. 필요한것들이 있다면 찾아봐서 해당 옵션을 켜주거나 꺼주면 된다. 

     

     Jooq 을 사용하다보면 단순 쿼리를 jdbctemplate 에 담아서 사용도 가능하지만 아무래도 그러면 mybatis 와 별다를게 없어진다. 개인적으로는 이런식으로 테이블을 클래스화해서 코드레벨에서 미리 버그를 감지 할수 있게 하는게 좋지 않나 싶다. 그리고 jooq 을 사용하면서 컬럼명이나 이런것들을 마치 클래스의 메서드 호출하듯이 점하나 찍어서 호출한다는것은 굉장히 편리하다고 생각이 든다. 

    반응형

    'Database > Jooq' 카테고리의 다른 글

    SpringBoot -Jooq 설정 ( Code Generator 설정 )  (0) 2020.05.29
Designed by Tistory.