inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전 jOOQ! Type Safe SQL with Java

kotlin jOOQ , 컴파일시 힙메모리 부족

해결된 질문

523

코틀린자바

작성한 질문수 5

0

안녕하세요

비슷한 이유로 queryDSL 에서 불편함을 가지고 있어 jOOQ 에 관심이 생겼습니다.

마침 이렇게 좋은 강의 만들어주셔서 정말 감사합니다.

다름이 아니라 kotlin 을 주로 사용해서 kotlin 으로 jOOQ 사용시 컴파일 단계에서 힙메모리 부족 현상이 생기는데 혹시 kotlin 으로 힙메모리 부족 현상을 겪으신 적 있으신가요

만약 있으시면 해결하신 지혜를 얻고 싶어 글 남깁니다

gradle 설정은 아래와 같이 했습니다

해결과정 동안 힙메모리 설정 추가하여 늘려봐도 메모리 부족 현상이 발생하네요

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

val jooqVersion: String by extra("3.19.5")

plugins {
    kotlin("jvm") version "1.9.25"
    kotlin("plugin.spring") version "1.9.25"
    id("org.springframework.boot") version "3.4.0"
    id("io.spring.dependency-management") version "1.1.6"
    id("nu.studer.jooq") version "9.0"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-jooq"){
        exclude(group = "org.jooq", module = "jooq")
    }
    implementation("org.jooq:jooq:$jooqVersion")

    // jOOQ
    implementation(project(":jOOQ-custom"))
    jooqGenerator (project(":jOOQ-custom"))
    jooqGenerator("org.jooq:jooq:$jooqVersion")
    jooqGenerator("org.jooq:jooq-meta:$jooqVersion")

    implementation("org.jetbrains.kotlin:kotlin-reflect")
    runtimeOnly("com.mysql:mysql-connector-j")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

kotlin {
    compilerOptions {
        freeCompilerArgs.addAll("-Xjsr305=strict")
    }
}

tasks.withType<Test> {
    useJUnitPlatform()

}

val dbUser: String = System.getProperty("db-user") ?: "root"
val dbPassword: String = System.getProperty("db-password") ?: "passwd"

jooq {
    version.set(jooqVersion)

    configurations {
        create("sakilaDB") {
            generateSchemaSourceOnCompilation.set(true)
            jooqConfiguration.apply {
                logging = org.jooq.meta.jaxb.Logging.WARN
                jdbc.apply {
                    driver = "com.mysql.cj.jdbc.Driver"
                    url = System.getenv("DB_URL") ?: "jdbc:mysql://localhost:3306/sakila"
                    user = dbUser
                    password = dbPassword
                }
                generator.apply {
                    name = "org.jooq.codegen.KotlinGenerator"
                    database.apply {
                        name = "org.jooq.meta.mysql.MySQLDatabase"
                        excludes = "sys"
                    }
                    generate.apply {
                        isDaos = true
                        isRecords = true
                        isFluentSetters = true
                        isJavaTimeTypes = true
                        isDeprecated = false

                    }
                    target.apply {
                        directory = "src/generated"
                    }
                    strategy.name = "com.example.jooq.custom.generator.JPrefixGeneratorStrategy"
                }
            }
        }
    }
}

sourceSets {
    main {
        java {
            srcDirs("src/main/kotlin", "src/generated")
        }
    }
}

java sql spring-boot jooq dsl

답변 2

1

왕왕

저도 똑같이 OutOfMemoryError: GC Overhead Limit Exceeded 에러를 겪고 있는데 혹시 어떻게 해결하셨는지 알 수 있을까요,,,?

0

코틀린자바

저는 build.gradle.kt 에서 jOOQ 설정을 아래와 같이 수정했더니 돌아갔습니다

val dbUser: String = System.getProperty("db-user") ?: "root"
val dbPassword: String = System.getProperty("db-passwd") ?: "passwd"

jooq {
    configurations {
        create("sakilaDB") {
            generateSchemaSourceOnCompilation.set(false) // 기본적으로 스키마 소스 생성을 비활성화합니다.

            jooqConfiguration.apply {
                jdbc.apply {
                    driver = "com.mysql.cj.jdbc.Driver"
                    url = "jdbc:mysql://localhost:3306/sakila"
                    user = dbUser
                    password = dbPassword
                }
                generator.apply {
                    name = "org.jooq.codegen.KotlinGenerator" // 코틀린 제너레이터 명시
                    database.apply {
                        name = "org.jooq.meta.mysql.MySQLDatabase"
                        inputSchema = "sakila"

                        forcedTypes = listOf(
                            ForcedType().apply {
                                userType = "java.lang.Long"
                                includeTypes = "int unsigned"
                            },
                            ForcedType().apply {
                                userType = "java.lang.Integer"
                                includeTypes = "tinyint unsigned"
                            },
                            ForcedType().apply {
                                userType = "java.lang.Integer"
                                includeTypes = "smallint unsigned"
                            }
                        )

                    }

                    generate.apply {
                        isDaos = true
                        isRecords = true
                        isFluentSetters = true
                        isJavaTimeTypes = true
                        isDeprecated = false
                    }
                    target.apply {
                        directory = "src/generated"
                    }
                    strategy.name = "com.example.jooq.custom.generator.JPrefixGeneratorStrategy"

                }
            }
        }
    }
}

