개발/Spring

jOOQ를 JPA와 같이 써보자

jOOQ에 대해 좀 더 알아보자 라는 글을 쓴 지 벌써 8개월 가까이 지났습니다. 현재 재직 중인 회사에서는 아직 jOOQ를 사용하지 않고 있는데요. 그래도 언젠가는 쓰일 수 있다는 생각에 기술검증을 하기 위해 이것저것 시도했었습니다. 삽질을 많이 하다 보니 혼자 알고 있기에는 아까운 점들이 있어 정리합니다. 여러 고난이 있었고 jOOQ의 창시자의 도움을 받아 진행한 점도 있었습니다. 프로젝트에 jOOQ 또는 jOOQ + JPA 조합을 도입하길 원하시는 분들은 이 글을 읽고 고민하시는 것도 좋을 듯합니다. - 본 포스트는 아래를 목표로 지정하고 작성하였습니다. 1. Gradle 환경에서 JPA 엔티티를 사용하여 jOOQ DSL 만들기 2. 하나의 프로젝트에서 jOOQ와 JPA를 같이 사용하기 - 본 포스..

2022.09.10 게시됨

개발/Java

jOOQ 를 좀 더 알아보자

[입문] jOOQ에 대해 알아보자 에 대해 글을 쓴지 1년이 지났습니다. Jooq에서 이것저것 커스텀을 해서 썼었는데 딱히 정리를 하지 않아서 필자가 자주 사용하는 일부 커스텀한 부분이나 겪었던 팁들을 정리하고자 합니다. 코드는 [여기] 서 확인 할 수 있습니다. 1. Jooq는 앞으로 JAVA 11 부터 Jooq는 3.15 부터 Java 11이 요구됩니다. [2021.07 release] 자주 사용되는 jooq용 gradle 플러그인도 Java 8을 드랍하고 최소사양이 Java 11 이 되면서 앞으로 jooq를 사용하려면 이에 대응해야합니다. 기업용은 8까지 지원하지만, 플러그인에서 지원을 드랍했기 때문에 설정 삽질을 조금 해야할것으로 보이네요. 2. Jooq DSL에 전용 Prefix 생성 [코드 링..

2022.01.03 게시됨

개발/Spring

스프링에서 편리하게 Master / Slave 분기 처리하기

도입 실제 서비스를 운영하다 보면 데이터베이스가 여러 개의 노드로 분산되어 Master / Slave (또는 Multi Master) 구조로 이루어져 있는 경우가 많습니다. 이때 어플리케이션 레벨에서 어떻게 DataSource를 분기처리 할 지 고민이 많았습니다. 이 경우에 크게 두가지 방법으로 나뉘는데요 1. RW / RO 별로 데이터소스를 만들어 개발자가 이를 인지하며 개발을 하거나 2. 단일 데이터 소스에서 트랜잭션의 분기처리를 Lazy 하게 처리하는 방법 으로 두가지가 있습니다. 저는 스프링의 [ AbstractRoutingDataSource ] 를 사용하여 2번 방법으로 진행하였으며, 코드는 [깃허브]에 있습니다. 먼저 결과를 알려드리자면, 2번 방식으로 진행했을 경우 아래와 같이 동작하게됩니다..

2021.08.27 게시됨

개발/RDB

Galera Cluster에 대해 알아보자

도입 현재 다니는 회사에서 RDBMS로 MariaDB를 사용하고 있습니다. 서비스가 규모가 있다보니 단일 DB로는 버틸 수 없기 때문에 Galera Cluster로 클러스터를 구성하여 사용하고있습니다. 오늘은 MariaDB/MySQL에서 사용되는 동기식 멀티마스터 클러스터인 Galera Cluster에 대해 알아보도록 하겠습니다. 갈레라 클러스터를 간단히 도커로 세팅을 해보았습니다. [Github 링크] Galera Cluster 란 갈레라 클러스터는 동기 방식의 복제구조를 사용하는 멀티마스터 RDB 클러스터입니다. 단, 논리적으로는 완전 동기이지만 실제 write 와 tablespace에 commit하는 과정이 별개이고 각 노드간에는 비동기로 동작합니다. 갈레라 클러스터에서 이를 virtually sy..

2021.06.19 게시됨

개발/Spring

[입문] jOOQ에 대해 알아보자

필자는 JPA로 개발할때 QueryDSL-jpa를 활용한 Type-Safe 한 SQL 작성을 굉장히 선호합니다. 사람이 실수 할 수 있는 여지를 미연에 방지할 수 있기 때문입니다. 하지만 회사에서 JPA가 아닌 프로젝트를 맡게 되었고 이로인해 native sql 에서도 이런 type-safe한 쿼리를 작성할 수 없을까? 라는 물음으로 찾아보게 되었습니다. (아 mybatis 쓰기 싫어요 ㅜㅜ) 물론 사실 QueryDSL 도 querydsl-sql이라는 형태로 native SQL을 지원하지만 주변에서 jooq의 평이 좋아 직접 한번 입문 해보기로 하였습니다. 자세한 코드는 [여기] 서 확인할 수 있습니다. DB 스키마는 공식문서에서 제공하는 스키마를 살짝 각색하여 진행하였습니다. (링크의 src/main/..

2021.03.04 게시됨

개발/Spring

JPA로 Type-Safe한 CTE 작성하기

RDBMS에서 계층형 쿼리를 작성할때 Common Table Expression을 사용하여 쿼리를 작성 할 수 있습니다. 일반적인 SQL에서는 WITH [ Recursive ] 라는 구문으로 작성가능합니다. 해당 구문은 [ANSI 표준] 이기 때문에 MySQL이나, MariaDB, Oracle 등 대부분의 RDBMS에서 사용할 수 있습니다. 이번에는 해당 구문을 JPA에서 Native SQL을 사용하지 않고 추상화 레벨을 유지하며, QueryDSL과 함께 사용할 수 있도록 하면서 겪은 삽질을 기록하였습니다. 스포일러) "공식적"으로 JPA는 CTE를 지원하지 않습니다 본 글은 MariaDB 기준으로 작성하였습니다. 해당 코드는 [여기] 서 확인할 수 있습니다. CTE 란? Common Table Expr..

2021.02.21 게시됨