ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SpringBoot -Jooq 설정 ( Code Generator 설정 )
    Database/Jooq 2020. 5. 29. 14:43
    반응형

    Jooq 을 설정 하여 사용 하는 법을 기록 하려고 한다. 처음에 사용할때는 그렇게 크게 손볼것이 없었지만 여러가지 이유로 요구조건들이 생기면서 세팅해야 할것들이 여러가지로 늘어 났다. 

    일단 jooq 을 사용하려면 라이브러리먼저 추가 해주도록 하자 나는 maven을 쓰고 있으니 pom.xml 에 아래 설정을 추가 한다. 

     <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jooq</artifactId>
            </dependency>
            <dependency>
                <groupId>org.jooq</groupId>
                <artifactId>jooq-meta</artifactId>
            </dependency>
            <dependency>
                <groupId>org.jooq</groupId>
                <artifactId>jooq-codegen</artifactId>
            </dependency>

    다음 해줘야 할것은 간단한(?) yml 에 환경 설정을 해준다. 

    spring:
      jooq:
        sql-dialect: mariadb

    위 설정은 별다른건 아니고 내가 어떤 데이터베이스 종류를 사용할것인지 명시 해주는것이다. jooq 이 여러가지 데이터베이스를 지원하다보니 이런식으로 명시가 가능하다. 

     명시가 다 됬다면 이젠 데이터베이스를 설정을 해줘야 하는데 정확히는 코드 제너레이션 을 해줘야 한다. jooq 은 자바코드로 쿼리를 짤수 있는 DSL 개념의 기능을 제공 하는데  이때 내가 접속할 데이터베이스의 스키마 혹은 스키마의 일부 테이블을 지정해주면 그 스키마/테이블의 정보를 클래스 화 하여 프로젝트에 생성 해줄수 있다. 

     이렇게 할경우 데이터베이스에서 데이터를 조회하거나 입력 수정시 변수 타입이 달라서 에러가 날수 있는 부분을 사전에 코드레벨에서 감지해서 맞춰 줄수 있다. 클래스 생성 설정은 maven 을 이용해 가능하다 jooq 자체가 코드레벨 그리고 빌드레벨에서 오류를 감지할수 있기 때문에 maven 빌드시 손쉽게 확인이 가능하다. 

     <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>
                        <execution>
                            <id>test1</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>generate</goal>
                            </goals>
                            <configuration>
                                <configurationFile>src/main/resources/jooq/config/test1.xml</configurationFile>
                            </configuration>
                        </execution>
                        
                        <execution>
                            <id>test2</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>generate</goal>
                            </goals>
                            <configuration>
                                <configurationFile>src/main/resources/jooq/config/test2.xml</configurationFile>
                            </configuration>
                        </execution>
                        
                    </executions>
                </plugin>
            </plugins>
        </build>

    <execution> 하나가 하나의 데이터베이스 를 의미하는 영역이다. 그리고 <configuration> 영역을 보면 실제 설정 값 자체를 따로 관리 할수 있도록 구성 되있다. 해당 위치에 xml 파일을 넣어두고 데이터베이스 설정을 별도 관리가 가능하다. pom.xml 에 모두 넣어서 사용이 가능하지만 pom.xml 이 길어지기 때문에 가독성 문제로 별도 분리 하였다. 

    여기서 부터가 중요한데 기존에는 그냥 데이터베이스 자체를 하나만 사용 했기 때문에 별다른 설정없이 사용이 가능 했고 pom.xml 에 설정을 두어서 사용하면 됬으나 여러가지 요건이 생기고 특히나 한개 이상의 데이터베이스를 사용해야하고 두 데이터베이스 가 접속하는 방식(?)이 다르다보니 접속 옵션도 별도로 줘야 하다보니 여러가지 설정과 옵션을 해줄 필요가 있었다. 그렇게 진행 하다보니 xml 을 별도 분리 하게 됬고 위와 같이 구성 하였다. 

    설정 파일은 내부를 보면 아래와 같다. 

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.12.0.xsd">
        <!-- JDBC connection parameters -->
        <jdbc>
            <driver>com.mysql.cj.jdbc.Driver</driver>
            <!-- ?serverTimezone=UTC&useSSL=false -->
            <url>jdbc:mysql:주소:포트</url>
            <user>아이디</user>
            <password>비밀번호</password>
            
            <properties>
                <property>
                    <key>useSSL</key>
                    <value>false</value>
                </property>
                <property>
                    <key>verifyServerCertificate</key>
                    <value>false</value>
                </property>
                <property>
                    <key>serverTimezone</key>
                    <value>UTC</value>
                </property>
            </properties>
    
        </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>스키마이름</inputSchema>
                    </schema>
                </schemata>
                <unsignedTypes>false</unsignedTypes>
                <tableValuedFunctions>true</tableValuedFunctions>
            </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>

     

    <jdbc> 영역을 보면 기존에 많이 볼수 있는 기본적인 접속 정보이다. 여기서 명심 해야할것은 이곳에 설정하는 값이 실제 어플리케이션이 데이터베이스 접속하는데 사용하는것이 아니라 단순 빌드시 데이터베이스 정보를 가져오기 위한 접속 정보라는것이다. 실제 접속에 활용 되는 정보는 yml 설정정보에서 조작해야하는걸 잊으면 안된다. 

    <properties> 영역은 우리가 흔히 접속 url 뒤에 & 를 붙여가며 넣어주었던 접속시 옵션들이다. 실제로 이렇게 구현하고나서 url 입력부붙에 & 를 붙여서 제너레이터를 돌렸을경우 정상적으로 적용이 안되는것을 확인했고 제대로 접속이 안되는경우도 확인 했다. 그렇기 때문에 url 은 접속 정보만 넣어주고 모든 옵션을 저런식으로 추가 해주어야 문제가 없다. 

    <generator> 영역은 실제로 스키마/테이블 정보를 불러와서 어느 패키지위치에 클래스들을 생성할지 스키마를 통째로 다가져올지 특정 테이블만 가져올지 등 설정이 가능한 부분이다. 이부분은 아직도 좀 의문이 있는데 스키마에 테이블이 너무 많은경우 빌드에 실패하는 케이스를 확인한 적이 있다. 스키마 하나의 너무 많은 테이블이 존재 한다는건 테이블 설계상의 문제를 의심해봐야 하겠지만 충분히 있을수 있는 케이스이기 때문에 주의 해야 할거 같다. 

    <generate> 는 실제 jooq 에서 사용할수있는 여러가지 옵션들이다. 공식사이트를 좀 뒤져보면 여러가지를 추가해서 사용할수 있고 필요 한것을 확인해서 추가해서 사용하면 될거 같다. 

    아래 코드는 선택지 이지만 해놓는것도 나쁘지 않다고 본다. jooq 에서 쿼리를 실제 실행할때 발생할수 있는 Exception 을 핸들러를 통해 잡아 내는 일종의 exception 처리 클래스이다. 보다 exception 을 잘 처리 하고자 한다면 아래 코드도 설정 해주도록 하자. 

    import org.jooq.ExecuteContext;
    import org.jooq.SQLDialect;
    import org.jooq.impl.DefaultExecuteListener;
    import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator;
    import org.springframework.jdbc.support.SQLExceptionTranslator;
    
    public class ExceptionTranslator extends DefaultExecuteListener {
    
        @Override
        public void exception(ExecuteContext context) {
            SQLDialect dialect = context.configuration().dialect();
            SQLExceptionTranslator translator = new SQLErrorCodeSQLExceptionTranslator(dialect.name());
    
            context.exception(translator.translate("Access database using jOOQ", context.sql(), context.sqlException()));
        }
    }

     

     

    반응형

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

    Jooq- 테이블을 클래스로 생성하기  (0) 2019.12.17
Designed by Tistory.