feature search area - boostcampwm-2022/web33-Mildo GitHub Wiki

โœ‚๏ธ ๋ถ„๋ฐฐ๋œ ์ด์Šˆ

  • ๊ฒ€์ƒ‰์ฐฝ ์š”์ฒญ์‹œ ์—ฐ๊ด€ ๊ฒ€์ƒ‰์–ด ์‘๋‹ตํ•˜๋Š” API ์ƒ์„ฑ #71
  • ๊ฒ€์ƒ‰์ฐฝ์—์„œ ๊ฒ€์ƒ‰์–ด ์ž…๋ ฅํ•˜๊ธฐ #72
  • ์—ฐ๊ด€ ๊ฒ€์ƒ‰์–ด ํด๋ฆญ ์‹œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ #74

๐Ÿšฉ ๊ตฌํ˜„ ๋ชฉํ‘œ

  • ์ฃผ์š” ์žฅ์†Œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์™„์„ฑํ•œ๋‹ค.

๐Ÿ€ ์„ธ๋ถ€ ๋ชฉํ‘œ

  • ๊ฒ€์ƒ‰ API ์ƒ์„ฑ api/seoul/search?areaName=<๊ฒ€์ƒ‰์–ด>
  • ๊ฒ€์ƒ‰์ฐฝ์— ๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ ์ด๋ฒคํŠธ ๊ฑธ๊ธฐ
  • ๊ฒ€์ƒ‰ API์™€ ํ†ต์‹ ํ•˜์—ฌ ์—ฐ๊ด€ ๊ฒ€์ƒ‰์–ด ์‘๋‹ต ํ™•์ธ
  • ๊ฒ€์ƒ‰์–ด์™€ ์—ฐ๊ด€๋œ ์žฅ์†Œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์—ฐ๊ด€ ๊ฒ€์ƒ‰์–ด ๋ฆฌ์ŠคํŠธ๋กœ ์ถœ๋ ฅ
  • ์ผ์น˜ํ•˜๋Š” ๋‹จ์–ด ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์ƒ‰์œผ๋กœ ๊ฐ•์กฐ
  • ์—ฐ๊ด€๋œ ์žฅ์†Œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ โ€˜๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์š” 50๊ณณ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹คโ€™ ๊ฒ€์ƒ‰์ฐฝ ์•„๋ž˜ ์ถœ๋ ฅ
  • ๊ฒ€์ƒ‰์ฐฝ ์•„๋ž˜ ์—ฐ๊ด€ ๊ฒ€์ƒ‰์–ด ํด๋ฆญ ์ด๋ฒคํŠธ ์ƒ์„ฑ
  • ํด๋ฆญ ์‹œ ์ง€๋„ ์ด๋™ ๋ฐ ์ƒ์„ธ ๋ชจ๋‹ฌ์ฐฝ ์ถœ๋ ฅ

๐Ÿ–ฅ๏ธ ๊ตฌํ˜„ ๋‚ด์šฉ

๊ฒ€์ƒ‰ API ์ƒ์„ฑ

Untitled

Untitled

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ถœ๋ ฅ ๋ฐ ์ผ์น˜ํ•˜๋Š” ๊ฒ€์ƒ‰์–ด ๊ฐ•์กฐ

Untitled

Untitled

๐Ÿ“– ํ•™์Šต ๋‚ด์šฉ

โ€˜useDeferredValueโ€™ vs โ€˜debounceโ€™

๐Ÿฉบ ์˜์‚ฌ๊ฒฐ์ •

