2019/03/22 - [Programming/JOOQ] - [JOOQ-06] 올바른 질의를 작성하게 도와주는 방법 JOOQ 에서는 Oracle, SQL Server, MySQL 등에서 제공하는 CTE(WITH 로 알고 계시는 분들도 있더군요) 역시 작성할 수 있습니다. 다만, 이 때에는 method 단위의 기능 보다는 문자열로 합성해야 하는 경우가 있어서 추천하고 싶은 방법은 아닙니다. 먼저, 아래와 같이 Java 코드로 작성합니다. CommonTableExpression t1 = name("t1").fields("f1", "f2").as(select(val(1), val("a"))); CommonTableExpression t2 = name("t2").fields("f3", "f4").as(selec..
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..
2019/03/05 - [Programming/JOOQ] - [JOOQ-04] 좀 더 복잡한 질의 실행해보기 JOOQ 에서는 앞선 예제에서와 같이 Record3 와 같은 Record 을 제공해줍니다. 결과가 3 개일 때에는 Record3, 4 개일 때에는 Record4 을 이용해서 결과를 fetch() 을 통해서 받을 수 있습니다. 하지만, 많이 사용되는 MyBatis 에서도 HashMap 이나 POJO(VO, DTO 등) 형태로 결과를 저장하는게 일반적으로, JPA 에서도 @Entity 로 선언된 POJO 에 바로 결과를 저장하는 것이 일반적입니다. 내부적으로는 Reflection 을 이용하겠죠. 당연히 JOOQ 에서도 POJO 에 바로 저장할 수 있는 기능을 제공합니다. 먼저 앞선 예제의 질의를 그대..
2019/03/05 - [Programming/JOOQ] - [JOOQ-03] 테스트 DB 을 생성하고 JOOQ 객체 생성하기 좀 더 복잡한 질의를 실행해보겠습니다.저의 경우 JOOQ 으로 개발할 때에는 먼저 DBMS 에 직접 SQL 로 명령을 실행해본 뒤에 실제 본문을 작성해봅니다. JOOQ 는 Type Safe 등을 지원하긴 하지만, 이것이 올바른 질의인지는 판단하지 않기 때문입니다. 다음은 실제 질의해 본 것입니다. SELECT author.first_name, author.last_name, COUNT(*) FROM author JOIN book ON author.id = book.author_id JOIN `language` ON book.language_id = `language`.id WHE..
2019/03/01 - [Programming/JOOQ] - [JOOQ-02] JOOQ 에 대해서 좀 더 알아보기 앞선 글에서 아주 간단한 테스트를 위해 하나의 Table 을 생성하고 JOOQ 객체 생성 없이 사용하는 예제를 만들어봤습니다. 하지만, JOOQ 객체 없이 JOOQ 을 쓴다는건 생각하기 힘든 일입니다. 왜냐하면, String 으로 된 "board.seq" 와 같은 것으로 오타 방지 등을 할 수 없기 때문입니다.반대로 JPA 와 달리 사용자가 POJO 을 만들고 이를 바탕으로 DB 을 자동으로 생성해주는 것 또한 바람직하지 않다고 생각합니다. ORM 을 많이 사용하게 되면서 Java Object(POJO) 을 기반으로 데이터 구조를 설계하는 문화도 꽤나 정착되었지만, 여전히 기획을 바탕으로 데..
2019/02/28 - [Programming/JOOQ] - [JOOQ-01] JOOQ 맛보기 Web 프로그래밍이 perl 을 앞세워 CGI 의 영역에서 서비스 되던 시기에는 RDBMS 을 이용해서 데이터를 처리하기 보다는 예전처럼 서버의 파일시스템에 Text 파일을 만들어 데이터를 다루는게 더 일반적인 시기가 있었습니다. 하지만, MySQL 을 위시한 무료 RDBMS 가 성능을 높여가고 Web 프로그래밍의 구성 방법이 바뀌어가면서 Web 프로그래밍 시 RDBMS 가 항상 포함되는건 당연한 것처럼 여겨지는 시대가 되었습니다. 현재에는 RDBMS 의 한계를 극복하기 위해 NoSQL 제품들이 나오고 있지만, 아직까진 RDBMS 의 아성은 굳건하기만 합니다. Web 의 유행으로 인해 대중화된 RDBMS 은 더..
2019/02/28 - [Programming/JOOQ] - [프롤로그] JOOQ 을 사용하게 된 계기 JOOQ 을 어떻게 사용하는건지 아주 간단한 맛보기 프로그램을 만들어보겠습니다. PC 에 docker 을 사용할 수 있는 환경을 구축한 후 MySQL 8 을 설치하였습니다. jooq 라는 계정을 만들고 jooq@1234 라는 패스워드를 생성하고 jooq 라는 schema(DB) 을 생성하였습니다. 이 모든 설정은 MySQL 와 관련된 것이기 때문에 생략하겠습니다.생성된 DB 에 다음과 같이 테스트용 테이블 하나와 두 개의 데이터를 입력하였습니다. CREATE TABLE `jooq`.`jooq_board` ( `seq` INT NOT NULL AUTO_INCREMENT, `author` VARCHAR(1..
제목을 좀 거창하게 지은 것 같긴 하네요. 그냥, 제가 JOOQ 을 써보게 된 계기를 담담하게 적어보려고 합니다. Java 을 오랜 기간동안 사용해서 개발하다보니, 당연히 Connection, PreparedStatement, ResultSet 을 이용해서 DB 에 질의(Query)을 하는 방법도 써왔고, iBatis 2.x ~ MyBatis 3 도 많이 사용했으며, Spring 의 JdbcTemplate 도 써본 적이 있습니다. 한 때 이슈가 된, 그리고 지지자들의 의견으론, 해외에선 이미 대세가 되었다는 ORM, 그 중에서도 Java 표준이 되어버린 JPA with Hibernate 을 이용해 게임 서버를 개발하여 출시도 해봤습니다. 여러 방식으로 RDBMS 에 질의를 했지만, 그래도 가장 나았던 건..
이번 프로젝트에서 jooq 을 이용해서 개발하면서 불편한 점이 몇 가지 있었습니다. 먼저, 객체(POJO)에 값을 넣고 돌아다니다가 DB 에 저장할 때 쿼리가 길어지는 문제였습니다. public long insert(ChatInfo chatInfo) { return this.dsl .insertInto(CHAT_INFO, CHAT_INFO.SESSION_ID, CHAT_INFO.IS_END, CHAT_INFO.DATE_ADD, CHAT_INFO.DATE_MOD) .values(chatInfo.getSessionId(), "N", Timestamp.valueOf(LocalDateTime.now()), Timestamp.valueOf(LocalDateTime.now())) .returning(CHAT_INF..
- Total
- Today
- Yesterday
- Spring Boot
- 내장 WAS
- boot
- 워드프레스
- java config
- SI
- Redmine
- RestTemplate
- 클라우드플레어
- Phabricator
- Nas
- proxmox
- jooq
- docker
- 시니어 프로그래머
- couchbase
- NoSQL
- 도입기
- manjaro
- KDE
- OracleJDK
- 외장 WAS
- 프로젝트 규모
- git
- paging
- messages.properties
- Spring
- Spring MVC
- 엘지
- 페이징
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |