querydsl
-
[QueryDSL] WHERE 절에 서브쿼리 전달하기Today I Learned 2023. 6. 25. 01:11
검색 기능을 개선하는 과정에서 쿼리 로직의 테스트를 작성했지만, 뭔가 제대로 된 검증을 진행하지 않고 큰 틀만 검증하고 있는 것 같다는 생각이 들었다. 그래서 테스트에서 기존에 크게 고려하지 않았던 부분에 대한 테스트를 혹시나 해서 시도해보는 과정에서 이전에 발견하지 못했던 오류를 발견했고, 오류를 개선하면서 서브쿼리를 적용해본 과정을 정리하고자 한다. 새로 개선을 진행하고 있는 참가자 키워드 검색 결과 쿼리 로직을 살펴보도록 하자. 참가자 키워드 검색 결과 로직은 참가신청자 키워드 검색 결과 쿼리 로직과 거의 똑같은 형태를 갖는데, join하는 Register 테이블의 status Column 값을 APPLIED가 아닌 ACCEPTED로 전달한다는 한 부분에만 차이가 있고 나머지는 똑같다. 따라서 참가..
-
[QueryDSL] Entity 쿼리 로직의 데이터베이스 접근 횟수를 최소화해 리소스 생성 동작 성능 개선하기Today I Learned 2023. 6. 23. 01:50
최종보스 프로젝트를 진행하면서 코드를 구현하는 데 가장 많은 시간을 써야 했고, 가장 마지막까지 방치했던 부분은 목록과 관련된 리소스를 반환하는 로직이었다. 하나의 리소스를 조합하는 데 여러 Entity들이 필요한 동작이 있었다. 경기 목록이나 검색 결과와 같은 리소스를 반환하는 식의 동작들이었는데, 본 글에서는 검색 결과 리소스를 구성하는 예시를 살펴보려 한다. 기존에는 경기 목록을 구성하는 리소스 하나를 생성하기 위해 다음의 Entity들이 필요했다. - Post 하나 - Place 하나 - Post, Place와 연결된 Game 하나 - Game과 연결된 Register 여러 개 경기에 참가하는 사용자를 키워드로 경기 목록을 검색하는 Service는 다음과 같은 로직으로 작성되어 있었다. 비록 Po..
-
JPA에서 QueryDSL을 사용해 Join이 필요한 쿼리 수행하기Today I Learned 2023. 5. 4. 02:11
JPA를 이용해 두 개 이상의 테이블을 Join한 뒤, 조건에 맞는 Column을 쿼리하려면 쿼리 메서드를 어떻게 작성해야 할까? 이전에 개인 프로젝트를 진행할 때 모든 채팅 메시지 Entity 중 특정 채팅방의 입, 퇴장 메시지만을 선별해 쿼리해야 하는 상황이 있었는데, 그때는 어떻게든 조건을 만족시키는 쿼리 메서드 네이밍을 하거나, JPQL 문법에 맞는 쿼리문을 작성해 직접 쿼리를 정의하는 방법을 사용했었다. 어떻게든 만들어낸 쿼리 메서드를 살펴보자. List findAllByRoomIdAndTypeOrRoomIdAndType(Long roomId, ChattingMessageType enter, Long sameRoomId, ChattingMessageType quit); 한 눈에 봐도 명칭이 너무..