๐Ÿ’๐Ÿปโ€โ™€๏ธ ์†Œ๊ฐœ

๋ฒŒ์จ 3์ฃผ์ฐจ๊ฐ€ ๋˜์—ˆ๋‹ค. ์‹œ๊ฐ„์ด ์™œ ์ด๋ ‡๊ฒŒ ๋น ๋ฅธ์ง€..๐Ÿฅฒ
์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋˜ ์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ ๋ฌธ์ œ๋„ ํ•ด๊ฒฐ๋˜์„œ ๋งˆ์Œ ํŽธํ•˜๊ฒŒ ๊ฐœ๋ฐœ์„ ํ–ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ๋‚œ๊ด€์ด ๋ฐœ์ƒํ–ˆ๋‹ค. (์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์•„๋ž˜์—์„œ)
์ด๋ฒˆ ์ฃผ๋Š” ์ €๋ฒˆ์ฃผ ๋ณด๋‹ค ๊ธฐ์ˆ ์  ๋ถ€์ฑ„๊ฐ€ ์ค„์—ˆ์ง€๋งŒ ์™„๋ฒฝํ•˜๊ฒŒ ์ค„์ด๊ธฐ๋Š” ํž˜๋“  ๊ฒƒ ๊ฐ™๋‹ค..
ํ•˜์ง€๋งŒ ๋” ๋…ธ๋ ฅํ•ด์„œ ์ตœ๋Œ€ํ•œ์œผ๋กœ ์ค„์ด๋„๋ก ๋…ธ๋ ฅํ•  ๊ฒƒ์ด๋‹ค.

โœ… 3์ฃผ์ฐจ ์„ฑ๊ณผ

์†Œ์…œ ๋กœ๊ทธ์ธ์„ ํ•ด๊ฒฐํ–ˆ๋‹ค.
๋กœ๊ทธ์ธ์ด ๋˜์ง€ ์•Š๋˜ ๋ฌธ์ œ๋Š”, Redirect URI์™€ Redirect ID๊ฐ€ ๋‹ค๋ฅธ๊ฒƒ ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ
email์„ ํ•„์ˆ˜ ๋™์˜๋กœ ๋ฐ›์ง€ ์•Š์•„ ์ƒ๊ธด ๋ฌธ์ œ์˜€๋‹ค.
์ด ๊ณผ์ •์„ ํ•ด๊ฒฐํ•˜๋ฉด์„œ ์†Œ์…œ ๋กœ๊ทธ์ธ์— ๋Œ€ํ•ด ๋งŽ์ด ๋ฐฐ์šฐ๊ฒŒ ๋˜์—ˆ๋‹ค.
๋‹ค์Œ ์ผ์ •์ธ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์€ ์กฐ๊ธˆ ๋” ์ˆ˜์›”ํ•˜๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฒ€์ƒ‰ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ๋„ ๊ตฌํ˜„์„ ์™„๋ฃŒ ํ–ˆ๋‹ค.
์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— 2๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜์˜€์—ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
๋จผ์ € PostCard ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์•ˆ์— fetch๋กœ ๊ฒŒ์‹œ๊ธ€์„ ๋ฐ›์•„์™€ ๋ฟŒ๋ฆฌ๋„๋ก ํ–ˆ๋Š”๋ฐ, ์ด ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ๋„ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ์„ ํ•ด์„œ ๋‹น์—ฐํžˆ search ์ปดํฌ๋„ŒํŠธ์—์„œ postCard๋กœ ์ ‘์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ „๋‹ฌ์ด ์•ˆ๋  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  PostCard ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ 2๊ฐœ์˜ fetch๋ฅผ ๋ฐ›๊ณ  ์žˆ์–ด ์ ์  ๋ฌด๊ฑฐ์›Œ ์งˆ ๋ฟ๋”๋Ÿฌ, ์ปดํฌ๋„ŒํŠธ์˜ ์—ญํ• ์ด ์ •ํ™•ํžˆ ๋ช…์‹œ๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ๋ง‰ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •์„ ํ•ด์•ผํ•  ๋ถ€๋ถ„์ด์˜€๋‹ค.

์ด ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•  ๋•Œ, ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ตฌ์ƒ์„ ํ•˜์˜€์—ˆ๋‹ค.
์ฒซ๋ฒˆ์งธ๋Š” search ์ปดํฌ๋„ŒํŠธ๋Š” ์–ด์ฐจํ”ผ main์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋‹ˆ, ํ•˜๋‚˜๋กœ ํ•ฉ์นœ ๋’ค postcard์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„ ์„ ํ•ด๋ดค๋‹ค.
์ž‘๋™์€ ์ž˜ ๋˜์—ˆ์ง€๋งŒ main ์ปดํฌ๋„ŒํŠธ์˜ ๊ธธ์ด๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ ธ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ ธ ๊ฒฐ๊ตญ ๋‹ค์‹œ ๋ถ„๋ฆฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.
search ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ main์œผ๋กœ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋ฅผ ๋„˜๊ฒผ๋‹ค.

