본문 바로가기

개발일지

20231211- QueryDSL사용해보기

검색 기능을 구현해 보던 도중 QueryDSL을 이용해서 쿼리문을 작성해 보기로 했다. 아직 완벽하게 이해하고 사용하고 있는 것은 아니지만 몇 번 사용해보다 보니 느낀 게 훨씬 작성이 편하고 보기 좋다는 것이다.

 

@Repository
@RequiredArgsConstructor
public class PostQueryRepository {

    private final EntityManager em;
    private final long limit = 10L;

    public List<Post> findAll(BooleanBuilder builder){

        JPAQueryFactory query = new JPAQueryFactory(em);

        return query
                .select(QPost.post)
                .from(QPost.post)
                .where(builder)
                .limit(limit)
                .fetch();
    }
}

------------------------------------------------------------------
// Service.java


public List<PostResponseDto> getPostList(SearchRequestDto searchRequestDto) {
	BooleanBuilder builder = new BooleanBuilder();

	if(searchRequestDto.getClassification().equals("title")){
		builder.and(QPost.post.title.contains(searchRequestDto.getKeyword()))
			.and(QPost.post.createdAt.between(searchRequestDto.getStartDate(),searchRequestDto.getEndDate()));
	} else {
    	...
    }
	List<Post> postList = postQueryRepository.findAll(builder);
       ...
}

 

서비스단에서 BooleanBuilder 를 통해 where절에 들어갈 조건문을 생성해 준다.

위의 코드 같은 경우 RequestDto에서 필요한 변수들을 받아와서 동적으로 조건문을 만들 수 있게 했다.

그 후 리포지토리에서 쿼리문에 적절한 변수를 넣어서 수행할 수 있게 해 준다.

이렇게 QueryDSL을 통해 복잡한 쿼리와 동적쿼리를 보다 쉽게 작성할 수 있게 해 주고, 재사용성을 높여줄 수 있다.

또한 컴파일단계에서 생기는 오류도 보다 쉽게 확인할 수 있었다.

QueryDSL에 사용되는 Q클래스들은 아직 어떤 원리로 사용되는지 모르니 다음에 좀 더 자세히 공부해 봐야겠다.