[220603] TIL

๋ฆฟยท2022๋…„ 6์›” 3์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
25/28

๐Ÿ“ƒ ์‚ฝ์งˆ์ผ์ง€

๐Ÿ’ฌ ์žก์†Œ๋ฆฌ

์–ด์   ์ž๋ ค๊ณ  ์นจ๋Œ€์—๋Š” ๋ˆ„์› ๋Š”๋ฐ cors์—๋Ÿฌ๋•Œ๋ฌธ์— ๋„์ €ํžˆ ์ž ์ด ์˜ฌ ๊ฒƒ ๊ฐ™์ง€ ์•Š์€๊ฑฐ๋‹ค. ๊ทธ๋ž˜์„œ ๋ˆ„์›Œ์„œ ๊ฒ€์ƒ‰ํ–ˆ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ์˜ api์—๋Š” cors์—๋Ÿฌ๊ฐ€ ๋งŽ์ด ๋‚˜๋Š” ํŽธ์ด๊ณ , ๋‚ด๊ฐ€ ์“ฐ๋ ค๊ณ  ํ–ˆ๋˜ ์ œ์ฃผ๋„ api๋Š”

-๋ผ๊ณ  ๋˜์–ด์žˆ์—ˆ๋‹ค. ๋” ๋ชจํ˜ธํ•œ ๋Œ€๋‹ต...
์ผ๋‹จ์€ ๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ์—์„œ api ๊ฐ€์ ธ์™€์„œ ์“ฐ๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ๋ชจ๋‘ ๋Œ์•˜๊ณ , ๊ฑฐ๊ธฐ์—์„œ ๋ณธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.
์ด๋Ÿฌ๋‹ค๊ฐ€ cors๋„์‚ฌ๋˜๊ฒ ์Œใ… 

๐Ÿ“” ๊ฐœ์ธ๊ณผ์ œ

๋””๋ฒ„๊น… 4: postman์œผ๋กœ ํ˜ธ์ถœํ•ด๋ณด๊ธฐ

๋‚ด ํฌ๋กฌ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฌธ์ œ์ธ๊ฐ€ ์‹ถ์–ด์„œ ์ด์ „์— ๊ฐ€์ž…ํ•ด๋†“๊ณ  ํ•œ๋ฒˆ๋„ ์•ˆ ์ผ๋˜ postman์„ ์จ์„œ ์‹ค์ œ๋กœ ์‚ด์•„์žˆ๋Š” api์ธ์ง€ ํ™•์ธํ•ด๋ณด์ž.

์•ˆ๋˜๋„ค... API๋ฌธ์ œ์ธ๊ฑด์ง€ postman๋ฌธ์ œ์ธ๊ฑด์ง€

๋””๋ฒ„๊น… 5: ๋‹ค์‹œ ํฌ๋กฌ ํ™•์žฅํ”„๋กœ๊ทธ๋žจ์œผ๋กœ...

๊ทธ๋ƒฅ ๋ณ„ ์ƒ๊ฐ์—†์ด ํฌ๋กฌ ํ™•์žฅํ”„๋กœ๊ทธ๋žจ์„ ๋ˆŒ๋Ÿฌ๋ดค๋Š”๋ฐ

์—ฅ...๋˜๋„ค?ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹
์‚ด์•„์žˆ๋Š” API์˜€๊ตฐ!

๋””๋ฒ„๊น… 6: ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜ ๋ฐœ์ƒ

๋ถ„๋ช… ์ž๋ฃŒ๊ฐ€ ๋ฐ›์•„์™€์ง€๋ฉด ํ™”๋ฉด์— ๋ฟŒ๋ ค์ ธ์•ผํ•˜๋Š”๋ฐ ์•ˆ ๋– ์„œ ์ฝ˜์†”์„ ๋ณด๋‹ˆ

