목차

Private

[ezfarm] 차집합을 이용해 쿼리 수정하기

highright96 2021. 7. 30.

목차

해당 글의 프로젝트는 다음 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] 차집합을 이용해 쿼리 수정하기

쿼리의 조건은 다음과 같다.

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] 차집합을 이용해 쿼리 수정하기

수정 후 다시 QA를 진행할 때 정상적으로 작동하는 것을 확인할 수 있었다.

 

댓글