본문 바로가기

querydsl9

JPA exists 쿼리 성능 개선 Spring Data Jpa를 사용하다보면 해당 조건의 데이터가 존재하는지 확인 하기 위해 exists 쿼리가 필요할때가 많습니다. 간단한 쿼리의 경우엔 아래와 같이 메소드로 쿼리를 만들어서 사용하는데요. boolean existsByName(String name); 조금이라도 복잡하게 되면 메소드명으로만 쿼리를 표현하기는 어렵습니다. 조건문이 3개 이상이거나, 필드명이 너무 길거나 조건문 자체가 복잡하는 등등 그래서 이런 경우엔 보통 @Query 를 사용하는데요. 다만 이럴 경우 JPQL에서 select의 exists 를 지원하지 않습니다. (select exists 문법) 단, where의 exists는 지원합니다. 그래서 exists 를 우회하기 위해 아래와 같이 count 쿼리를 사용합니다. @Q.. 2020. 8. 6.
Querydsl 에서 Group by 최적화하기 (feat. MySQL) 1. MySQL에선 Group by를 하면 정렬도 수행된다고? 일반적으로 MySQL 에서 Group By를 실행하면 file sort가 필수로 들어갑니다. 별도의 Order by가 쿼리에 포함되지 않았음에도 file sort가 발생하는 것이죠. Group by 실행시 해당 컬럼들을 기준으로 정렬이 되니 좋아보일수 있겠지만, 의도치 않게 성능 저하가 발생하는 이유가 되기도 합니다. 물론 인덱스에 있는 컬럼들로 Group by를 한다면 큰 문제가 되지 않습니다. 인덱스로 인해서 이미 컬럼들이 정렬된 상태이기 때문입니다. 정렬이 필요 없는 Group by 된 결과가 필요한 경우엔 굳이 정렬할 필요가 없겠죠? 이 문제를 해결하는 방법이 바로 order by null 입니다. 아래와 같이 order by null.. 2020. 2. 21.
Spring Batch와 QuerydslItemReader 아래 글은 사내 기술 블로그에 동일하게 공유된 글입니다. 안녕하세요 우아한형제들 정산시스템팀 이동욱입니다. 올해는 무슨 글을 기술 블로그에 쓸까 고민하다가, 1월초까지 생각했던 것은 팀에 관련된 주제였습니다. 결팀소: 결제시스템팀을 소개합니다와 같은 "정팀소: 정산시스템팀을 소개합니다" 혹은 "정개추: 정산에서개발을추구하면안되는걸까" (던만추 컨셉) 등이였죠. (던만추) 팀에 관련된 이야기라면 뭐니뭐니해도 팀장님 얘기가 빠질수가 없는데, 주제를 정하자마자 조직개편으로 팀장님이 다른 팀으로 발령났습니다. 정권이 교체되었으니 라인 환승도 해야하고, 우아한테크코스 졸업생 분이 신입 개발자로 합류도 하셔서 팀 이야기는 좀 더 뒤로 미룰수 밖에 없었습니다.(레진코믹스의 레바툰-191화) 그래서 비 기술적인 주제 .. 2020. 2. 5.
[Querydsl] Case When 사용하기 안녕하세요? 이번 시간엔 spring-boot-querydsl 예제를 진행해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하는 Github와 세미나+책 후기를 정리하는 Github, 이 모든 내용을 담고 있는 블로그가 있습니다. ) 본문 MyBatis로 사용하던 쿼리를 Querydsl로 전환하는 과정에서 만나는 여러 문제중 Case When도 있습니다. 물론 Case When은 안티 패턴이라 생각합니다. 좋은 구조라면 어플리케이션에서 비지니스 로직을 처리해야하기 때문에 이왕 마이그레이션 한다면 이런 로직 역시 어플리케이션으로 옮기시는걸 추천합니다. 하지만, 그 방법이 어렵다면 Querydsl에서 Case When을 쓰셔야겠죠? Q.. 2019. 2. 7.
[Querydsl] 연관관계 없이 Join 조회하기 안녕하세요? 이번 시간엔 Querydsl에서 연관관계 없이 Join 조회하기 예제를 진행해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하는 Github와 세미나+책 후기를 정리하는 Github, 이 모든 내용을 담고 있는 블로그가 있습니다. ) 본문 많은 분들이 Querydsl 대신에 Jooq를 사용하는 이유로 Querydsl은 연관 관계(relationship) 없이는 조인을 맺지 못하기 때문이라고 합니다. 연관 관계란 아래와 같이 관계가 맺어져있는 것을 얘기합니다. 실제로 Querydsl의 예전 버전들에서는 지원이 안됐습니다. (정확히 몇 버전부터인지는 잊어먹어서 ㅠㅠ) 하지만 요즘 버전들에서는 연관 관계 없이 조인이 되는 .. 2019. 1. 29.
[Querydsl] 다이나믹 쿼리 사용하기 안녕하세요! 이번 시간에는 Querydsl에서의 다이나믹 쿼리를 어떻게 작성하면 좋을지에 대해 진행합니다. 처음 Querydsl을 쓰시는 분들이 가장 많이 실수하는 부분이니 그럼 시작합니다! 모든 코드는 Github에 있으니 참고하세요 :) 1. 문제 상황 예를 들어 상황에 따라 조건문이 생성 되어야 한다고 보겠습니다. name이 오면 where name = name address가 오면 where address = address phoneNumber가 오면 where phoneNumber = phoneNumber 2개 이상이 오면 모두 포함 where name = name and address = address and phoneNumber = phoneNumber 즉, 파리미터가 어떻게 오는지에 따라 .. 2019. 1. 25.