Spring Boot에서 JOQ+Fly+MySQL을 가져오는 방법(Kolin의 경우)

스프링부트에서 JOOQ+Fly+MySQL을 가져오는 글은 드물지만, 스스로 학습의 일환으로 가져오는 절차를 확인하고 이해를 깊게 하기 위해 글을 썼다.
앞으로 서버 측 Kotlin을 새로 시작하는 분들에게 참고가 되었으면 좋겠습니다.

전제 조건


보도에 나오지 않은 개발 환경은 다음과 같다.
Gradle:7.3.2
Kotlin:1.5.31
JVM:11.0.14 (Amazon.com Inc. 11.0.14+9-LTS)
Spring Boot:2.6.3

docker로 MySQL 준비


이번에는 손쉽게 준비할 수 있는 docker를 사용해 MySQL을 준비했다.
자기가 준비한 docker-compose.yml을 참고로 위에 실었습니다.
docker-compose.yml
version: "3.8"
services:
  mysql:
    container_name: todo-mysql
    image: mysql:8.0
    restart: always
    ports:
      - ${MYSQL_PORT}:3306
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DB_NAME}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
docker-compose up -d에서 시작하면 MySQL을 사용할 수 있을 것입니다.
또한 환경 변수 준비.envdirenv로 읽는다.
.env(로컬 개발 환경용)
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=password
MYSQL_DB_NAME=example
MYSQL_USER=user
MYSQL_PASSWORD=password
MYSQL_OPTIONS=autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false
MYSQL_URL=jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DB_NAME}?${MYSQL_OPTIONS}

Flyway 플러그인 설치


이번에는 Flyway가 공식적으로 제공하는Gradle 플러그인을 사용합니다.
build.gradle.kts
plugins {
    id("org.flywaydb.flyway") version "8.0.1"
}

dependencies {
    runtimeOnly("mysql:mysql-connector-java")
}

flyway {
    url = System.getenv("MYSQL_URL")
    user = System.getenv("MYSQL_USER")
    password = System.getenv("MYSQL_PASSWORD")
}
이에 따라 Flyway의task는 Gralde의tasks에 추가됐다.

이용 방법


마이그레이션용 SQL 준비


우선 Resources에서 이동할 디렉터리를 준비합니다.
기본 설정db/migration에서 부하가 SQL 파일을 구성하면 됩니다.
resources
└── db
    └── migration
        └── V1.0.0__create_table.sql
참고로 기본적으로 파일 이름은 V<Version>__<Description>.sql입니다.
자세한 내용을 더 알고 싶으신 분들은 아래 페이지를 참고하시기 바랍니다.
https://flywaydb.org/documentation/concepts/migrations.html#naming

명령하다


이후 실제 마이그레이션만 수행됩니다.
여기에 자주 사용하는 몇 가지 지령을 소개한다.
$ ./gradlew flywayMigrate // マイグレーションを実行する

$ ./gradlew flywayRepair // スキーマの履歴テーブルを修復する

$ ./gradlew flywayClean // 全テーブルをdropする
기타 정보는 공식 문서를 참고하십시오.
https://flywaydb.org/documentation/usage/gradle/

잡담


Spring Boot에 익숙한 사람 중에서 가져오기flyway-core를 하면 시작할 때 기본적으로 마이그레이션이 수행됩니다. 좋지 않습니까?아마도 누군가가 이런 의문을 품고 있을 것이다.
이 반응은 당연한 것이다. 나도 처음에 도입flyway-core을 해서 시작할 수 있는지 시험해 보았지만 뒤에 기술한 JOQ 플러그인과의 호환성 때문에 채택을 포기했다.
하지만 Spring Boot에 JOQ 프로세스를 잘 편입할 수 있다면 있을 수 있습니다.
조만간 시간이 있을 때 조사하고 싶어요.

JOQ 플러그인 설정


JOQ는 공식적인 그레이드 플러그인이 없어 공식적으로 소개한 제3자gradle-jooq-plugin를 도입했다.
build.gradle.kts
plugins {
    id("nu.studer.jooq") version "7.1.1"
}

dependencies {
    jooqGenerator("mysql:mysql-connector-java")
    jooqGenerator("jakarta.xml.bind:jakarta.xml.bind-api:3.0.1")
}