๋„ต, ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜ ๋ฐœ๊ฒฌ.
๋Œ€์ถฉ useEffect๋ฅผ ์“ฐ๋ผ๋Š” ๊ฒƒ ๊ฐ™๊ธธ๋ž˜ useQuery๋กœ ํ˜ธ์ถœํ–ˆ๋˜ api๋ฅผ useEffect๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋”๋‹ˆ

์šฐ์™•! ๋–ด๋‹คใ… ใ… ใ… 

1. ์˜ค๋ฆ„card styling

๋””์ž์ธ์€ ๊ตฌ๊ธ€๋งํ•ด๋ณด๋‹ˆ ํŒฌํ†ค์ปฌ๋Ÿฌ์นฉ ๊ฐ™์€ ๋Š๋‚Œ์ด ์ด๋ป๋ณด์ด๊ธธ๋ž˜

์ด๋ ‡๊ฒŒ ํ–ˆ๋‹ค.
๋””์ž์ธ์€ ์†์„ ๋Œ€๋ฉด ๋Œˆ์ˆ˜๋ก ๊ณ„์† ๋Œ€๊ณ ์‹ถ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด์ฏคํ•˜๊ณ  ๊ธฐ๋Šฅ์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

2. ๋ฌดํ•œ์Šคํฌ๋กค ๊ตฌํ˜„

์ด์ „์— ๋ฌดํ•œ์Šคํฌ๋กค์„ ์„ฑ๊ณต ๋ชปํ–ˆ์œผ๋‹ˆ ์ด๋ฒˆ์—๋Š” ๊ผญ! ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

Intersection Observer ์ปค์Šคํ…€hook๋ฅผ ๋งŒ๋“ค๊ณ  ์˜ค๋ฆ„ ํŽ˜์ด์ง€ ํ•˜๋‹จ์— ๋นˆdiv๋ฅผ ๋งŒ๋“ค์–ด์„œ ref๋ฅผ ๊ฑฐ๋‹ˆ๊นŒ ํ™”๋ฉด ๋ฐ‘๋ถ€๋ถ„์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฑด ํ™•์ธํ–ˆ๊ณ , ๋ฐ‘๋ถ€๋ถ„์— ๋‹ฟ์•˜์„ ๋•Œ page๋ฅผ ++ํ•ด์„œ useEffect์— dependency๋กœ page๋ฅผ ๋„ฃ์–ด๋†จ๊ธฐ ๋•Œ๋ฌธ์— page ์ˆซ์ž๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค api๋ฅผ ์žฌ์š”์ฒญํ•˜๋Š” ๊ฑด ์ •๋ง ์ž˜๋œ ์ผ์ธ๋ฐ... ๋„ˆ๋ฌด ๋งŽ์ด ์š”์ฒญํ•˜๋Š”๋ฐ?ใ… ใ…  ์–ด๋Š์ •๋„๋ƒ๋ฉด, ์ด api์—์„œ ๋‚  ๋ง‰์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค ์ •๋„๋กœ ๋งŽ์ด ์š”์ฒญํ•œ๋‹ค. ์งง์€ ์‹œ๊ฐ„์— 2์ฒœ๋ฒˆ์ •๋„ ์š”์ฒญํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
console์„ ์ฐ์–ด๋ดค์„ ๋•Œ๋„ 4๋ฒˆ์”ฉ ๋œจ๋”๋‹ˆ ์ด๊ฑด ๋ญใ…  ๋‚ด๊ฐ€ useEffect์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชจ๋ฅด๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
api์š”์ฒญ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

๋””๋ฒ„๊น… 7: api์š”์ฒญํšŸ์ˆ˜ ์ค„์ด๊ธฐ


https://velog.io/@syc765/React-%EB%A0%8C%EB%8D%94%EB%A7%81-%EC%B5%9C%EC%A0%81%ED%99%94
์œ„์˜ ๋ธ”๋กœ๊ทธ์—์„œ ์ด๋Ÿฐ ๊ธ€์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. useCallback์€ ์ด๋Ÿด ๋•Œ ์“ฐ๋Š” ๊ฑฐ๊ตฌ๋‚˜!

