where절을 만드는 함수를 최적화해서 만들어보자
지난번 짰던 코드에서 불필요한 부분을 제거하거나 리팩토링한다.
( OR )
형태의 쿼리를 출력하는 함수첫번째 인자 arr
: array타입, gender 또는 scent
두번째 인자 str
: string타입, g.name 또는 sc.name
const orQuery = (str, arr) => {
if(!arr){
return "";
}
let query = '(';
for(let i=0; i<arr.length; i++){
query += `${str} = "${arr[i]}"`;
if(i===(arr.length-1)){
return query + ')';
}
query += ' OR ';
}
}
WHERE ( ) AND ( )
형태의 쿼리를 출력하는 함수인자 arr
: array타입, 빈배열이면 ""을 출력
const whereAndQuery = (arr) => {
let filtered = arr.filter((element) => element !== '');
if(filtered.length === 0){
return "";
}
let query = `WHERE `;
for(let i=0; i<filtered.length; i++){
query += filtered[i];
if(i===(filtered.length-1)){
return query;
}
query += ' AND ';
}
}
(po.price >= AND po.price <= )
형태의 쿼리를 출력하는 함수첫번째 인자 lowprice
: Number타입, 최저가 이상
두번째 인자 highprice
: Number타입, 최고가 이하
const filteredPrice = (lowprice, highprice) => {
if(!highprice && !lowprice){
return "";
}else if(!highprice){
return `(po.price >= ${lowprice})`
}else if(!lowprice){
return `(po.price <= ${highprice})`
}else{
return `(po.price >= ${lowprice} AND po.price <= ${highprice})`
}
}
실행 예)
// 쿼리 파라미터에 담긴 내용
let gender = ["male","female"]
let scent = ["citrus", "fruity"]
let lowprice = 100000
let highprice = 300000
//controllers 레이어
const {gender, scent, lowprice, highprice} = req.query
// services 레이어
let array = [
orQuery("g.name", gender),
orQuery("sc.name", scent),
filteredPrice(lowprice, highprice)
]
// where절 확인
console.log( whereAndQuery(array) )
에러핸들링
무신사 사이트를 참조했을 때 쿼리 파라미터의 값이 틀렸다고해서
에러를 표시하지 않고 나머지 매칭되는 부분을 보여주는 것을 알 수 있다.
이런 경우에 대한 에러핸들링은 꼭 필요하진 않을지도?
참조: 무신사
1) list_kind = small 일 때
https://www.musinsa.com/categories/item/001004?d_cat_cd=001004&brand=&list_kind=small
2) list_kind = smallx 일 때
https://www.musinsa.com/categories/item/001004?d_cat_cd=001004&brand=&list_kind=smallx