jooq {
    configurations {
        create("main") {
            jooqConfiguration.apply {
                jdbc.apply {
                    url = System.getenv("MYSQL_URL")
                    user = System.getenv("MYSQL_USER")
                    password = System.getenv("MYSQL_PASSWORD")
                }
                generator.apply {
                    name = "org.jooq.codegen.KotlinGenerator"
                    database.apply {
                        name = "org.jooq.meta.mysql.MySQLDatabase"
                        inputSchema = System.getenv("MYSQL_DB_NAME")
                        excludes = "flyway_schema_history"
                    }
                    generate.apply {
                        isDeprecated = false
                        isTables = true
                    }
                    target.apply {
                        packageName = "com.example.ktknowledgeTodo.infra.jooq"
                        directory = "${buildDir}/generated/source/jooq/main"
                    }
                }
            }
        }
    }
}
플라이웨이와 마찬가지로 그랄드의 태스크에 generateJooq가 추가됐다.
그러나 Flyway와 달리 기본 설정은 build 또는 test 실행 전에도 generateJooq 실행됩니다.(필요 없는 경우에도 설정을 통해 해제할 수 있습니다.)
그나저나 추가jooqGenerator("jakarta.xml.bind:jakarta.xml.bind-api:3.0.1")는 스프링 붐jakarta.xml.bind-api의 버전을 JOQ의 플러그인 측이 지원하는 3개 계열이 아닌 2개 계열로 강제 강등하는 오류를 없애기 위한 것이다.
https://github.com/etiennestuder/gradle-jooq-plugin/issues/207

설정 정보


이번에 사용한 설정은 기본적으로 공식의 Example을 사용자 정의하는 것이므로 자세한 내용은 GiitHub을 참고하십시오.
https://github.com/etiennestuder/gradle-jooq-plugin#gradle-kotlin-dsl-4
또 JOQ에서 MySQL의 Boolean을 처리할 때는 별도의 설정이 필요하지만, 다른 글에는 설명이 있다.
https://zenn.dev/yamachoo/articles/setup-jooq-mysql-bool

이용 방법


JOQ는 데이터베이스 상태에 따라 ORM 코드를 생성합니다.
다음 명령을 실행하면 build/generated/source/jooq/main 의 부하들이 Kotlin 코드를 생성합니다.
$ ./gradlew generateJooq
코드를 생성하는 사용 방법은 공식 문서를 참고하십시오.
https://www.jooq.org/learn/

기본용법


기본적으로 Flyway에서 데이터베이스 상태를 관리하는 동시에 최신 데이터베이스 상태를 바탕으로 JOQ에서 창고를 실현하는 데 필요한 코드를 생성한다.
JOQ가 생성한 코드를 지트 관리하는 패턴도 조사됐지만, 지트 관리를 하면 "데이터베이스 변경이 강한 JOQ의 장점을 활용하기 어렵다", "팀 개발 시 충돌이 자주 발생한다"등의 의견이 설득력 있게 나왔다.자신의 실현에서 GTI를 관리하지 않는 것을 선택했다.

Tips


데이터베이스를 업데이트한 후 다음 명령을 여러 번 입력할 것 같습니다.
$ ./gradlew flywayMigrate
$ ./gradlew generateJooq
그런데 같은 지령을 두 번씩 내리는 것도 귀찮고 임무명이 무엇보다 길어서 귀찮아요.
따라서 build 등 임무를 수행할 때generateJooq 이전에 임무를 미리 설정하여 집행flywayMigrate하는 것이 편리하다.
아래build.gradle.kts에 기술한 것을 더하면generateJooq 이전에 집행flywayMigrate.
build.gradle.kts
tasks.named("generateJooq") {
    dependsOn(tasks.flywayMigrate)
}
Gradle-m에서 옵션을 사용하면 모든 작업의 실행을 건너뛰고 작업의 일람표를 확인할 수 있습니다.
예를 들어 -m 옵션으로build를 실행하면 generateJooq 이전flywayMigrate을 확인할 수 있습니다.
$ ./gradlew -m build

:flywayMigrate SKIPPED
:generateJooq SKIPPED
:compileKotlin SKIPPED
:compileJava SKIPPED
... // 省略
이렇게 하면 데이터베이스 업데이트를 걱정하지 않고 build 등의 작업을 수행할 수 있습니다!

최후


Spring Boot에서 JOQ+Fly+MySQL을 가져올 수 있습니다.
이번 설치는 JOQ와 플라이웨이의Gradle 플러그인을 사용했기 때문에 스프링 부트, 케이터 등 프레임에서도 같은 절차로 가져올 수 있다.

좋은 웹페이지 즐겨찾기