useCallback์„ ์จ์„œ ๋‹ค์‹œ ๋ฆฌ์•กํŠธ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋‹ˆ
์—ฌ์ „ํžˆ api๋ฅผ ์—„์ฒญ ์š”์ฒญํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
intersection Observer๊ฐ€ ์˜ˆ๋ฏผํ•˜๊ฒŒ ๊ฐ์ง€ํ•˜๋Š” ๊ฒŒ ๋ฌธ์ œ์ธ๊ฑด์ง€
์‹คํ–‰ํ•˜์ž๋งˆ์ž 10๊ฐœ์˜€๋˜ ๋ฐฐ์—ด์ด ๋ฐ”๋กœ 110๊ฐœ๊นŒ์ง€ ์ฐจ๋ฒ„๋ฆฌ๊ณ  ๋งจ ๋ฐ‘๋ถ€๋ถ„์— ์Šคํฌ๋กค์ด ๊ฐ€์žˆ์œผ๋ฉด ๋ฏธ์นœ๋“ฏ์ด api๋ฅผ ๊ณ„์† ์š”์ฒญํ•œ๋‹ค. ์•„๋ฌด๋ž˜๋„ ์ปค์Šคํ…€ hook์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹คใ… 

  1. ์ผ๋‹จ threshold์ด 0์œผ๋กœ ๋˜์–ด์žˆ๋Š” ๊ฑธ ํ™•์ธํ–ˆ๋‹ค. (0์œผ๋กœ ๋˜์žˆ์œผ๋ฉด ํ•ด๋‹น ํƒ€๊ฒŸ์ด 1px๋งŒ ๋ณด์—ฌ๋„ ์‹คํ–‰๋œ๋‹ค.) 1๋กœ ๋ฐ”๊ฟ”์ฃผ๊ธฐ.
  2. ๊ทธ๋ฆฌ๊ณ  ์ปค์Šคํ…€hook์— ์žˆ๋Š” useEffect์˜ dependency๊ฐ€ ์—„์ฒญ ์ถ”๊ฐ€๋˜์–ด์žˆ๋Š” ๊ฑธ ํ™•์ธํ–ˆ๋‹ค. target ํ•˜๋‚˜๋งŒ ๋‚จ๊ฒจ๋†“๊ธฐ.


์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ๊นŒ ๊ณ„์† page๊ฐ€ ++๋˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ ๋ฐฐ์—ด์— 30๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ 1ํŽ˜์ด์ง€, 2ํŽ˜์ด์ง€, 1ํŽ˜์ด์ง€๊ฐ€ ํ•ฉ์ณ์„œ ๋“ค์–ด๊ฐ€์žˆ๋‹ค. ๋„์‘...

3. onIntersectํ•จ์ˆ˜์— setTimeout์„ ์ค˜๋ดค๋‹ค. ์˜ค, ํ™•์‹คํžˆ ์ค„์—ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์ฝ˜์†”์—” ํ•ญ์ƒ 4๊ฐœ์”ฉ ์ฐํžˆ๋˜๋ฐ ์‹ค์ œ๋กœ api๋ฅผ 4๋ฒˆ ์ฝœํ•˜๋Š” ๊ฑด ์•„๋‹Œ๊ฐ€๋ณด๋‹ค.

๊ทธ๋Ÿผ api์š”์ฒญ ํšŸ์ˆ˜์ค„์ด๊ธฐ๋Š” ์„ฑ๊ณต!

๋””๋ฒ„๊น… 8: ๊ฐ™์€ ๋ฐฐ์—ด์ด push๋˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์ •

if (oreumData.length === 0) setOreumData(res.data.resultSummary)
else setOreumData((prev) => prev.concat(res.data.resultSummary))

then์— ์ด๋Ÿฐ ์กฐ๊ฑด์‹์„ ์ฃผ๋‹ˆ๊นŒ ๊ฐ™์€ ๋ฐฐ์—ด์€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ํ•˜๋‚˜ ํ•ด๊ฒฐ!

๋””๋ฒ„๊น… 9: api๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์ •

1. setPage์กฐ๊ฑด์‹ ๋•Œ๋ฌธ์ด์•ผ!

์™œ ํ•œ๋ฒˆ์— 3ํŽ˜์ด์ง€์”ฉ ๋ถˆ๋Ÿฌ์˜ค๋Š”๊ฑธ๊นŒ? ๊ทธ๊ฒƒ๋„ ๊ฐ€๋งŒํžˆ ์žˆ๋Š”๋ฐ...

์ฝ˜์†”์„ ๋ณด๋‹ˆ isIntersecting์€ ๊ณ„์† false์ธ๋ฐ page๊ฐ€ ๊ณ„์† ์ง€๋ฉ‹๋Œ€๋กœ ์˜ฌ๋ผ๊ฐ€๊ณ  ์žˆ๋Š” ๊ฑธ ํ™•์ธ. ๊ทธ๋ž˜์„œ useEffect๊ฐ€ ์‹คํ–‰๋˜์„œ ๊ณ„์† api๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์™œ?

