H2 메모리 DB와 jOOQ 코드 생성 문제 해결 가이드

H2 데이터베이스를 메모리 모드로 사용하면서 jOOQ 코드 생성을 진행하려면 특정한 순서대로 작업해야 합니다.
이 글에서는 발생할 수 있는 오류와 해결 방법을 정리하여 WordPress 게시글 형식으로 제공합니다.


1️⃣ 문제 상황

H2 데이터베이스를 메모리 모드로 설정한 상태에서 generateJooq을 실행하면 테이블이 생성되지 않아 jOOQ 코드가 만들어지지 않는 문제가 발생할 수 있습니다.
이는 H2의 메모리 특성상 애플리케이션이 실행 중일 때만 데이터가 유지되기 때문입니다.

🔹 발생하는 주요 오류

  • Tables fetched: 0 (테이블이 생성되지 않아 jOOQ가 인식하지 못함)
  • Connection is broken (jOOQ가 DB 연결을 끊어버림)
  • Required type: Result<Record>, Provided: Result<Record3<Long, String, String>> (데이터 타입 오류)
  • coerce() 메서드가 없음 (jOOQ 버전 차이)

2️⃣ 해결 방법: 올바른 실행 순서

H2 메모리 모드를 유지하면서도 jOOQ 코드 생성을 성공적으로 진행하려면 아래 순서를 따라야 합니다.

✅ 1단계: H2 TCP 서버 실행

먼저, H2의 TCP 서버를 실행하여 메모리 DB를 유지해야 합니다.

& "D:\AlertemWorkspace\jdk-17\bin\java.exe" -cp "D:\AlertemWorkspace\h2-2.3.232.jar" org.h2.tools.Server -tcp -tcpAllowOthers -tcpPort 9092 -ifNotExists

✔ 정상 실행되면 다음 메시지가 출력됩니다.

TCP server running at tcp://192.168.45.233:9092 (others can connect)

💡 이 단계에서 발생할 수 있는 문제

  • java.lang.UnsupportedClassVersionError 발생 시, Java 17로 실행해야 합니다.
  • h2-xxx.jar 파일이 없으면 Gradle 캐시에서 경로를 찾거나 직접 다운로드하여 지정합니다.

✅ 2단계: Spring Boot 애플리케이션 실행하여 H2에 테이블 생성

H2 메모리 DB는 애플리케이션이 실행될 때만 유지되므로 테이블을 먼저 생성해야 합니다.

./gradlew bootRun

✔ 애플리케이션 실행 후 확인해야 할 사항

  • H2 Console (http://localhost:8082)에 접속하여 테이블이 정상적으로 생성되었는지 확인
  • show tables; 실행 시, 필요한 테이블 (SAMPLE, SAMPLE_DTL 등)이 보이는지 확인

💡 이 단계에서 발생할 수 있는 문제

  • http://localhost:8082 접속 불가: spring.datasource.url=jdbc:h2:tcp://localhost:9092/mem:testdb 로 설정 확인
  • Refused to display 'http://localhost:8080/' in a frame because it set 'X-Frame-Options' to 'deny'
    application.propertiesspring.h2.console.settings.web-allow-others=true 추가

✅ 3단계: jOOQ 코드 생성 (generateJooq 실행)

애플리케이션이 실행된 상태에서 jOOQ 코드를 생성해야 테이블을 정상적으로 인식합니다.

./gradlew generateJooq

✔ 정상 실행되면 다음과 같은 메시지가 출력됩니다.

Tables fetched: 35 (35 included, 0 excluded)

✔ build/generated-sources/java/com/surp/jooq/Tables.java 등 jOOQ 관련 코드가 생성됩니다.

💡 이 단계에서 발생할 수 있는 문제

  • Tables fetched: 0 → 애플리케이션을 먼저 실행하지 않아서 테이블을 찾을 수 없음
  • Connection is broken → H2 서버가 비정상적으로 종료되었거나 포트가 충돌함
  • Invalid content was found starting with element 'oracleUseDBAViews'build.gradle 설정 확인

✅ 4단계: Spring Boot 종료 및 jOOQ 코드 활용

이제 Spring Boot를 종료해도 jOOQ 코드가 유지됩니다.

CTRL + C

이후, 애플리케이션을 다시 실행하면 jOOQ 코드가 반영된 상태에서 동작합니다.

./gradlew bootRun

✔ jOOQ 코드가 정상적으로 동작하는지 확인

Result<Record> result = dsl
.select(SAMPLE.ID, SAMPLE.NAME, SAMPLE_DTL.DESCRIPTION)
.from(SAMPLE)
.join(SAMPLE_DTL).on(SAMPLE.ID.eq(SAMPLE_DTL.SAMPLE_ID))
.fetch();

3️⃣ 정리: 핵심 포인트

🎯 H2 메모리 모드에서 jOOQ 코드 생성을 위해 반드시 아래 순서를 따를 것

1️⃣ H2 TCP 서버 실행 (-ifNotExists 옵션으로 유지)
2️⃣ Spring Boot 실행하여 테이블 생성
3️⃣ generateJooq 실행하여 jOOQ 코드 생성
4️⃣ Spring Boot 종료 후, jOOQ 코드 활용

✔ 이 과정을 통해 Tables fetched: 0 등의 문제 없이 정상적으로 jOOQ 코드가 생성됩니다. 🚀

관련 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다