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를 진행하던 도중 타 농가 조회 기능에서 즐겨찾기에 추가된 농가도 조회되는 것을 확인했다. 어렵지 않은 문제지만, 자주 사용될 쿼리 문법이라 기록하려고 한다.
현재 농가, 즐겨찾기 테이블은 다음과 같다.
쿼리의 조건은 다음과 같다.
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 ?
테스트 성공
수정 후 다시 QA를 진행할 때 정상적으로 작동하는 것을 확인할 수 있었다.
'Private' 카테고리의 다른 글
[ezfarm] 도메인 등록 및 HTTPS 설정 (0) | 2021.07.24 |
---|---|
[ezfarm] CI/CD 서버 구축과 배포 (0) | 2021.07.12 |
[ezfarm] Spring Security를 추가한 뒤 단위 테스트(Controller)에서 생기는 문제 해결하기 (0) | 2021.06.18 |
댓글