- ๋ณธ ํ๋ก์ ํธ๋ API ์ฝ ์ต์ ํ๋ฅผ ์ ์ฉํ ๊ฒ์์ด ์กฐํ ์น ์ฌ์ดํธ ์ ๋๋ค.
- ๋ฉ์ธ ํ๋ฉด
- ๊ฒ์ ์ ํ๋ฉด
-
API ์ฝ ์ต์ ํ
- ๊ฒ์ ์๋น์ค๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋๋ง๋ค API ์ฝ์ ์์ฒญํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ผ ์ ์์ด, ์ด๋ฅผ ์ต์ ํ
- ๋จ, axios๋ง ์ฌ์ฉ ๊ฐ๋ฅ(axios์ cache ์ต์ X, react-query์ ๊ฐ์ ์บ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ X)
-
์ต๊ทผ ๊ฒ์์ด ๊ธฐ๋ฅ
- ์ต๊ทผ ๊ฒ์์ด ์ต๋ 5๊ฐ
- 5๊ฐ ์์ ์ค๋ณต๋ ๊ฒ์์ด ์์ ๊ฒฝ์ฐ, ์๋ก ์ถ๊ฐ X โก๏ธ ๊ธฐ์กด์ ์๋ ๊ฒ์์ด๊ฐ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ๋ก ์ด๋
- 5๊ฐ๊ฐ ๋์์ ๋ ์๋ก์ด ๊ฒ์์ด๊ฐ ์ถ๊ฐ๋๋ฉด, ๊ฐ์ฅ ๋ง์ง๋ง ๊ฒ์์ด ์ญ์
- ํด๋น ๋ฐ์ดํฐ๋ ์น ํ์ด์ง ์ข ๋ฃ ํ์๋ ์ ์ง๋๋๋ก
-
ํค๋ณด๋ ๋ง์ผ๋ก ์ถ์ฒ ๊ฒ์์ด ๋ฐ ์ผ๋ฐ ๊ฒ์ ๊ธฐ๋ฅ
- ํค๋ณด๋ ๋ง์ผ๋ก ์ํ ์ด๋, ENTER๋ก ๊ฒ์
- ๋ง์ฐ์ค ํด๋ฆญ์ผ๋ก๋ ๊ฒ์์ด๋ก ๊ฒ์ ๊ฐ๋ฅ
- ๊ฒ์ ์ ๋ณ๋ค๋ฅธ ํ์ด์ง ์ด๋ ์์ด ์ต๊ทผ ๊ฒ์์ด๊ฐ ์ถ๊ฐ๋๋ ํํ
-
๊ฒ์ ๋จ์ด ํ์ด๋ผ์ดํธ
- ๊ฒ์์ด๊ฐ ํฌํจ๋ ๋ถ๋ถ์ ํ์ด๋ผ์ดํธ
-
API ์ฝ ์ต์ ํ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ฐ๋กํ๋ง, ๋๋ฐ์ด์ฑ, API ์บ์, axios์์ ๊ด๋ จ ์ค์ , ์บ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๋ฑ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์กด์ฌํฉ๋๋ค.
- ์ฐ๋กํ๋ง : ๋ง์ง๋ง ํจ์๊ฐ ํธ์ถ๋ ํ ์ผ์ ์๊ฐ์ด ์ง๋๊ธฐ ์ ์ ๋ค์ ํธ์ถ๋์ง ์๋๋ก ํ๋ ๊ฒ
- ๋๋ฐ์ด์ฑ : ์ฐ์ด์ด ํธ์ถ๋๋ ํจ์๋ค ์ค ๋ง์ง๋ง ํจ์(๋๋ ์ ์ผ ์ฒ์)๋ง ํธ์ถํ๋๋ก ํ๋ ๊ฒ
๐ ์ ๋ ์ด ์ค ๋๋ฐ์ด์ฑ ๋ฐฉ๋ฒ์ ์ฑํํ์ฌ ๋ณธ ํ๋ก์ ํธ์ ์ ์ฉํ์ต๋๋ค. ํด๋น ๋ฐฉ๋ฒ์ ํํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ค์ ํ ํน์ ์๊ฐ ์ฃผ๊ธฐ๋ก ๊ณ ์คํ๋๋ ์ฐ๋กํ๋ง ๋ฐฉ์๋ณด๋ค๋
์ด๋ฒคํธ๊ฐ ์ฐ์์ ์ผ๋ก ๋ฐ์ํ๋๋ผ๋ ์ค์ ํ ํน์ ์๊ฐ ๋์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์๊ณ , ๋งจ ๋ง์ง๋ง ์ด๋ฒคํธ์์ ๋ฐ์์ํค๋ ๋๋ฐ์ด์ฑ ๋ฐฉ์์ ๊ฒ์ ๊ธฐ๋ฅ์ ์ ์ฉํ๋ ๊ฒ์ด ๋ง๋ค๊ณ ํ๋จํ์ต๋๋ค.
-
์ ์ฉํ ๋ฐฉ์ ์ค๋ช
๐ Hooks/useDebounce.js
const useDebounce = (value, delay) => {
const [debounceValue, setDebounceValue] = useState(value)
useEffect(() => {
const handler = setTimeout(() => {
setDebounceValue(value)
}, delay)
return () => clearTimeout(handler)
}, [value, delay])
return debounceValue
------------------------------------------------------------------
๐ App.js
const debounceSearchTerm = useDebounce(searchText, 300)
useEffect(() => {
getSearchList(debounceSearchTerm) // getSearchList๋ API ์์ฒญ ๋ณด๋ด๋ ํจ์
}, [debounceSearchTerm])
1) ๊ฒ์์ ํ๊ฒ ๋๋ฉด ํ๋ฉด์ด ๋ ๋๋ง๋๋ฉด์ searchText๊ฐ ์ปค์คํ
ํ
์๊ฒ ์ ๋ฌ๋๋ค.
2) 1์ ์ํด ์์กด์ฑ ๋ฐฐ์ด์ debounceSearchTerm์ด ๋ด๊ฒจ์๋ useEffect๊ฐ ์คํ
โก๏ธ API ์์ฒญ์ ๋ณด๋ธ๋ค.
โก๏ธ ๊ทธ๋ฐ๋ฐ ๊ทธ ์์ฒญ์ 0.3์ด ์ดํ์ ๋ณด๋ด๋๋ก
โก๏ธ โป ๊ทธ๋ฐ๋ฐ ์ด delayedSearchState๊ฐ ๊ณ์ ๊ณ์ ๋ฐ๋๊ฒ ๋๋ฉด timer๊ฐ ์๊ธฐ๊ณ api ์์ฒญ์ด ์ด๋ฃจ์ด์ง๊ธฐ๋ ์ ์ ์ง์์ง๊ณ ๋ฅผ ๋ฐ๋ก ํ๋ค๋ณด๋
==> ๊ฒฐ๋ก ์ ์ผ๋ก๋ ์
๋ ฅ์ด ๋ฉ์ถ ํ 0.3์ด ๋์ ๊ธฐ๋ค๋ฆฐ ํ์ API ์์ฒญ์ ๋ณด๋ธ๋ค
==> ๊ฒฐ๋ก ์ ์ผ๋ก onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค
๋งค๋ฒ API ์์ฒญ์ ๋ณด๋ด์ง ์๊ณ , ์ผ์ term์ ๋๊ณ ์์ฒญ์ ๋ณด๋ธ๋ค.
๋๋ฌด ๋ง์ ์ด๋ฒคํธ๋ฅผ ํธ์ถํ์ง ์์ ๊ณผ๋ํ API ์ฝ์ ํ์ง ์์ ์ฑ๋ฅ ๊ฐ์ ์๋ ๋์์ด ๋๋ค.
==> ํนํ, ์ฌ์ฉ๊ฐ์๋ ํฐ ๋ถํธ์ด ์์๋ค.
- ํน์ ๊ตฌ๊ฐ์ ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ ๊ฒฝ์ฐ API ์์ฒญ์ ๋ณด๋ด์ง ์๊ณ , ๋ง์ง๋ง ์ด๋ฒคํธ์์๋ง API ์์ฒญ์ ๋ณด๋ด๊ณ ์์ต๋๋ค.
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด ์๋, ํน์ ๊ตฌ๊ฐ์์๋ง API ์์ฒญ์ ๋ณด๋ ๋๋ค.
CORS๋ ๋ค๋ฅธ ๋๋ฉ์ธ์ ๊ฐ์ง ๋ฆฌ์์ค์ ์์ธ์คํ ์ ์๊ฒ ํ๋ ๋ณด์ ๋ฉ์ปค๋์ฆ
๐ ์๋ฌด๋ ์ฐ๋ฆฌ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ์ ์๋ค๋ฉด, ๋๊ตฐ๊ฐ ์
์์ ์ผ๋ก ์๋ฒ์ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋ค๋ ๊ฒ์
๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์์๋ ํ์ฌ ์๋ ๋๋ฉ์ธ/ํฌํธ์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ์์ฒ์ ์ผ๋ก ๋ง์๋์ต๋๋ค.
๐ช 1. ํด๋ผ์ด์ธํธ์์ ํด๊ฒฐ
- Proxy ํจํด ์ด์ฉ
ํด๋ผ์ด์ธํธ ์นํ์ด์ง์์ ์ง์ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด ์๋๋ผ, ํด๋ผ์ด์ธํธ ํ์ด์ง -> ํด๋ผ์ด์ธํธ ์๋ฒ -> ๋ฐฑ์๋ ์๋ฒ
๐ ์ค๊ฐ ๋ค๋ฆฌ๋ฅผ ํ๋ ๋๋๋ค!
๐ ์๋ฒ์์ ์๋ฒ๋ผ๋ฆฌ ํต์ ํ ๋๋ CORS ์ ์ฑ ์ด ์ ์ฉX์ ์ด์ฉ
๐ช 2. ์๋ฒ(NodeJS)์์ ํด๊ฒฐ
- ์๋ต ํค๋์ Access-Control-Allow-Origin ํค๋๋ฅผ ์ฝ์
- cors ๋ฏธ๋ค์จ์ด ์ฌ์ฉ
- ์ฟ ํค ์์ฒญ ํ์ฉ