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.)