// search
  const handleSearch = () => {
    const query = {
      area: selectedArea,
      period: selectedPeriod,
      price: selectedDeposit,
      gender: selectedGender,
    }

    onSearch?.(query)
  }
  
 // main
   const handleSearch = async (query: SearchQuery, page = 1, size = 5) => {
    const searchParams = {
      page: page.toString(),
      size: size.toString(),
      region: query.area,
      period: query.period,
      price: query.price?.toString() ?? "",
      gender: query.gender.toString(),
    }

    const queryString = new URLSearchParams(searchParams).toString()

    try {
      const response = await fetch(`/api/articles/filter?${queryString}`, {
        method: "GET",
        headers: new Headers({
          "ngrok-skip-browser-warning": "69420",
        }),
      })

      if (!response.ok) {
        throw new Error("์„œ๋ฒ„ ์—ฐ๊ฒฐ ์‹คํŒจ")
      }

      const data = await response.json()
      if (data.code === "RESPONSE_SUCCESS" && data.status === "OK") {
        handleSearchResults(data.data)
        setSearchBoxOpen(!searchBoxOpen)
      } else {
        throw new Error("API Error: " + data.msg)
      }
    } catch (error: unknown) {
      console.error("์—๋Ÿฌ", searchParams)
      setSearchBoxOpen(!searchBoxOpen)
      messageApi.error("๊ฒ€์ƒ‰ ์˜ค๋ฅ˜" + error)
    }
  }  

์ด๋ ‡๊ฒŒ ์ˆ˜์ •์„ ๋งˆ์น˜๊ณ  ๋‚œ ๋’ค ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™์ด ์ž˜ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.
์ตœ์ข…์ ์œผ๋กœ

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ชจ์ง‘๊ธ€๊ณผ ์ „์ฒด๊ธ€ ๋ฒ„ํŠผ์„ ํ† ๊ธ€ํ•  ์‹œ, ๋ชจ์ง‘ ์ƒํƒœ์ธ์ง€ ์•„๋‹Œ์ง€ ์—ฌ๋ถ€๋ฅผ ํ”„๋ก ํŠธ์—์„œ ํ•„ํ„ฐ๋ง์„ ํ•˜์˜€๋Š”๋ฐ,
ํŽ˜์ด์ง€๋„ค์ด์…˜์—์„œ ๋ณด๊ณ  ์žˆ๋Š” ํŽ˜์ด์ง€๋งŒ ํ•„ํ„ฐ๋ง์ด ๋˜๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ™•์ธํ–ˆ๋‹ค.
๊ฒฐ๊ตญ ๋ฐฑ์—”๋“œ์—์„œ ๋ชจ์ง‘๊ธ€ API๋ฅผ ๋ฐ›์•„์„œ ๋ฒ„ํŠผ ํ† ๊ธ€ ์‹œ boolean ํ˜•ํƒœ๋กœ fetch ๋ถ€๋ถ„์— ์ ์šฉ ํ–ˆ๋‹ค.

  // ๋ชจ์ง‘๊ธ€, ์ „์ฒด๊ธ€ ํ† ๊ธ€
  const toggleRecruitOnly = () => {
    setShowRecruiting(!showRecruiting)
  }
  
  useEffect(() => {
    // ๋ชจ์ง‘๊ธ€, ์ „์ฒด๊ธ€
    const fetchData = async () => {
      try {
        const response = await fetch(
          `/api/${userArticle}?page=${currentPage}&size=9&isRecruiting=${showRecruiting}`,
          {
            method: "GET",
            headers: new Headers({
              "ngrok-skip-browser-warning": "69420",
            }),
          },
        )

        // ์ „์ฒด ๊ฒŒ์‹œ๊ธ€ ๊ฐœ์ˆ˜
        const countResponse = await fetch(`/api/${userArticle}/total`, {
          method: "GET",
          headers: new Headers({
            "ngrok-skip-browser-warning": "69420",
          }),
        })

        if (!response.ok || !countResponse.ok) {
          throw new Error(`์„œ๋ฒ„ ์ƒํƒœ ์‘๋‹ต ${response.status}`)
        }

        const data = await response.json()
        const countData = await countResponse.json()

        setPosts(data.data)
        setCount(countData.data)
      } catch (error) {
        console.error(error)
        messageApi.error("๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์˜ค๋ฅ˜")
      }
    }

    fetchData()
  }, [currentPage, showRecruiting, messageApi])