sourceSets {
    main {
        kotlin {
            srcDirs(listOf("src/main/kotlin", "src/generated"))
        }
    }
}

0

설동민

왕왕님 안녕하세요.

 

코틀린자바님처럼 작성하신 build.gradle 파일을 올려주시면 확인해보도록 하겠습니다.

(대댓글이 메일이 안오네요 ㅠㅠ)

1

코틀린자바

gradle 설정 잘못됐나보네요

강사님 설정 토대로 다시 짜니까 잘됩니다

대단하십니다

질문을 삭제할까 하다 후기 느낌으로 그냥 남겨놓겠습니다

실제 후기는 완강 후 남기도록 하겠습니다

감사합니다

0

HelloWorld

 

혹시 어떻게 해결하신지 공유해주실 수 있으실까요?

2

코틀린자바

저 같은 경우 메모리 부족 현상이 나타났던 이유가 gradle 설정이 잘못돼서 무한히 돌아서 그런 것 같습니다

후반부에 나오는 flyaway 적용 하기 전 gradle.kt 입니다. 저는 아래와 같이 해서 해결 했는데 안 되는 이유는 다양하게 있을 수 있어서 한 번 적용해보시고 안 되면 다른 방향으로 찾아보셔야 할 것 같습니다. 강의 마지막 세션만 남겨두고 주크로 프로젝트에 몇 번 적용해보는데 매번 한 번에 세팅 성공한 적이 없을 정도로 강사님이 강의 초반에 말씀하신 것처럼 세팅이 까다롭더라고요. 그래들 설정 정보에 대한 지식을 쌓아서 커스텀할 정도 돼야 자유롭게 쓸 수 있지 않을까 싶습니다.

import org.jooq.meta.jaxb.ForcedType

val jooqVersion: String by extra("3.19.5")

plugins {
    kotlin("jvm") version "1.9.25"
    kotlin("plugin.spring") version "1.9.25"
    id("org.springframework.boot") version "3.4.0"
    id("io.spring.dependency-management") version "1.1.6"
    id("nu.studer.jooq") version "9.0"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-jooq")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    runtimeOnly("com.mysql:mysql-connector-j")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")

    jooqGenerator(project(":jOOQ-custom"))
    jooqGenerator("org.jooq:jooq")
    jooqGenerator("org.jooq:jooq-meta")
}

kotlin {
    compilerOptions {
        freeCompilerArgs.addAll("-Xjsr305=strict")
    }
}

tasks.withType<Test> {
    useJUnitPlatform()

}

val dbUser: String = System.getProperty("db-user") ?: "root"
val dbPassword: String = System.getProperty("db-passwd") ?: "passwd"

jooq {
    configurations {
        create("sakilaDB") {
            generateSchemaSourceOnCompilation.set(false) // 기본적으로 스키마 소스 생성을 비활성화합니다.

            jooqConfiguration.apply {
                jdbc.apply {
                    driver = "com.mysql.cj.jdbc.Driver"
                    url = "jdbc:mysql://localhost:3306/sakila"
                    user = dbUser
                    password = dbPassword
                }
                generator.apply {
                    name = "org.jooq.codegen.KotlinGenerator" // 코틀린 제너레이터 명시
                    database.apply {
                        name = "org.jooq.meta.mysql.MySQLDatabase"
                        inputSchema = "sakila"

                        forcedTypes = listOf(
                            ForcedType().apply {
                                userType = "java.lang.Long"
                                includeTypes = "int unsigned"
                            },
                            ForcedType().apply {
                                userType = "java.lang.Integer"
                                includeTypes = "tinyint unsigned"
                            },
                            ForcedType().apply {
                                userType = "java.lang.Integer"
                                includeTypes = "smallint unsigned"
                            }
                        )

                    }

                    generate.apply {
                        isDaos = true
                        isRecords = true
                        isFluentSetters = true
                        isJavaTimeTypes = true
                        isDeprecated = false
                    }
                    target.apply {
                        directory = "src/generated"
                    }
                    strategy.name = "com.example.jooq.custom.generator.JPrefixGeneratorStrategy"

                }
            }
        }
    }
}

sourceSets {
    main {
        kotlin {
            srcDirs(listOf("src/main/kotlin", "src/generated"))
        }
    }
}

 

안녕하세요 FetchGroups에서 Multiset방식 사용하면 어떤가 해서 물어봅니다

0

60

1

monosoul jooq plugin-docker registry 변경

1

101

3

질문) jOOQ 프로젝트에서 CI/CD 자동화 문의

1

173

3

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

1

109

1

jooq+flyway에서 질문드립니다

0

249

2

안녕하세요 생성일,생성자,수정일,수정자는 자동으로 해주는 기능이 있을까요?

0

206

2

[사례] Maven에서 TestContainers 플러그인 적용시 예외발생

0

142

0

Routines 관련 질문

1

159

2

JOOQ 환경설정 중에 db 패스워드 관련 질문입니다.

1

173

1

Sakila DB 도커 컴포즈 구성 시 팁

1

152

1

DB 벤더별 내장함수에 대한 방언 지원 듣고 질문드려요

1

176

1

인텔리제이 테마 질문

2

423

3

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

886

5

dslContext 작성 시 fetchGroups 이렇게 작성해도 될까요?

2

638

6

update with dto 질문

1

267

1

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

2

1243

3

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

1

502

1

build.gradle.kts

3

755

2

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

1

371

1