if (isIntersecting) {
  setIsLoading(true)
  selectTargetTimeout = setTimeout(() => {
    setPage((prev) => prev + 1)
  }, 2000)

์ง€๊ธˆ ์กฐ๊ฑด์‹์œผ๋กœ๋Š” isIntersecting์ด true์—ฌ์•ผ๋งŒ page์นด์šดํ„ฐ๊ฐ€ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ํ•ด๋†จ๋Š”๋ฐ?...

setPage(page + 1)

์ด๋ ‡๊ฒŒ ๋ฐ”๊พธ๋‹ˆ๊นŒ 3๋ฒˆ ๋ถ€๋ฅด๋˜ ๊ฒŒ 2๋ฒˆ ๋ถ€๋ฅด๋Š” ๊ฑธ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค.

setTimeout๋ถ€๋ถ„์—์„œ ++๋˜๋Š” ๋ถ€๋ถ„์€ ๋งž๋Š” ๊ฒƒ ๊ฐ™๊ณ , ์ด ๋ถ€๋ถ„ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๊ณ  ์‹คํ–‰ํ•ด๋ณด๋‹ˆ ์—ฌ์ „ํžˆ ๊ธฐ๋ณธ api๋ฅผ ๋‘๋ฒˆ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

3. api async, await๊ตฌ๋ฌธ์„ ์•ˆ ์จ์„œ ๊ทธ๋ž˜!

useEffect์•ˆ์— ๋“ค์–ด์žˆ๋Š” api๋ฅผ async, await๊ตฌ๋ฌธ์œผ๋กœ ์จ๋ดค๋Š”๋ฐ๋„ ์—ฌ์ „ํžˆ ํŽ˜์ด์ง€๋Š” 2๊ฐœ์”ฉ ๋กœ๋“œ๋œ๋‹ค. ๋„์‘...

4. ์ปค์Šคํ…€hook dependency๋•Œ๋ฌธ์ด์•ผ!

๊ทธ๋Ÿผ ์ปค์Šคํ…€hook dependency๋ฌธ์  ๊ฐ€? onIntersect๋ฅผ ๋นผ๋‹ˆ๊นŒ ๋ฌดํ•œ์Šคํฌ๋กค ์‹คํ–‰์ด ์•ˆ๋œ๋‹ค.
์‘, ์•„๋‹ˆ์•ผ.

5. strictMode๋•Œ๋ฌธ์ด์•ผ!

๋˜๊ฒŒ ์˜์™ธ์˜ ๋ฐœ๊ฒฌ์„ ํ–ˆ๋Š”๋ฐ

strictMode๋•Œ๋ฌธ์ด๋ž€๋‹ค. ์„ค๋งˆ...

์‘, ์•„๋‹ˆ์•ผ.

6. setTimeout์œผ๋กœ ์ „์ฒด์ ์œผ๋กœ ์‹คํ–‰์„ ์ง€์—ฐ์‹œ์ผœ๋ณด์ž.

const onIntersect: IntersectionObserverCallback = ([{ isIntersecting }]) => {
  selectTargetTimeout = setTimeout(() => {
    console.log(`๊ฐ์ง€๊ฒฐ๊ณผ : ${isIntersecting}`, page)
    if (page > 9) return
    if (isIntersecting) {
      setIsLoading(true)
      setPage(page + 1)
    }
  }, 2000)
  if (!isIntersecting) {
    clearTimeout(selectTargetTimeout)
    setIsLoading(false)
  }
}

setTimeout์œผ๋กœ ๋„“์€ ๋ฒ”์œ„๋ฅผ ๊ฐ์‹ธ๋ดค์ง€๋งŒ...
์‘, ์•„๋‹ˆ์•ผใ… 

7. ๋ฌธ์ œ ๋ถ„์„

๊ตฌ๊ธ€๋งํ•˜๋‹ค๊ฐ€ ๋– ์˜ค๋ฅธ ์ƒ๊ฐ์ธ๋ฐ,

  1. ์ฒ˜์Œ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉด api์‹คํ–‰ ์ „์ด๋ผ ๋นˆ ํ™”๋ฉด์ด ๋ณด์ž„.
  2. ๊ทธ๋Ÿผ ์ œ์ผ ๋ฐ‘์— ์žˆ๋˜ div๊ฐ€ ํ™”๋ฉด์— ๋ณด์ด๋Š” ์‚ฌํƒœ๊ฐ€ ๋ฐœ์ƒ.
  3. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด isIntersecting์€ true๊ฐ€ ๋˜๊ณ  page๋Š” ++์ด ๋จ.
  4. ๊ทธ๋Ÿผ useEffect๋Š” ์ฒ˜์Œ์— ํ•œ๋ฒˆ ์‹คํ–‰๋˜๊ณ  page๊ฐ€ ++์ด ๋˜์—ˆ์œผ๋‹ˆ ํ•œ๋ฒˆ ๋” ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

8. ๊ฒฐ๋ก 

  1. ๋งจ ๋ฐ‘์— div๊ฐ€ ์ดˆ๋ฐ˜์— ๋ Œ๋”๋งํ•  ๋•Œ ์•ˆ ๋ณด์ด๋‹ˆ๊นŒ page๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋จ.
  2. api๊ฐ€ ๋‘๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฑด strict mode๋•Œ๋ฌธ์ด ๋งž์•˜์Œ!
    ์ด๊ฑด ๋””์Šค์ฝ”๋“œ์— ๋ˆ„๊ฐ€ ์˜ฌ๋ ค๋†จ์—ˆ๋„ค... ๋””์Šค์ฝ”๋“œ๋ฅผ ์ƒ์„ธํžˆ ์ฝ์–ด๋ณด์žใ… 

๊ทธ๋Ÿผ ์ด์ œ ํ•ด์•ผํ•  ๊ฑด, ์ดˆ๋ฐ˜ ๋ Œ๋”๋ง์ด ๋๋‚˜๋ฉด ๋งจ ์•„๋ž˜ div๊ฐ€ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

...์ด๊ฑด ์ž๊ณ  ์ผ์–ด๋‚˜์„œ ํ•˜์žใ… 

profile
ํ•ญ์ƒ ์žฌ๋ฐŒ๋Š” ๋ญ”๊ฐ€๋ฅผ ์ฐพ๊ณ  ์žˆ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

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