개발/Spring
Jooq란 무엇인가?
hanks
2025. 6. 3. 01:33
Jooq(Java Object Oriented Querying)은 타입 안정성 있는 SQL DSL을 제공하는 Java 기반 라이브러리다. SQL을 코드로 작성할 수 있게 하되, JDBC나 JPA처럼 객체 중심이 아닌 SQL 중심의 접근 방식을 취한다. SQL의 강력함과 Java의 정적 타이핑을 결합하여, 복잡한 쿼리도 안전하게 작성할 수 있다.
1. 왜 Jooq를 사용하는가?
✅ SQL 그대로 활용
- 복잡한 SQL을 그대로 Java 코드에서 사용 가능
- DBMS별 함수나 쿼리 문법을 제약 없이 사용할 수 있다
✅ 타입 안전성과 자동 완성
- SQL 문법이 Java 코드로 옮겨져 있어 컴파일 시점에 오류를 잡을 수 있다
- IDE에서 자동완성, 문법 체크 가능 → 유지보수성 증가
✅ 코드와 DB 구조 싱크
- Jooq는 DB 스키마를 분석하여 코드로 생성해준다
- 컬럼명, 테이블명 등을 TABLE.COLUMN 형태로 코드에서 그대로 사용 가능
2. Jooq의 주요 특징
기능 | 설명 |
DSL 기반 쿼리 | Java 코드로 SQL 문법을 표현 |
타입 안전 | 쿼리 작성 시 오타, 잘못된 컬럼명 등을 컴파일 단계에서 탐지 |
DB 종속적 기능 허용 | 윈도우 함수, CTE, JSON 처리 등 DBMS의 고급 기능 활용 가능 |
코드 생성기 | DB 스키마로부터 Java 클래스를 생성하여 테이블/컬럼을 코드로 다룸 |
트랜잭션 및 DSLContext | Spring이나 Java EE와 통합하여 트랜잭션 처리 가능 |
3. 간단한 사용 예시
// SELECT * FROM MEMBER WHERE AGE > 20 ORDER BY NAME ASC
DSLContext create = DSL.using(configuration);
List<MemberRecord> result = create
.selectFrom(MEMBER)
.where(MEMBER.AGE.gt(20))
.orderBy(MEMBER.NAME.asc())
.fetch();
→ MEMBER, AGE, NAME은 DB에서 자동 생성된 코드
4. Spring Boot + Jooq 통합
// build.gradle
implementation 'org.jooq:jooq'
implementation 'org.jooq:jooq-meta'
implementation 'org.jooq:jooq-codegen'
# application.yml
spring:
jooq:
sql-dialect: POSTGRES
@Configuration
public class JooqConfig {
@Bean
public DefaultDSLContext dslContext(Configuration configuration) {
return new DefaultDSLContext(configuration);
}
}
5. 코드 생성기 설정
Maven이나 Gradle로 DB 스키마를 기반으로 Java 클래스를 생성 가능하다.
<generator>
<database>
<name>org.jooq.meta.mysql.MySQLDatabase</name>
<inputSchema>my_schema</inputSchema>
</database>
<target>
<packageName>com.example.jooq</packageName>
<directory>target/generated-sources/jooq</directory>
</target>
</generator>
6. 언제 사용하면 좋은가?
- 복잡한 SQL을 자주 다루는 프로젝트
- JPA의 한계를 느끼는 경우 (복잡한 JOIN, Window Function 등)
- SQL 작성에 익숙한 팀
- DB 중심의 설계 또는 레거시 DB 연동
7. 마무리
Jooq는 SQL과 Java를 자연스럽게 연결해주는 훌륭한 도구다. 특히 SQL의 자유도를 유지하면서도 정적 타이핑의 이점을 누리고 싶을 때 큰 도움이 된다. Spring Boot와도 자연스럽게 통합되며, 복잡한 데이터 조회 로직을 명확하게 표현할 수 있다.
"JPA는 객체 지향, Jooq는 SQL 지향. 어떤 프로젝트든 둘 사이에서 균형을 잡는 것이 핵심이다."