nosql 에 절여졌던 제가 postgre 를 사용하면서 Jooq 를 만나게 되었습니다.
이번 포스팅에서는 Jooq 설정 방법에 대해 이야기를 하고,
다음 포스팅부터는 Jooq 를 이용하여 간단한 쿼리를 작성하는 방법 등을 다루며 jooq 와 친해져보도록 하겠습니다.
1️⃣ jooq 랑 살짝 친해지기
🪴 jooq 가 뭔가요
이번 포스팅에서는 jooq 설정을 주로 다룰 예정입니다.
따라서 jooq 에 대해서는 아주 간단하게만 언급하려고 합니다.
jooq 는 Java Object Oriented Querying 의 약자로,
Java에서 SQL을 객체 지향적으로 다룰 수 있도록 도와주는 라이브러리라는 뜻입니다.
JPA나 Mybatis와 같은 ORM들과는 다르게 SQL을 직접 사용하지만,
자바 코드로 안전하게 다룰 수 있도록 해줍니다.
아래의 쿼리문으로 예시를 들어보겠습니다.
SELECT id, name FROM users WHERE age > 20;
이 쿼리문을 Java에서 JDBC로 작성하게 되면 아래와 같습니다.
String sql = "SELECT id, name FROM users WHERE age > ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setInt(1, 20);
ResultSet rs = stmt.executeQuery();
그런데 이것을 jooq 로 작성하게 되면 아래와 같습니다.
DSLContext create = DSL.using(connection, SQLDialect.POSTGRES);
Result<Record2<Integer, String>> result = create
.select(USERS.ID, USERS.NAME)
.from(USERS)
.where(USERS.AGE.gt(20))
.fetch();
요런 느낌..
jooq 는 요런 느낌이라고 보시면 되겠습니다.
🪴 Jooq 어디가 좋은가요
jooq 의 장점 중에 하나는 바로 DBMS 독립성입니다.
MySQL, PostgreSQL, Oracle 등 이런 DBMS는 SQL 문법이 조금씩 다릅니다.
하지만 Jooq 는 SQLDialect 를 설정하면 DB 종류에 맞게 자동 변환해줍니다.
예를 들어, MySQL 에서 쓰던 jooq 코드가 PostgreSQL 에서도 거의 수정 없이 동작할 수 있습니다.
그렇지만 역시 가장 큰 장점은 타입 세이프(Type-Safe)하다는 것입니다.
SQL 쿼리에서 발생할 수 있는 오류를 컴파일 시점에서 미리 발견할 수 있다는 점 입니다.
jooq 에 대해서는 다음 포스팅부터 자세히 더 다뤄보고,
프로젝트에 설정하는 방법에 대해 알아보겠습니다.
2️⃣ jooq 설정하기
🪴 [1] 플러그인, 의존성 추가하기
기존에 설정하셨던 플러그인과 의존성에 아래와 같은 내용들을 추가해줍니다.
a. 플러그인 추가
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.3'
id 'io.spring.dependency-management' version '1.1.7'
id 'nu.studer.jooq' version '9.0' // Jooq 코드 생성을 자동화하는 역할
}
b. 의존성 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-jooq' // Jooq 를 실행하는 역할
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'org.postgresql:postgresql'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
🪴 [2] jooq 설치 확인하기

프로젝트의 외부 라이브러리를 확인하면 프로젝트와 호환성이 좋은 버전이 설치된 것을 확인할 수 있습니다.
버전 선택 방법은 Spring Boot의 의존성 관리때문입니다.
사용자가 명시적으로 jooq 버전을 지정하지 않으면,
Spring Boot의 기본 BOM(Bill of Materials)에서 제공하는 버전을 사용하기 때문에 3.19.19v 가 설치되었습니다.
🪴 [3] jooq 설정 추가하기
a. [2] 에서 얻은 버전을 전역으로 설정하기
buildscript {
ext {
jooqVersion = '3.19.19'
}
}
b. jooq 설정 추가하기
jooq {
version = jooqVersion // 전역 변수(jooqVersion) 사용하여 jooq 버전 설정
configurations {
main {
generateSchemaSourceOnCompilation = true // 컴파일 시 자동으로 jooq 코드 생성
generationTool {
jdbc {
driver = 'org.postgresql.Driver' // PostgreSQL JDBC 드라이버 사용
url = 'jdbc:postgresql://localhost:5433/ssddo' // PostgreSQL 데이터베이스 URL
user = 'root'
password = 'passwd'
}
generator {
name = 'org.jooq.codegen.DefaultGenerator' // 기본 jooq 코드 생성기 사용
database {
name = 'org.jooq.meta.postgres.PostgresDatabase' // PostgreSQL 메타데이터 클래스 사용
inputSchema = 'public'
}
generate {
deprecated = false // @Deprecated 메서드 생성 X
records = true // jooq Record 클래스 생성
immutablePojos = true // 불변 객체생성
fluentSetters = true // setter 메서드 추가
daos = true // DAO 클래스 생성
springAnnotations = true // Spring 관련 어노테이션 추가 (@Autowired 등)
springDao = true // Spring 기반 DAO 지원 활성화
pojosAsJavaRecordClasses = true // Java Record 클래스(Pojo)로 변환
}
target {
packageName = 'generated.jooq.obj' // 생성된 코드의 Java 패키지 경로
directory = 'src/generated/jooq' // 생성된 코드 저장 디렉토리
}
strategy.name = 'org.jooq.codegen.DefaultGeneratorStrategy' // 기본 코드 생성 전략 사용
}
}
}
}
}
🪴 [4] jooq 유료 vs 무료 확인하기
jooq 는 무료(OSS) 버전과 유료(Professional/Enterprise) 버전이 있습니다.
기본적으로 무료(OSS) 버전이 사용되지만 특정 유료 기능이 필요하면 edition 설정을 변경해야 합니다.
만약 유료 데이터베이스(Oracle, SQL Server 등)를 사용하고 있다면 무료(OSS) 버전에서는 제대로 동작하지 않을 수 있기 때문입니다.
edition 변경은 아래처럼 할 수 있습니다.
import nu.studer.gradle.jooq.JooqEdition
...(중간 생략)
jooq {
version = jooqVersion // 전역 변수(jooqVersion) 사용하여 jooq 버전 설정
edition = JooqEdition.OSS // 무료(오픈소스) 버전 사용
edition = JooqEdition.PROFESSIONAL // 유료(Professional) 버전 사용
...(중간 생략)
}