SPARTA 과제/SPRING

JOOQ 코드 생성 트러블슈팅

kjw81024 2026. 4. 13. 09:16

문제 상황

JOOQ 를 도입하여 코드를 작성한 후 entity 를 수정할 일이 생겨 table 을 drop 시킨 이후 다시 실행시키니까 Generated 파일이 생성되지 않는 문제 발생 

MySQL DB 와 연결해서 코드를 생성하는 기본 방식이 ddl-auto 로 앱 실행 시 테이블이 생성되는 구조라 generateJooq 실행 시점에 테이블이 존재하지 않아서 Tables fetched: 0 이 뜨며 generated 폴더가 생성되지 않는다 

SQLDialect.MYSQL: 8.0.45
22:10:48 INFO ARRAYs fetched : 0 (0 included, 0 excluded)
22:10:48 INFO Domains fetched : 0 (0 included, 0 excluded)
22:10:48 INFO Tables fetched : 8 (8 included, 0 excluded)
22:10:48 INFO Embeddables fetched : 0 (0 included, 0 excluded)
22:10:48 INFO Enums fetched : 0 (0 included, 0 excluded)
22:10:48 INFO Packages fetched : 0 (0 included, 0 excluded)
22:10:48 INFO Routines fetched : 0 (0 included, 0 excluded)
22:10:48 INFO Sequences fetched : 0 (0 included, 0 excluded)

jooq 내부에 tables package 가 비어있다

Generated 파일이 생성되지 않으면 JooQ를 사용하고 import 하는 코드에서 오류가 발생

해결하는 과정이 필요했다.


해결과정

1. 주석처리 방식

 

일단 JOOQ 를 사용하는 모든 class 와 method 를 주석처리

-> 메서드를 실행시킨 뒤 table 이 생성

-> generateJooQ 명령어를 실행해서 generated 폴더 만들기 

-> 주석 해제 

 

일단 되긴 한다..... table 이 생성만 되어있으면 사실 JOOQ 의 generated 폴더를 생성하는건 어렵지 않았음

하지만 해당 방식으로 하면 앞으로 JOOQ 를 사용하는 class 와 method 가 늘어나면 날수록 번거로워짐

(주석 처리, method 에 사용되는 부분은 대체하기 위해 깡통 method 생성 필요 (return null 등) )

다른 방식을 찾아보기로 했다 

 

2. SourceSets 분리하기

 

compileJava -> JOOQ 생성 -> compileJava 이런식으로 순환참조 문제가 발생하길래 우회 방식을 찾아보려고 했다

sourceSets {
    entities {
        java {
            srcDirs = ['src/main/java']
            include '**/entity/**'
        }
    }
    main {
        java {
            srcDirs 'src/main/generated'
        }
    }
}

entity 폴더만 먼저 읽어서 별도로 컴파일 하는 방식 (순환참조 우회)

하지만 이렇게 하니까 main source set 을 계속 건드려서 아예 진행을 할 수 없었다...

100개 오류 ... 무서운 이야기

 

3. schema.sql 생성 (최종 방법)

SQL 스크립트 파일을 읽어서 미리 table 코드 생성 

DB 연결을 할 필요 없지만 schema.sql 을 별도로 관리해야하는 번거로움이 있었다.

하지만 견디기로 함 

entity 는 과제가 진행되며 점점 더 고칠 필요가 없어질 예정이고 엔티티 수정과 동시에 schema 파일도 수정한 후 전체 실행시키면 초기화가 된다는 점을 생각했다....

 

table 생성 -> generateJooQ 실행 -> bootJar/ docker-run 을 사용해서 application 을 실행시킨다 

최대한 덜 귀찮게 generateJooq 랑 compile 과정은 합쳐줬다

tasks.named('compileJava') {
    dependsOn tasks.named('generateJooq')
}

build.gradle 에 compile 시 generateJooq 명령어를 먼저 실행시키도록 설정 

아래 순서대로 실행시키면 된다

만약 entity 의 수정이 없다면 그냥 docker-run 실행시켜도 table 이 남아있기 때문에 괜찮다!

 

나중에 application 실행 전에 

mysql 명령어를 자동으로 입력해줄 수 있다면 해당 방법을 사용하는게 좋을 것 같다 (그럼 2-3번 합치기 가능)

mysql -u root -p 12345678 -P 3307 tixy < src/main/resources/schema.sql

 

정리하자면 JOOQ 코드 생성은 DB 에 테이블이 존재해야 가능 

ddl-auto 를 사용하는 이상 JOOQ 코드 생성과 compile 은 닭이 먼저냐 달걀이 먼저냐 문제......

 

열심히 AI ^^ ... 와 함께 찾아보다가 Flyway 라는 툴을 알게되었다. 

Flyway 는 DB 스키마 변경 이력을 버전으로 관리해준다.

현재 방식 Flyway
schema.sql 수동 적용
스키마 변경 시 직접 column 을 수정 
앱 실행 시 자동 적용
V2__ 파일 추가하면 자동

조금 더 알아보고 사용법을 추가해봐야할듯하다..  .

'SPARTA 과제 > SPRING' 카테고리의 다른 글

RedisTemplate StackOverFlow Error  (1) 2026.05.03
K6 테스트  (0) 2026.04.29
Plus spring 도전과제  (1) 2026.04.06
Plus spring 필수 과제  (0) 2026.04.03
심화) LV 7 Test code  (1) 2026.03.07