์ด์ ์๋ ค๊ณ ์นจ๋์๋ ๋์ ๋๋ฐ cors์๋ฌ๋๋ฌธ์ ๋์ ํ ์ ์ด ์ฌ ๊ฒ ๊ฐ์ง ์์๊ฑฐ๋ค. ๊ทธ๋์ ๋์์ ๊ฒ์ํ๋ค. ์๊ฐ๋ณด๋ค ๊ณต๊ณต๋ฐ์ดํฐํฌํธ์ api์๋ cors์๋ฌ๊ฐ ๋ง์ด ๋๋ ํธ์ด๊ณ , ๋ด๊ฐ ์ฐ๋ ค๊ณ ํ๋ ์ ์ฃผ๋ api๋
-๋ผ๊ณ ๋์ด์์๋ค. ๋ ๋ชจํธํ ๋๋ต...
์ผ๋จ์ ๊ณต๊ณต๋ฐ์ดํฐํฌํธ์์ api ๊ฐ์ ธ์์ ์ฐ๋ ์ฌ๋๋ค์ ๋ธ๋ก๊ทธ๋ฅผ ๋ชจ๋ ๋์๊ณ , ๊ฑฐ๊ธฐ์์ ๋ณธ ํด๊ฒฐ๋ฐฉ๋ฒ์ ํด๋ณด๊ณ ์ ํ๋ค.
์ด๋ฌ๋ค๊ฐ cors๋์ฌ๋๊ฒ ์ใ
๋ด ํฌ๋กฌ๋ธ๋ผ์ฐ์ ์ ๋ฌธ์ ์ธ๊ฐ ์ถ์ด์ ์ด์ ์ ๊ฐ์
ํด๋๊ณ ํ๋ฒ๋ ์ ์ผ๋ postman์ ์จ์ ์ค์ ๋ก ์ด์์๋ api์ธ์ง ํ์ธํด๋ณด์.
์๋๋ค... API๋ฌธ์ ์ธ๊ฑด์ง postman๋ฌธ์ ์ธ๊ฑด์ง
๊ทธ๋ฅ ๋ณ ์๊ฐ์์ด ํฌ๋กฌ ํ์ฅํ๋ก๊ทธ๋จ์ ๋๋ฌ๋ดค๋๋ฐ
์ฅ...๋๋ค?ใ
ใ
ใ
ใ
ใ
ใ
์ด์์๋ API์๊ตฐ!
๋ถ๋ช
์๋ฃ๊ฐ ๋ฐ์์์ง๋ฉด ํ๋ฉด์ ๋ฟ๋ ค์ ธ์ผํ๋๋ฐ ์ ๋ ์ ์ฝ์์ ๋ณด๋
๋ต, ์๋ก์ด ์ค๋ฅ ๋ฐ๊ฒฌ.
๋์ถฉ useEffect๋ฅผ ์ฐ๋ผ๋ ๊ฒ ๊ฐ๊ธธ๋ useQuery๋ก ํธ์ถํ๋ api๋ฅผ useEffect๋ก ๋ฐ๊ฟ์ฃผ์๋๋
์ฐ์! ๋ด๋คใ
ใ
ใ
๋์์ธ์ ๊ตฌ๊ธ๋งํด๋ณด๋ ํฌํค์ปฌ๋ฌ์นฉ ๊ฐ์ ๋๋์ด ์ด๋ป๋ณด์ด๊ธธ๋
์ด๋ ๊ฒ ํ๋ค.
๋์์ธ์ ์์ ๋๋ฉด ๋์๋ก ๊ณ์ ๋๊ณ ์ถ์ด์ง๊ธฐ ๋๋ฌธ์ ์ด์ฏคํ๊ณ ๊ธฐ๋ฅ์ผ๋ก ๋์ด๊ฐ๋ค.
์ด์ ์ ๋ฌดํ์คํฌ๋กค์ ์ฑ๊ณต ๋ชปํ์ผ๋ ์ด๋ฒ์๋ ๊ผญ! ์ด๋ผ๊ณ ์๊ฐํ๋ค.
Intersection Observer ์ปค์คํ
hook๋ฅผ ๋ง๋ค๊ณ ์ค๋ฆ ํ์ด์ง ํ๋จ์ ๋นdiv๋ฅผ ๋ง๋ค์ด์ ref๋ฅผ ๊ฑฐ๋๊น ํ๋ฉด ๋ฐ๋ถ๋ถ์ ๊ฐ์งํ๋ ๊ฑด ํ์ธํ๊ณ , ๋ฐ๋ถ๋ถ์ ๋ฟ์์ ๋ page๋ฅผ ++ํด์ useEffect์ dependency๋ก page๋ฅผ ๋ฃ์ด๋จ๊ธฐ ๋๋ฌธ์ page ์ซ์๊ฐ ๋ฐ๋ ๋๋ง๋ค api๋ฅผ ์ฌ์์ฒญํ๋ ๊ฑด ์ ๋ง ์๋ ์ผ์ธ๋ฐ... ๋๋ฌด ๋ง์ด ์์ฒญํ๋๋ฐ?ใ
ใ
์ด๋์ ๋๋๋ฉด, ์ด api์์ ๋ ๋ง์์ง๋ ๋ชจ๋ฅธ๋ค๋ ์๊ฐ์ด ๋ค ์ ๋๋ก ๋ง์ด ์์ฒญํ๋ค. ์งง์ ์๊ฐ์ 2์ฒ๋ฒ์ ๋ ์์ฒญํ ๊ฒ ๊ฐ๋ค.
console์ ์ฐ์ด๋ดค์ ๋๋ 4๋ฒ์ฉ ๋จ๋๋ ์ด๊ฑด ๋ญใ
๋ด๊ฐ useEffect์ ๋ํด์ ์ ๋ชจ๋ฅด๋ ๊ฒ ๊ฐ๋ค.
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์๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ๋คใ
์ด๋ ๊ฒ ํ๋๊น ๊ณ์ page๊ฐ ++๋์ง ์์๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๊ธ ๋ฐฐ์ด์ 30๊ฐ๊ฐ ์๋๋ฐ 1ํ์ด์ง, 2ํ์ด์ง, 1ํ์ด์ง๊ฐ ํฉ์ณ์ ๋ค์ด๊ฐ์๋ค. ๋์...
3. onIntersectํจ์์ setTimeout์ ์ค๋ดค๋ค. ์ค, ํ์คํ ์ค์๋ค! ๊ทธ๋ฆฌ๊ณ ์ฝ์์ ํญ์ 4๊ฐ์ฉ ์ฐํ๋๋ฐ ์ค์ ๋ก api๋ฅผ 4๋ฒ ์ฝํ๋ ๊ฑด ์๋๊ฐ๋ณด๋ค.
๊ทธ๋ผ api์์ฒญ ํ์์ค์ด๊ธฐ๋ ์ฑ๊ณต!
if (oreumData.length === 0) setOreumData(res.data.resultSummary)
else setOreumData((prev) => prev.concat(res.data.resultSummary))
then์ ์ด๋ฐ ์กฐ๊ฑด์์ ์ฃผ๋๊น ๊ฐ์ ๋ฐฐ์ด์ ๋ค์ด๊ฐ์ง ์๋๋ค. ํ๋ ํด๊ฒฐ!
์ ํ๋ฒ์ 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๋ฅผ ๋๋ฒ ํธ์ถํ๊ณ ์์๋ค.
useEffect์์ ๋ค์ด์๋ api๋ฅผ async, await๊ตฌ๋ฌธ์ผ๋ก ์จ๋ดค๋๋ฐ๋ ์ฌ์ ํ ํ์ด์ง๋ 2๊ฐ์ฉ ๋ก๋๋๋ค. ๋์...
๊ทธ๋ผ ์ปค์คํ
hook dependency๋ฌธ์ ๊ฐ? onIntersect๋ฅผ ๋นผ๋๊น ๋ฌดํ์คํฌ๋กค ์คํ์ด ์๋๋ค.
์, ์๋์ผ.
๋๊ฒ ์์ธ์ ๋ฐ๊ฒฌ์ ํ๋๋ฐ
strictMode๋๋ฌธ์ด๋๋ค. ์ค๋ง...
์, ์๋์ผ.
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์ผ๋ก ๋์ ๋ฒ์๋ฅผ ๊ฐ์ธ๋ดค์ง๋ง...
์, ์๋์ผใ
๊ตฌ๊ธ๋งํ๋ค๊ฐ ๋ ์ค๋ฅธ ์๊ฐ์ธ๋ฐ,
๊ทธ๋ผ ์ด์ ํด์ผํ ๊ฑด, ์ด๋ฐ ๋ ๋๋ง์ด ๋๋๋ฉด ๋งจ ์๋ div๊ฐ ๋ณด์ด๊ฒ ํ๋ ๊ฒ์ด๋ค.
...์ด๊ฑด ์๊ณ ์ผ์ด๋์ ํ์ใ