문제 상황
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) |

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 을 계속 건드려서 아예 진행을 할 수 없었다...

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 |