โœ… ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ์ •๋ฆฌ

  • โ›”๏ธย Problem โžก๏ธย ๋ชจ์ง‘๊ธ€, ์ „์ฒด๊ธ€ ํ† ๊ธ€ ๋ฒ„ํŠผ์„ ํด๋ฆญ ์‹œ, ํ”„๋ก ํŠธ์—์„œ ํ•„ํ„ฐ๋ง ํ•˜์˜€๋Š”๋ฐ, ๋ณด์ด๋Š” ํŽ˜์ด์ง€๋งŒ ํ•„ํ„ฐ๋ง ๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
    ๐Ÿƒโ€โ™€๏ธ Try โžก๏ธย API ์ฟผ๋ฆฌ ๋ถ€๋ถ„์„ true, false๋กœ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ณ€๊ฒฝ๋˜์–ด ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋„๋ก ์ˆ˜์ •
    โœ… solve โžก๏ธย ์ •์ƒ์ ์œผ๋กœ ๋ชจ์ง‘๊ธ€, ์ „์ฒด๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ด

  • โ›”๏ธย Problem โžก๏ธย ์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ ์ธ๊ฐ€ ์ฝ”๋“œ๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ๊ฒฌ
    ๐Ÿƒโ€โ™€๏ธย Try โžก๏ธย REDIRECT_URI์ด https๋กœ ๋˜์–ด์žˆ์–ด http๋กœ ์ˆ˜์ •
    โœ…ย solve โžก๏ธย  ์ •์ƒ์ ์œผ๋กœ code๋ฅผ ๋ฐฑ์—”๋“œ๋กœ ๋„˜๊ธฐ๋Š”๋ฐ ์„ฑ๊ณตํ•จ

  • โ›”๏ธย Problem โžก๏ธย search ์ปดํฌ๋„ŒํŠธ์—์„œ PostCard ์ปดํฌ๋„ŒํŠธ๋กœ Props๊ฐ€ ์ „๋‹ฌ์ด ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
    ๐Ÿƒโ€โ™€๏ธย Try โžก๏ธย PostCard ์ปดํฌ๋„ŒํŠธ์—์„œ fetch๋ฅผ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ธด ๋ฌธ์ œ์ž„์„ ์ธ์ง€ํ•˜๊ณ , ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ fetch๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  searchBar์™€ PostCard๋กœ props ์ „๋‹ฌ
    โœ…ย solve โžก๏ธย  ์ •์ƒ์ ์œผ๋กœ ๊ฒ€์ƒ‰ ํ•„ํ„ฐ๋ง ์ž‘๋™

๐Ÿ“ˆ ๋ฐ˜์„ฑ ๋ฐ ๊ฐœ์ธ์  ์„ฑ์žฅ

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋‹ค์†Œ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์ง€๋งŒ, ๊ทธ ์‹œ๊ฐ„๋™์•ˆ ์„ฑ์žฅํ•ด์„œ ์ผ๊นŒ?
์ „์— ์งœ๋†“์€ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ๋ฌด์Šจ ์ƒ๊ฐ์œผ๋กœ ์ €๋ ‡๊ฒŒ ์งฐ๋Š”์ง€ ์˜๋ฌธ๋งŒ ๋“ค์—ˆ๋‹ค.
๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ์„ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ์ง€, ์–ด๋–ค ํ˜•์‹์œผ๋กœ ์ž‘๋™ํ•  ๊ฒƒ์ธ์ง€ ์ž˜ ๊ตฌ์ƒํ›„ ๊ฐœ๋ฐœ์„ ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋А๊ผˆ๋‹ค.
์•ž์œผ๋กœ๋Š” ๊ผญ ์‹ ์ค‘ํžˆ ์ƒ๊ฐํ•˜๊ณ  ๊ฐœ๋ฐœ์„ ํ•ด์•ผ๊ฒ ๋‹ค.

โ›ณ๏ธ 4์ฃผ์ฐจ ๋ชฉํ‘œ

  • ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ๊ตฌํ˜„
  • ์‹ ์ฒญ ํ˜„ํ™ฉ ํ”„๋กœํ•„, ๊ฒŒ์‹œ๋ฌผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
profile
#UXUI #์ฝ”๋ฆฐ์ด

0๊ฐœ์˜ ๋Œ“๊ธ€