Private
[ezfarm] 차집합을 이용해 쿼리 수정하기
목차
해당 글의 프로젝트는 다음 URL에서 확인할 수 있다.
GitHub - 2021-ict-hanium/ezfarm-back
Contribute to 2021-ict-hanium/ezfarm-back development by creating an account on GitHub....
github.com
QA를 진행하던 도중 타 농가 조회 기능에서 즐겨찾기에 추가된 농가도 조회되는 것을 확인했다. 어렵지 않은 문제지만, 자주 사용될 쿼리 문법이라 기록하려고 한다.
현재 농가, 즐겨찾기 테이블은 다음과 같다.
![[ezfarm] 차집합을 이용해 쿼리 수정하기 [ezfarm] 차집합을 이용해 쿼리 수정하기](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
쿼리의 조건은 다음과 같다.
1) 모든 농가를 조회한다.
2) 본인의 농가는 제외한다.
3) 본인이 즐겨찾기 한 농가는 제외한다.
수정 전의 쿼리는 위 조건의 1, 2번만 충족하고 있다.
수정 전 쿼리
//Querydsl
QueryResults<FarmSearchResponse> results = queryFactory
.select(new QFarmSearchResponse(
farm.id,
farm.name,
farm.address,
farm.area,
farm.farmType,
farm.cropType
))
.from(farm)
.where(
farm.user.ne(user), //본인의 농가는 제외
farmGroupEq(farmSearchCond.getFarmGroup()),
farmTypeEq(farmSearchCond.getFarmType()),
cropTypeEq(farmSearchCond.getCropType())
)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetchResults();
//SQL
select *
from farm
where farm.user_id != ? //본인의 농가는 제외
and farm.farm_group=?
and farm.crop_type=? limit ?
문제를 해결하기 위해서는 3번 조건을 충족시켜야 한다.
차집합을 이용해 쉽게 해결할 수 있다.
농가 테이블과 즐겨찾기 테이블을 farm_id로 LEFT OUTER JOIN을 한 뒤 WHERE절에 조인 테이블(즐겨찾기)의 값이 NULL인 경우를 적어주면 차집합과 동일한 결과를 출력할 수 있다.
수정한 쿼리
//Querydsl
QueryResults<FarmSearchResponse> results = queryFactory
.select(new QFarmSearchResponse(
farm.id,
farm.name,
farm.address,
farm.area,
farm.farmType,
farm.cropType
))
.from(farm)
.leftJoin(favorite)
.on(farm.eq(favorite.farm), favorite.user.eq(user)) // 본인이 즐겨찾기한 농가와 조인
.where(
favorite.isNull(), //조인 결과가 NULL인 경우(본인이 즐겨찾기한 농가가 아닌 경우)만 선택
farm.user.ne(user), //본인의 농가는 제외
farmGroupEq(farmSearchCond.getFarmGroup()),
farmTypeEq(farmSearchCond.getFarmType()),
cropTypeEq(farmSearchCond.getCropType())
)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetchResults();
//SQL
select *
from farm left outer join favorite
on farm_id = favorite.farm_id
and favorite.user_id=?
where
favorite favorite_id is null
and farm.user_id != ?
and farm.farm_group = ?
and farm.crop_type = ?
limit ?
테스트 성공
![[ezfarm] 차집합을 이용해 쿼리 수정하기 [ezfarm] 차집합을 이용해 쿼리 수정하기](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
수정 후 다시 QA를 진행할 때 정상적으로 작동하는 것을 확인할 수 있었다.
'Private' 카테고리의 다른 글
[ezfarm] 도메인 등록 및 HTTPS 설정 (0) | 2021.07.24 |
---|---|
[ezfarm] CI/CD 서버 구축과 배포 (0) | 2021.07.12 |
[ezfarm] Spring Security를 추가한 뒤 단위 테스트(Controller)에서 생기는 문제 해결하기 (0) | 2021.06.18 |
댓글