Programming/JOOQ
[JOOQ-06] 올바른 질의를 작성하게 도와주는 방법
zepinos
2019. 3. 22. 17:05
반응형
2019/03/21 - [Programming/JOOQ] - [JOOQ-05] 객체(Object)에 질의 결과 저장하기
JOOQ 는 Java 코드를 SQL 로 에뮬레이트 해주는 DSL 의 성격을 가지고 있습니다. 그래서 C# 의 LINQ 와 유사하게 코드를 작성할 수 있고, 작성된 코드의 문법적 문제를 어느 정도 예방할 수도 있습니다.
그 의미를 알기 위해 아래와 같은 간단한 질의를 Java 코드로 변경해보겠습니다.
SELECT * FROM author a JOIN book b ON a.id = b.author_id WHERE a.year_of_birth > 1920 AND a.first_name = 'Paulo' ORDER BY b.title
위 질의는 다음과 같이 작성될 수 있습니다.
Author a = AUTHOR.as("a"); Book b = BOOK.as("b"); Result<Record> result = create.select() .from(a) .join(b).on(a.ID.eq(b.AUTHOR_ID)) .where(a.YEAR_OF_BIRTH.gt(1920) .and(a.FIRST_NAME.eq("Paulo"))) .orderBy(b.TITLE) .fetch();
이러한 코드를 생성할 때 특정한 DBMS 에 종속적인 형태보다는 JOOQ 의 비공식적인 BNF 표기법이라는 것을 이용합니다. 이러한 표기법을 바탕으로 아래와 같은 오류를 사전에 방지할 수 있습니다.
Result<?> result = create.select() .join(BOOK).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID)) // from() 전에 join() 이 먼저 나올 수 없습니다. IDE 에서 .join() 이 나오지 않기도 하고, 컴파일 시 오류가 발생합니다. .from(AUTHOR) .fetch(); Result<?> result = create.select() .from(AUTHOR) .join(BOOK) .fetch(); // join() 다음에 on() 이 없기 때문에 .fetch() 가 자동완성 되지 않거나 컴파일 시 오류가 발생합니다. Result<?> result = create.select(rowNumber()) // rowNumber() 다음에 over() 가 나와야 문장이 완성되는데 그렇지 않기 때문에 컴파일 시 오류가 발생합니다. .from(AUTHOR) .fetch(); Result<?> result = create.select() .from(AUTHOR) .where(AUTHOR.ID.in(select(BOOK.TITLE).from(BOOK))) // AUTHOR.ID 는 Integer 인데 BOOK.TITLE 은 String 이기 때문에 컴파일 시 오류가 발생합니다. .fetch(); Result<?> result = create.select() .from(AUTHOR) .where(AUTHOR.ID.in(select(BOOK.AUTHOR_ID, BOOK.ID).from(BOOK))) // AUTHOR.ID 는 하나의 컬럼인데 복수의 컬럼이 서브쿼리에서 제공되는 것을 감지하여 컴파일 시 오류가 발생됩니다. .fetch();
이렇듯, JOOQ 을 사용하게 되면 질의를 그대로 옮겨서 작성하지 않고 직접 Java 코드를 작성하더라도 문법적 문제의 일부를 바로잡을 수 있습니다.
2019/03/27 - [Programming/JOOQ] - [JOOQ-07] CTE 구현 방법
반응형