조건부 상품 조회(Querydsl)

심규환·2022년 4월 28일
0

Shop

목록 보기
10/10

Querydsl을 활용하여 조회 기능을 구현 했습니다.

DTO

먼저 조회 조건으로는
조회 날짜, 상품 상태, 상품명, 최대 가격, 최소 가격을 받도록 했습니다. 이를 따로 ItemSearchDto로 구현합니다.

Controller

ItemController 에서 itemsDtl이라는 함수명으로 생성했습니다. 반환 값을 Response에 Page<Item>으로 설정했습니다.

Page의 size는 10으로 설정 했습니다. 이유는 적당할 것 같아서 10개였고 따로 받고 설정하는게 좋은지 이렇게 미리 지정하는게 좋은지 고민했지만 일단은 그대로 진행했습니다.

Repository

먼저 Querydsl과 Spring Data Jpa를 같이 사용하기 위해서 사용자 정의 리포지토리를 정의했습니다.

먼저 ItemRepository가 상속 받아야 할 사용자 정의 인터페이스(ItemRepositoryCustom)를 만들고 난 뒤, ItemRepositoryCustomImpl 구현체를 만들었습니다. 구현체는 반드시 뒤에 Impl를 붙여줘야 합니다.

Querydsl를 사용하여 쿼리를 빌드하려면 JPAQueryFactory가 필요합니다. 이를 내부 필드로 사용되는 EntityManager를 통해서 질의가 처리됩니다. EntityManager를 생성자 주입으로 받도록 코드를 작성합니다.

이제 ItemSearchDto에 담겨있는 필드 값들을 하나씩 처리하도록 BooleanExpression을 사용 했습니다.
BooleanExpression을 사용하면 복잡한 동적 쿼리도 간단하게 작성이 가능합니다.

상품 상태 기준
상품 상태가 존재하면 해당 상품 상태를, 없으면 null을 반환합니다. BooleanExpression을 사용하면 조회할 것이 없다면 null을 반환만 하면 알아서 무시됩니다.

상품 등록 기준
등록 기준으로는 모두, 1일전, 1주전, 1개월 전, 6개월 전으로 설정했으나 지정된 날짜가 들어오면 그 이후로 설정하도록 리팩터링 할 예정입니다.

상품명

최소 가격

최대 가격

조건들을 BooleanExpression 을 사용하여 모두 작성 후, 이를 where에 사용했습니다. 코드는 보면 바로 이해가 가기 때문에 추가 설명은 적지 않겠습니다.

Service

단순 조회만 하기 때문에 Transactional(readOnly = true)로 설정했습니다.

profile
장생농씬가?

0개의 댓글