ํ•œ๊ธ€์ด ๋ฏธ์™„์„ฑ๋œ ๋‹จ์–ด์ผ ๊ฒฝ์šฐ(ex. ๊ฐ•ใ„ด) ๊ฒ€์ƒ‰ API์—์„œ ์—ฐ๊ด€ ๊ฒ€์ƒ‰์–ด๊ฐ€ ์—†๋‹ค๊ณ  ์‘๋‹ตํ•ด์•ผ ํ•˜๋‚˜?

  • ์ผ๋‹จ ์—ฐ๊ด€ ๊ฒ€์ƒ‰์–ด๊ฐ€ ์—†๋‹ค๊ณ  ์ถœ๋ ฅํ•จ
  • ํ”„๋ก ํŠธ์ชฝ์—์„œ ๊ฒ€์ƒ‰์–ด ์•ˆ์— ์ž์Œ ๋˜๋Š” ๋ชจ์Œ ๋ฟ์ผ ๊ฒฝ์šฐ API ๋ณด๋‚ด์ง€ ์•Š๋„๋ก ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

โ€˜์—ญโ€™ ๊ฐ™์ด ๋งŽ์€ ์—ฐ๊ด€ ๊ฒ€์ƒ‰์–ด๊ฐ€ ์ถœ๋ ฅํ•  ๊ฒฝ์šฐ ๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ์˜ ์ œํ•œ์„ ํ•ด์•ผ๋ ๊นŒ?

  • ์ผ๋‹จ ๋‹ค ์ถœ๋ ฅ ์‹œํ‚ค๊ณ  ์žˆ์Œ
  • ์ตœ๋Œ€ 6๊ฐœ์˜ ์—ฐ๊ด€๊ฒ€์ƒ‰์–ด๊ฐ€ ๋ณด์ด๊ณ  ๊ทธ ์ด์ƒ์ผ ๊ฒฝ์šฐ ์Šคํฌ๋กค ๋˜๋Š” ๋“œ๋ž˜๊ทธ๋กœ ๋” ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•จ

๋ฆฌ์•กํŠธ๋กœ ๋ฐฐ์—ด์„ ์ถœ๋ ฅ์‹œ key๊ฐ’์„ ์ง‘์–ด ๋„ฃ์–ด์ค„ ๋•Œ api์—์„œ id๋„ ๊ฐ™์ด ๋ณด๋‚ด์ค˜์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

  • ์ผ๋‹จ ๋ฐฐ์—ด์˜ index๋ฅผ ์ง‘์–ด ๋„ฃ์–ด์ฃผ๊ณ  ์žˆ์Œ

์—ฐ๊ด€ ๊ฒ€์ƒ‰์–ด ํด๋ฆญ์‹œ ํ•ด๋‹น ์ง€์—ญ ๋งˆ์ปค๋กœ ์ด๋™ ๋ฐ ์ƒ์„ธ๋ชจ๋‹ฌ์ฐฝ ์ถœ๋ ฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์ƒํƒœ๋ฅผ ์ „์—ญ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋Œ€๊ณต์‚ฌ๊ฐ€ ํ•„์š”ํ•ด๋ณด์ž„

  • ์–ด๋–ป๊ฒŒ ์‹œ์ž‘ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Œโ€ฆ
  • ๋งˆ์ปค, ๋„ค์ด๋ฒ„ ์ง€๋„๋ฅผ ๋ชจ๋‘ ์ „์—ญ์œผ๋กœ ๋ฝ‘์•„์•ผ ๋  ๊ฒƒ ๊ฐ™๊ณ  ์—ฐ๊ด€๊ฒ€์ƒ‰์–ด ํด๋ฆญ ์‹œ ์–ด๋–ค ๋งˆ์ปค์ธ์ง€ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ๋„ ์‰ฝ์ง€ ์•Š์•„ ๋ณด์ž„

์—ฐ๊ด€๊ฒ€์ƒ‰์–ด ์˜ค๋ฅธ์ชฝ ๋‹๋ณด๊ธฐ ํ‘œ์‹œ๋ง๊ณ  ๊ทธ๋ƒฅ hover์‹œ ์–ด๋‘ก๊ฒŒ๋งŒ ํ•˜๋Š”๊ฒŒ ๊น”๋”ํ•ด๋ณด์ด๋Š”๋ฐ ๋‹๋ณด๊ธฐ ๋„ฃ์ง€ ๋ง๊นŒ?

  • ์ผ๋‹จ ๋‹๋ณด๊ธฐ ๋„ฃ๊ธฐ ๊ท€์ฐฎ์•„์„œ ๊ทธ๋Ÿฐ๊ฑฐ ์•„๋‹˜

