generate dao 를 통한 삽입 시 pk auto-increment 가 적용되지 않습니다
Kotlin, Groovy gradle, PostrgreSQL 기반으로 프로젝트 세팅이 되어 있습니다
@Repository
class ActorRepository(
private val dsl: DSLContext,
configuration: Configuration
) {
private val actorDao = ActorDao(configuration)
companion object {
private val ACTOR = JActor.ACTOR
}
fun save(actor: Actor): Unit = actorDao.insert(actor)
}이러한 방식으로 Repository 가 구현되어 있을 때,
@SpringBootTest
class ActorRepositoryTest(
private val actorRepository: ActorRepository,
): StringSpec({
"insert test" {
val actor = Actor().apply {
firstName = "John"
lastName = "Doe"
}
println("Actor before insert: $actor")
val insertedActor = actorRepository.save(actor)
}
}) {
override fun extensions() = listOf(SpringExtension)
}


위 쿼리가 실행됩니다
제가 예상했던 insert into "actor" ("first_name", "last_name") values(?, ?) 과는 다르게 id 값이 0으로 고정되어 생성되더라구요
generate dao 를 생성하는 방법이 잘못된 걸까요?
답변 1
2
이강현님 안녕하세요. 저도 궁금해서 로컬에서 코틀린으로 테스트해봤는데요.
코틀린의 경우, 로그에서만 auto increment 컬럼이 0으로 찍히고 정상적으로 동작하는것으로 보입니다. (신기하네요..?)

참고로 kotlin으로 jOOQ를 사용하는 경우
코틀린 전용 generator를 사용하셔야합니다.
아래 링크 참고 부탁드립니다.
https://www.jooq.org/doc/latest/manual/code-generation/codegen-output-languages/kotlingenerator/
아래는 제가 테스트했을때 사용한 build.gradle 설정입니다.
('섹션 5. jOOQ 고급 - 다양한 방식으로 jOOQ DSL 만들기'에 있는 testcontainer + flyway 설정을 변형해서 사용했습니다.)
import org.jooq.meta.jaxb.*
buildscript {
ext {
jooqVersion = '3.19.5'
}
}
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.3'
id 'io.spring.dependency-management' version '1.1.4'
id 'dev.monosoul.jooq-docker' version '6.0.14'
id "org.jetbrains.kotlin.jvm" version "1.9.24"
id "org.jetbrains.kotlin.plugin.spring" version "1.9.24"
}
group = 'org.sight'
version = '0.0.1-SNAPSHOT'
java {
}
repositories {
mavenCentral()
}
sourceSets {
main {
java {
srcDirs = ["src/main/java", "src/generated"]
}
}
}
jooq {
version = "${jooqVersion}"
withContainer {
image {
name = "mysql:8.0.29"
envVars = [
MYSQL_ROOT_PASSWORD: "passwd",
MYSQL_DATABASE : "sakila"
]
}
db {
username = "root"
password = "passwd"
name = "sakila"
port = 3306
jdbc {
schema = "jdbc:mysql"
driverClassName = "com.mysql.cj.jdbc.Driver"
}
}
}
}
tasks {
generateJooqClasses {
schemas.set(["sakila"])
outputDirectory.set(project.layout.projectDirectory.dir("src/generated"))
includeFlywayTable.set(false)
usingJavaConfig {
withName('org.jooq.codegen.KotlinGenerator')
generate = new Generate()
.withJavaTimeTypes(true)
.withDeprecated(false)
.withDaos(true)
.withFluentSetters(true)
.withRecords(true)
.withKotlinNotNullPojoAttributes(true) // NOT NULL 컬럼은 Kotlin의 Non-Null 타입으로 생성 (PK 제외)
.withKotlinNotNullRecordAttributes(true) // NOT NULL 컬럼은 Kotlin의 Non-Null 타입으로 생성 (PK 제외)
withStrategy(
new Strategy().withName("jooq.custom.generator.JPrefixGeneratorStrategy")
)
database.withForcedTypes(
new ForcedType()
.withUserType("java.lang.Long")
.withTypes("int unsigned"),
new ForcedType()
.withUserType("java.lang.Integer")
.withTypes("tinyint unsigned"),
new ForcedType()
.withUserType("java.lang.Integer")
.withTypes("smallint unsigned")
)
}
}
}
dependencies {
implementation "org.jooq:jooq:${jooqVersion}"
implementation 'org.springframework.boot:spring-boot-starter'
implementation('org.springframework.boot:spring-boot-starter-jooq') {
exclude group: 'org.jooq'
}
runtimeOnly 'com.mysql:mysql-connector-j'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
jooqCodegen project(':jooq-custom')
jooqCodegen "org.jooq:jooq:${jooqVersion}"
jooqCodegen "org.jooq:jooq-meta:${jooqVersion}"
jooqCodegen "org.jooq:jooq-codegen:${jooqVersion}"
jooqCodegen 'org.flywaydb:flyway-core:10.8.1'
jooqCodegen 'org.flywaydb:flyway-mysql:10.8.1'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}
tasks.named('test') {
useJUnitPlatform()
}
kotlin {
jvmToolchain(17)
}
안녕하세요 FetchGroups에서 Multiset방식 사용하면 어떤가 해서 물어봅니다
0
60
1
monosoul jooq plugin-docker registry 변경
1
101
3
질문) jOOQ 프로젝트에서 CI/CD 자동화 문의
1
176
3
jooq+flyway에서 질문드립니다
0
249
2
안녕하세요 생성일,생성자,수정일,수정자는 자동으로 해주는 기능이 있을까요?
0
209
2
[사례] Maven에서 TestContainers 플러그인 적용시 예외발생
0
143
0
Routines 관련 질문
1
159
2
JOOQ 환경설정 중에 db 패스워드 관련 질문입니다.
1
173
1
Sakila DB 도커 컴포즈 구성 시 팁
1
152
1
DB 벤더별 내장함수에 대한 방언 지원 듣고 질문드려요
1
176
1
인텔리제이 테마 질문
2
426
3
kotlin jOOQ , 컴파일시 힙메모리 부족
0
524
2
pojo 에 setter 가 없는 경우가 있을까요?
1
189
1
FilmWithActor로 fetch 시 select와 생성자의 매개변수 순서가 다를 경우 map이 정상적으로 이루어 지지않는 케이스
1
228
1
from절 subquery table filed nullable 처리
1
221
1
kotlin mapping error
0
517
4
db column은 not null로 되어 있는데 kotlin에서 pojo가 다 nullable로 생성되요.
0
514
1
하나의 디비를 여러 백엔드 서버가 필요로 할 때, flyway 관리
1
889
5
dslContext 작성 시 fetchGroups 이렇게 작성해도 될까요?
2
638
6
update with dto 질문
1
268
1
R2DBC 환경에서 jOOQ generate 된 Dao를 사용할 수 있는 방법이 있을까요?
2
1245
3
IDE로 스프링부트 실행없이 jooq로 짠 쿼리 결과를 바로 확인하는 방법이 있을까요?
1
503
1
build.gradle.kts
3
757
2
마리아 DB 쓰시는분들은 mysql 파일 쓰시면됩니다.
1
371
1





