πŸ“ μ²΄ν¬λ°•μŠ€ μ˜΅μ…˜μ„ 톡해, μ›ν•˜λŠ” κ²€μƒ‰λ¦¬μŠ€νŠΈ 뽑아내기

10_2pangΒ·2023λ…„ 7μ›” 5일
0

βš½οΈνŠΈλŸ¬λΈ”μŠˆνŒ…

λͺ©λ‘ 보기
94/94
post-thumbnail

πŸ‘¨β€πŸ’»Β μ‚¬κ±΄


ν¬μ§€μ…˜λ³„ μ²΄ν¬λ°•μŠ€λ₯Ό λ§Œλ“€μ–΄, ν•΄λ‹Ή ν¬μ§€μ…˜μ„ ν΄λ¦­ν•˜λ©΄ κ·Έ ν¬μ§€μ…˜μ΄ κ°€λŠ₯ν•œ μ„ μˆ˜λ“€μ˜ 리슀트λ₯Ό λ½‘μ•„λ‚΄κΈ°μœ„ν•΄ κ³ λ―Όν•˜μ˜€λ‹€.
μ²΄ν¬λ°•μŠ€λ₯Ό μ„ νƒν–ˆμ„λ•Œ, ν•΄λ‹Ή μ˜΅μ…˜μ΄ 배열에 μ €μž₯되고 κ·Έ 배열을 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
  1. option 배열이 λ³€ν™”κ°€ 되면 useEffect λ₯Ό 톡해 λ‹€μ‹œ 데이터 패칭이 μΌμ–΄λ‚œλ‹€.
...
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}`
	...

πŸ’­Β κ°œμ„ 


  • 체크 λ°•μŠ€ μ˜΅μ…˜μ€ λλƒˆμœΌλ‹ˆ, 이제 검색에 따라 λ°μ΄ν„°νŒ¨μΉ­μ΄ λ μˆ˜μžˆλ„λ‘ μ„€μ •ν•΄μ•Όκ² λ‹€. 이름,ꡭ적을 μ μš©ν•  생각이닀.
profile
μ£Όλ‹ˆμ–΄ ν”„λ‘ νŠΈμ—”λ“œ 개발자 이광렬 μž…λ‹ˆλ‹€ 🌸

0개의 λŒ“κΈ€