inflearn logo
강의

Course

Instructor

jOOQ in action! Type Safe SQL with Java

Creating data through insert statement

generate dao 를 통한 삽입 시 pk auto-increment 가 적용되지 않습니다

Resolved

109

ikeelee4778

1 asked

1

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

 

image.pngimage.png

위 쿼리가 실행됩니다

제가 예상했던 insert into "actor" ("first_name", "last_name") values(?, ?) 과는 다르게 id 값이 0으로 고정되어 생성되더라구요

generate dao 를 생성하는 방법이 잘못된 걸까요?

sql spring-boot jooq dsl kotlin

Answer 1

2

sdm32851630

이강현님 안녕하세요. 저도 궁금해서 로컬에서 코틀린으로 테스트해봤는데요.

코틀린의 경우, 로그에서만 auto increment 컬럼이 0으로 찍히고 정상적으로 동작하는것으로 보입니다. (신기하네요..?)

 

스크린샷 2025-08-09 오후 3.24.05.png.webp

 

참고로 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

525

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

639

6

update with dto 질문

1

268

1

R2DBC 환경에서 jOOQ generate 된 Dao를 사용할 수 있는 방법이 있을까요?

2

1245

3

IDE로 스프링부트 실행없이 jooq로 짠 쿼리 결과를 바로 확인하는 방법이 있을까요?

1

503

1

build.gradle.kts

3

758

2

마리아 DB 쓰시는분들은 mysql 파일 쓰시면됩니다.

1

371

1