Spring Boot에서 JOQ+Fly+MySQL을 가져오는 방법(Kolin의 경우)
앞으로 서버 측 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을 사용할 수 있을 것입니다.또한 환경 변수 준비
.env를 direnv로 읽는다..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입니다.자세한 내용을 더 알고 싶으신 분들은 아래 페이지를 참고하시기 바랍니다.
명령하다
이후 실제 마이그레이션만 수행됩니다.
여기에 자주 사용하는 몇 가지 지령을 소개한다.
$ ./gradlew flywayMigrate // マイグレーションを実行する
$ ./gradlew flywayRepair // スキーマの履歴テーブルを修復する
$ ./gradlew flywayClean // 全テーブルをdropする
기타 정보는 공식 문서를 참고하십시오.잡담
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개 계열로 강제 강등하는 오류를 없애기 위한 것이다.설정 정보
이번에 사용한 설정은 기본적으로 공식의 Example을 사용자 정의하는 것이므로 자세한 내용은 GiitHub을 참고하십시오.
또 JOQ에서 MySQL의 Boolean을 처리할 때는 별도의 설정이 필요하지만, 다른 글에는 설명이 있다.
이용 방법
JOQ는 데이터베이스 상태에 따라 ORM 코드를 생성합니다.
다음 명령을 실행하면
build/generated/source/jooq/main 의 부하들이 Kotlin 코드를 생성합니다.$ ./gradlew generateJooq
코드를 생성하는 사용 방법은 공식 문서를 참고하십시오.기본용법
기본적으로 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 플러그인을 사용했기 때문에 스프링 부트, 케이터 등 프레임에서도 같은 절차로 가져올 수 있다.
Reference
이 문제에 관하여(Spring Boot에서 JOQ+Fly+MySQL을 가져오는 방법(Kolin의 경우)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/yamachoo/articles/spring-jooq-flyway-mysql텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)