6.3. jOOQ 코드 생성
6.3.1. 개요
jOOQ는 데이터베이스 스키마로부터 타입 안전한 Java 클래스를 자동 생성합니다. Flyway로 마이그레이션을 적용한 후 jOOQ codegen을 실행하여 항상 스키마와 코드를 동기화합니다.
Flyway 마이그레이션 실행 → DB 스키마 반영 → jOOQ codegen → Java 클래스 생성6.3.2. Maven 플러그인 설정
xml
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<version>${jooq.version}</version>
<executions>
<execution>
<id>jooq-codegen</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<jdbc>
<driver>org.postgresql.Driver</driver>
<url>jdbc:postgresql://localhost:5432/flowin</url>
<user>flowin</user>
<password>flowin1234</password>
</jdbc>
<generator>
<database>
<name>org.jooq.meta.postgres.PostgresDatabase</name>
<inputSchema>public</inputSchema>
<includes>.*</includes>
<excludes>flyway_schema_history</excludes>
</database>
<target>
<packageName>com.tienipia.flowin.jooq</packageName>
<directory>target/generated-sources/jooq</directory>
</target>
<generate>
<records>true</records>
<daos>false</daos>
<pojos>false</pojos>
<fluentSetters>true</fluentSetters>
<javaTimeTypes>true</javaTimeTypes>
</generate>
</generator>
</configuration>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
</dependencies>
</plugin>6.3.3. 코드 생성 설정 원칙
| 설정 | 값 | 사유 |
|---|---|---|
records | true | Record 클래스 생성 (CRUD에 활용) |
daos | false | DAO 자동 생성 미사용 (직접 Repository 작성) |
pojos | false | POJO 미사용 (별도 DTO 사용) |
fluentSetters | true | 메서드 체이닝 지원 |
javaTimeTypes | true | java.time 타입 사용 (Timestamp 대신) |
excludes | flyway_schema_history | Flyway 내부 테이블 제외 |
6.3.4. 생성된 코드 관리
- 생성 위치:
target/generated-sources/jooq/ - 생성된 코드는 Git에 커밋하지 않습니다. 빌드 시 항상 재생성합니다.
.gitignore에 다음을 포함합니다:
txt
target/generated-sources/6.3.5. 생성 코드 구조
target/generated-sources/jooq/
└── com/tienipia/flowin/jooq/
├── DefaultCatalog.java
├── Public.java # 스키마 참조
├── Keys.java # PK, FK 정의
├── Tables.java # 테이블 상수
└── tables/
├── Users.java # 테이블 정의
├── Orders.java
└── records/
├── UsersRecord.java # Record 클래스
└── OrdersRecord.java