๐Ÿšง Trouble Shooting

Seoul Router ์œ„์น˜์— ๋”ฐ๋ฅธ ๋ผ์ดํŒ… ์ˆœ์„œ

// before
router.get('/', seoulController.allAreas);
router.get('/:areaName', seoulController.pastInfo);
router.get('/search', seoulController.searchArea);

// after
router.get('/', seoulController.allAreas);
router.get('/search', seoulController.searchArea);
router.get('/:areaName', seoulController.pastInfo);
  • before์™€ ๊ฐ™์ด ๋ผ์šฐํ„ฐ๋ฅผ ์„ ์–ธํ–ˆ์„ ๊ฒฝ์šฐ api/seoul/search?name=<๊ฒ€์ƒ‰์–ด> API๋ฅผ ์š”์ฒญํ•  ๊ฒฝ์šฐ /:areaname์œผ๋กœ ๋ผ์šฐํŒ…์ด ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
  • ๊ทธ๋ž˜์„œ /:areaname์˜ ์œ„๋กœ ๊ฒ€์ƒ‰ ๋ผ์šฐํ„ฐ์˜ ์œ„์น˜๋ฅผ ์˜ฎ๊ฒจ ํ•ด๊ฒฐ

useTransition() ์‚ฌ์šฉ์‹œ ํ•œ๊ธ€ ์ž์Œ, ๋ชจ์Œ ๋ถ„๋ฆฌ ํ˜„์ƒ

const onChangeSearchBar: React.ChangeEventHandler<
    HTMLInputElement
  > = async e => {
    startTransition(() => {
      setSearchAreaName(e.target.value);
    });
  };
  • startTransition()์œผ๋กœ setSearchAreaName์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฆด ๊ฒฝ์šฐ ์ค‘๊ฐ„์— pending๋˜๋Š” ์‹œ๊ฐ„ ๋•Œ๋ฌธ์— ํ•œ๊ธ€์ด๋ž‘ ์ž์Œ๊ณผ ๋ชจ์Œ์ด ๋ถ„๋ฆฌ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
  • useTransition ๋Œ€์‹  useDeferredValue์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„

โ“ ๊ถ๊ธˆํ•œ ์ 

useDeferredValue์„ ์ด์šฉํ•ด์„œ ๊ฒ€์ƒ‰ API๋ฅผ ์ตœ์ ํ™” ์‹œ์ผœ๋ณด๋ ค ํ–ˆ์œผ๋‚˜ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Œ

  • onchange์—์„œ ๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ณด๋‹ˆ ๋ญ” ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋ฆ„

24์‹œ๊ฐ„ ์ธ๊ตฌ๋ฐ€๋„ ์ฐจํŠธ ์บ์‹ฑ์— ๋Œ€ํ•ด jotai-tanstack-query๋ฅผ ์ด์šฉํ•˜๋ฉด ์–ด๋–จ๊นŒ?

  • ์ด์ „ recoil์—์„œ๋„ ์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ๋ณธ์ ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Œ
  • https://jotai.org/docs/integrations/query

๐ŸŽธ ๊ธฐํƒ€

์—ฐ๊ด€๊ฒ€์ƒ‰์–ด ๋ฆฌ์ŠคํŠธ ๋„ˆ๋น„ ๋ฐ˜์‘ํ˜•์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ์ง€ ์–ด๋ ค์›Œ ๋ณด์ž„

  • ใ……ใ…ˆ๋‹˜์—๊ฒŒ ๋„์›€ ์š”์ฒญํ•ด์•ผ๋จ
โš ๏ธ **GitHub.com Fallback** โš ๏ธ