ν¬μ§μ
λ³ μ²΄ν¬λ°μ€λ₯Ό λ§λ€μ΄, ν΄λΉ ν¬μ§μ
μ ν΄λ¦νλ©΄ κ·Έ ν¬μ§μ
μ΄ κ°λ₯ν μ μλ€μ 리μ€νΈλ₯Ό λ½μλ΄κΈ°μν΄ κ³ λ―Όνμλ€.
체ν¬λ°μ€λ₯Ό μ ννμλ, ν΄λΉ μ΅μ
μ΄ λ°°μ΄μ μ μ₯λκ³ κ·Έ λ°°μ΄μ request λ‘ λ³΄λ΄λλ‘ μλν΄λ³΄μλ€.
λ€μκ³Ό κ°μ νλ‘μ°λ₯Ό κ±°μΉλ€.
1. 체ν¬λ°μ€λ₯Ό ν΄λ¦νλ©΄, key,value,operator μ κ°μ§ κ°μ²΄λ₯Ό option λ°°μ΄μ μΆκ°νλ€.
( 컀μ€ν
ν
μ λ§λ€μ΄μ, option λ°°μ΄μ κ΄λ¦¬νλλ‘ νμλ€. )
import { useState, ChangeEventHandler } from 'react'
export interface CheckBoxOption {
key: string
value: number
operator: string
}
interface CheckBoxFilterHook {
options: CheckBoxOption[]
handleCheckBoxChange: (
value?: number,
operator?: string
) => ChangeEventHandler<HTMLInputElement>
}
const useCheckBoxOption = (): CheckBoxFilterHook => {
const [options, setOptions] = useState<CheckBoxOption[]>([])
const handleCheckBoxChange =
(value: number = 15, operator: string = '>=') =>
(event: React.ChangeEvent<HTMLInputElement>) => {
const checkBoxOption = event.target.value
const isChecked = event.target.checked
if (isChecked) {
const newOption: CheckBoxOption = {
key: checkBoxOption,
value: value,
operator: operator,
}
setOptions((prevOptions) => [...prevOptions, newOption])
} else {
// ν΄λ¦μ ν΄μ νλ©΄ μ΅μ
μμ μ κ±°
setOptions((prevOptions) =>
prevOptions.filter((option) => option.key !== checkBoxOption)
)
}
}
return { options, handleCheckBoxChange }
}
export default useCheckBoxOption
...
const { options, handleCheckBoxChange } = useCheckBoxOption()
...
useEffect(() => {
if (!endPage) {
fetchPage(page, filter, verify, options)
}
setEndPage(false)
}, [page, filter, verify, options])
...
2-1. λ°μ΄ν° ν¨μΉμ΄ μΌμ΄λ λ, κΈ°μ‘΄μ page,filter,verify μ 1λ²μ μ€μ ν optionμ μΏΌλ¦¬λ‘ λκΈ΄λ€.
2-2. option μ΄ λ°°μ΄μ΄λ€λ³΄λ μ¬λ¬ κ°μ΄ μμμμκΈ° λλ¬Έμ, ν΄λΉ κ³Όμ λ option μ map μΌλ‘ μννλ©΄μ μ€νΈλ§λ¬Έμ AND λ₯Ό λΆμ΄λ 쿼리λ₯Ό λ€μ λ§λ λ€.
2-3. λ€μ μμ±λ 쿼리λ₯Ό μ¬μ©νμ¬, MySQL μ μμ±λ 쿼리μ κ°μ μ 무μ λ°λΌ WHERE λ¬Έμ λ£λλ€.
connection.connect((err: MysqlError | null) => {
...
const options = req.query.options
? JSON.parse(req.query.options.toString())
: []
const whereClauses = options
.map(({ key, value, operator }) => {
return `${key} ${operator} ${value}`
})
.join(' AND ')
...
const query: string = `SELECT *,
...
${
whereClauses ? `WHERE ${whereClauses}` : ''
} ORDER BY ${filter} ${verify} LIMIT ${limit} OFFSET ${offset}`
...