H2 데이터베이스를 메모리 모드로 사용하면서 jOOQ 코드 생성을 진행하려면 특정한 순서대로 작업해야 합니다.
이 글에서는 발생할 수 있는 오류와 해결 방법을 정리하여 WordPress 게시글 형식으로 제공합니다.
문제 상황
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 버전 차이)
해결 방법: 올바른 실행 순서
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.properties
에spring.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();
정리: 핵심 포인트
H2 메모리 모드에서 jOOQ 코드 생성을 위해 반드시 아래 순서를 따를 것
H2 TCP 서버 실행 (
-ifNotExists
옵션으로 유지) Spring Boot 실행하여 테이블 생성
generateJooq
실행하여 jOOQ 코드 생성 Spring Boot 종료 후, jOOQ 코드 활용
이 과정을 통해
Tables fetched: 0
등의 문제 없이 정상적으로 jOOQ 코드가 생성됩니다.