JDBC 대 jOOQ
원시 JDBC 문자열 기반 SQL을 jOOQ의 타입 안전하고 유창한 SQL DSL로 대체합니다.
코드 비교
✕ Raw JDBC
String sql = "SELECT id, name, email FROM users "
+ "WHERE department = ? AND salary > ?";
try (Connection con = ds.getConnection();
PreparedStatement ps =
con.prepareStatement(sql)) {
ps.setString(1, department);
ps.setBigDecimal(2, minSalary);
ResultSet rs = ps.executeQuery();
List<User> result = new ArrayList<>();
while (rs.next()) {
result.add(new User(
rs.getLong("id"),
rs.getString("name"),
rs.getString("email")));
}
return result;
}
✓ jOOQ
DSLContext dsl = DSL.using(ds, SQLDialect.POSTGRES);
return dsl
.select(USERS.ID, USERS.NAME, USERS.EMAIL)
.from(USERS)
.where(USERS.DEPARTMENT.eq(department)
.and(USERS.SALARY.gt(minSalary)))
.fetchInto(User.class);
이 코드에 문제가 있나요? 알려주세요.
모던 방식이 더 나은 이유
타입 안전 열
열 이름은 생성된 Java 상수입니다 — 오타와 타입 불일치는 런타임 실패 대신 컴파일러 오류가 됩니다.
SQL 유창성
jOOQ DSL은 SQL 구문과 유사하여 복잡한 JOIN, 서브쿼리, CTE가 읽기 쉽게 유지됩니다.
설계상 인젝션 없음
매개변수는 항상 안전하게 바인딩됩니다 — 문자열 연결이 없으면 SQL 인젝션 위험도 없습니다.
이전 방식
원시 JDBC
모던 방식
jOOQ SQL DSL
JDK 버전
11
난이도
중급
JDK 지원
JDBC 대 jOOQ
사용 가능
jOOQ 오픈소스 에디션은 모든 주요 오픈소스 데이터베이스를 지원합니다.
동작 원리
jOOQ(Java Object Oriented Querying)는 데이터베이스에서 Java 코드를 생성합니다. 모든 테이블, 열, 함수가 타입 안전 Java 상수가 되어 SQL 오타가 런타임 오류가 아닌 컴파일러 오류가 됩니다.
관련 문서