티스토리 뷰

반응형

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 구현 방법


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함