검색 기능을 구현해 보던 도중 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클래스들은 아직 어떤 원리로 사용되는지 모르니 다음에 좀 더 자세히 공부해 봐야겠다.
'개발일지' 카테고리의 다른 글
20231212 - JWT를 Header가 아닌 Cookie로 반환하기 (0) | 2023.12.12 |
---|---|
20231211 - 백오피스 프로젝트 KPT 회고 (0) | 2023.12.11 |
20231207 - Spring으로 MultipartFile 받기 (2) | 2023.12.07 |
20231206 - @CreatedDate, @LastModifiedDate (1) | 2023.12.06 |
20231205 - 프로그래머스/42748 (1) | 2023.12.05 |