5.usehooks-ts
A simple abstraction to play with a boolean, don't repeat yourself. (๋ถ์ธ์ ๊ฐ์ง๊ณ ๋๊ธฐ ์ํ ๊ฐ๋จํ ์ถ์ํ, ๋ฐ๋ณตํ์ง ๋ง์ธ์.)
Just modified version of useEffect that's executed only one time, at the mounting time. (๋ง์ดํ ์์ ์ ํ ๋ฒ๋ง ์คํ๋๋ ์ฌ์ฉ ํจ๊ณผ์ ์์ ๋ ๋ฒ์ ์ด๋ค.)
Here is a React Hook which aims to retrieve data on an API using the native Fetch API. (๋ค์์ ๋ค์ดํฐ๋ธ Fetch API๋ฅผ ์ฌ์ฉํ์ฌ API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ React Hook์ด๋ค.)
I used a reducer to separate state logic and simplify testing via functional style. (์ํ ๋ก์ง์ ๋ถ๋ฆฌํ๊ณ ํจ์ํ ์คํ์ผ์ ํตํด ํ ์คํธ๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ๋ฆฌ๋์๋ฅผ ์ฌ์ฉํ๋ค.)
The received data is saved (cached) in the application via useRef, but you can use LocalStorage (see useLocalStorage()) or a caching solution to persist the data. (์์ ๋ ๋ฐ์ดํฐ๋ useRef๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฅ(์บ์)๋์ง๋ง, ๋ฐ์ดํฐ๋ฅผ ์ง์์ํค๊ธฐ ์ํด LocalStorage(useLocalStorage() ์ฐธ์กฐ) ๋๋ ์บ์ฑ ์๋ฃจ์ ์ ์ฌ์ฉํ ์ ์๋ค.)
The fetch is executed when the component is mounted and if the url changes. If ever the url is undefined, or if the component is unmounted before the data is recovered, the fetch will not be called. (์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋๊ณ URL์ด ๋ณ๊ฒฝ๋๋ฉด ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์คํ๋๋ค. URL์ด ์ ์๋์ง ์์๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ๋ณต๊ตฌ๋๊ธฐ ์ ์ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ํด์ ๋๋ฉด ๊ฐ์ ธ์ค๊ธฐ๊ฐ ํธ์ถ๋์ง ์๋ค.)
This hook also takes the request config as a second parameter in order to be able to pass the authorization token in the header of the request, for example. Be careful though, the latter does not trigger a re-rendering in case of modification, go through the url params to dynamically change the request. (์ด ํ ์ ๋ํ ์์ฒญ์ ํค๋์ ์ธ์ฆ ํ ํฐ์ ์ ๋ฌํ ์ ์๋๋ก ์์ฒญ ๊ตฌ์ฑ์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ค(์: ์์ฒญ ํค๋์ ์ธ์ฆ ํ ํฐ ์ ๋ฌ). ํ์ง๋ง ํ์๋ ์์ฒญ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด URL ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์์ฒญ์ ์์ ํ๋ ๊ฒฝ์ฐ ์ฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ์ง ์์ผ๋ฏ๋ก ์ฃผ์ํ์ธ์.)
Use setInterval in functional React component with the same API. (๋์ผํ API๋ฅผ ๊ฐ์ง ํจ์ํ React ์ปดํฌ๋ํธ์์ setInterval ์ฌ์ฉ.)
Set your callback function as a first parameter and a delay (in milliseconds) for the second argument. (์ฝ๋ฐฑ ํจ์๋ฅผ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ค์ ํ๊ณ ๋ ๋ฒ์งธ ์ธ์์ ์ง์ฐ ์๊ฐ(๋ฐ๋ฆฌ์ด)์ ์ค์ ํ๋ค.)
You can also stop the timer passing null instead the delay or even, execute it right away passing 0. (์ง์ฐ ๋์ 0์ ์ ๋ฌํ๋ ํ์ด๋จธ๋ฅผ ์ค์งํ๊ฑฐ๋ 0์ ์ ๋ฌํ๋ ํ์ด๋จธ๋ฅผ ๋ฐ๋ก ์คํํ ์๋ ์๋ค.)
The main difference between the setInterval you know and this useInterval hook is that its arguments are "dynamic". (์ฌ๋ฌ๋ถ์ด ์๊ณ ์๋ setInterval๊ณผ ์ด useInterval ํ ์ ์ฃผ์ ์ฐจ์ด์ ์ ๊ทธ ์ธ์๊ฐ "๋์ "์ด๋ผ๋ ๊ฒ์ด๋ค.)
You can get more information in the Dan Abramov's blog post. (๋ ์๋ธ๋ผ๋ชจํ์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์ ์์ธํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค.)
Use EventListener with simplicity by React Hook. (์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ React Hook์ผ๋ก ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ์ธ์.)
Supports Window, Element and Document and custom events with almost the same parameters as the native addEventListener options. (๊ธฐ๋ณธ ์ถ๊ฐ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ต์ ๊ณผ ๊ฑฐ์ ๋์ผํ ๋งค๊ฐ๋ณ์๋ก ์ฐฝ, ์์, ๋ฌธ์ ๋ฐ ์ฌ์ฉ์ ์ง์ ์ด๋ฒคํธ๋ฅผ ์ง์ํ๋ค.)
Persist the state with local storage so that it remains after a page refresh. (ํ์ด์ง ์๋ก ๊ณ ์นจ ํ์๋ ์ํ๊ฐ ์ ์ง๋๋๋ก ๋ก์ปฌ ์ ์ฅ์๋ก ์ํ๋ฅผ ์ ์งํ๋ค.)
This can be useful for a dark theme. This hook is used in the same way as useState except that you must pass the storage key in the 1st parameter. (์ด๋์ด ํ ๋ง์ ์ ์ฉํ ์ ์๋ค. ์ด ํ ์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ์ ์ฅ์ ํค๋ฅผ ์ ๋ฌํด์ผ ํ๋ค๋ ์ ์ ์ ์ธํ๋ฉด useState์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ค.)
If the window object is not present (as in SSR), useLocalStorage() will return the default value. (window ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ(SSR์์์ ๊ฐ์ด) useLocalStorage()๋ ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํ๋ค.)
This React Hook offers you an interface to enable, disable, toggle and read the dark theme mode. (์ด React Hook์ ์ด๋์ด ํ ๋ง ๋ชจ๋๋ฅผ ํ์ฑํ, ๋นํ์ฑํ, ํ ๊ธ ๋ฐ ์ฝ์ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.)
The returned value (isDarkMode) is a boolean to let you be able to use with your logic. (๋ฐํ๋๋ ๊ฐ(isDarkMode)์ ๋ก์ง์ ์ฌ์ฉํ ์ ์๋๋ก ๋ถ์ธ์ด๋ค.)
It uses internally useLocalStorage() to persist the value and listens the OS color scheme preferences. (๋ด๋ถ์ ์ผ๋ก useLocalStorage()๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์งํ๊ณ OS ์ ๊ตฌ์ฑํ ๊ธฐ๋ณธ ์ค์ ์ ์์ ํ๋ค.)
SWR์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ์บ์ฑ ๋ฐ ์ฌ๊ฒ์ฆ์ ์ํ React hook ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ์ด๋ฆ์ HTTP RFC 5861์ ์ํด ์๋ ค์ง HTTP ์บ์ ๋ฌดํจ ์ ๋ต์ธ "stale-while-revalidate"์์ ์ ๋๋์๋ค. SWR์ ์ฌ์ฉํ๋ฉด API, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ๊ธฐํ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ๋ค์ React ๊ตฌ์ฑ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์๋ ์ ๋ฐ์ดํธํ ์ ์๋ค.
SWR์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ ๊ตฌ์ฑ ์์์ ์ฆ์ ๋ฐํํ๋ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ฌ ์ด๋ฅผ ๋ฌ์ฑํ๋ค. ๋ฐ์ดํฐ๊ฐ ์ค๋๋ ๊ฒฝ์ฐ(์ฆ, ์ค๋๋ ๊ฒฝ์ฐ) SWR์ ์๋ฒ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ๋ค์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด UI๊ฐ ์ต์ ๋ฐ์ดํฐ๋ก ๋ฐ์ํ๊ณ ์ต์ ์ํ๋ฅผ ์ ์งํ๋ค.
SWR์ REST API, GraphQL ์๋ํฌ์ธํธ, ์ฌ์ง์ด ์น ์์ผ์ ํฌํจํ ๊ด๋ฒ์ํ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ง์ํ๋ค. ๋ํ ์๋ ์ ํจ์ฑ ์ฌ๊ฒ์ฌ, ํด๋ง ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ฐ์ ๋ช ๊ฐ์ง ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. SWR์ ์ฃผ์ ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์๋ ์บ์ฑ: SWR์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์๋์ผ๋ก ์บ์ฑํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ตฌ์ฑ ์์๋ก ๋ฐํํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด API ํธ์ถ ์๊ฐ ์ค์ด๋ค๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ด ํฅ์๋๋ค.
Stale-while-revalidate: ๋ฐ์ดํฐ๊ฐ ์ค๋๋๋ฉด SWR์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋ฒ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ ๋ ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด UI๊ฐ ์ต์ ๋ฐ์ดํฐ๋ก ์๋ตํ๊ณ ์ต์ ์ํ๋ฅผ ์ ์งํ ์ ์๋ค.
์ค์๊ฐ ์ ๋ฐ์ดํธ: SWR์ ์น ์์ผ๊ณผ ๊ฐ์ด ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๋ฐ์ดํฐ ์์ค์ ๋ํ ์ค์๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ๋ค.
์ ์ฐํ ๊ตฌ์ฑ: SWR์ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง๊ฒ ์บ์ฑ ๋ฐ ์ฌ๊ฒ์ฆ ๋์์ ์ฌ์ฉ์ ์ ์ํ ์ ์๋ ์ ์ฐํ ๊ตฌ์ฑ API๋ฅผ ์ ๊ณตํ๋ค.
React Query๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ฒ ์ํ๋ฅผ ๊ด๋ฆฌ, ์บ์ฑ ๋ฐ ์ ๋ฐ์ดํธํ๊ธฐ ์ํ React ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. API ๋ฐ ๊ธฐํ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์บ์ฑํ๊ณ , ์ ๋ฐ์ดํธํ๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ๋ค. React Query๋ ์ ์ธ์ ์ด๊ณ ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ๋น๋๊ธฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์ํ ๊ด๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ผ๋ จ์ hook์ ์ ๊ณตํ๋ค.
React Query๋ ์๋ ์บ์ฑ, ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ค์ ๊ฐ์ ธ์ค๊ธฐ, ์ค๋งํธ ๋ฐ์ดํฐ ๋๊ธฐํ์ ๊ฐ์ ๊ธฐ๋ฅ์ ๋์ ํ์ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค. ๋ํ ๋คํธ์ํฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ํญ์ ์ฑ๊ณตํ๋๋ก ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ฌ์๋ ๋ฉ์ปค๋์ฆ์ด ๋ด์ฅ๋์ด ์๋ค.
React Query์ ์ฃผ์ ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์บ์ฑ: React Query๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ์ฌ ๋คํธ์ํฌ ์์ฒญ ์๋ฅผ ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
์๋ ๋ค์ ๊ฐ์ ธ์ค๊ธฐ: React Query๋ UI๊ฐ ํญ์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ํ๋๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋ค์ ๊ฐ์ ธ์จ๋ค.
์ค๋งํธ ๋ฐ์ดํฐ ๋๊ธฐํ: React Query๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ตฌ์ฑ ์์์์ ๋ฐ์ดํฐ๊ฐ ๋๊ธฐํ๋๋๋ก ํ๋ฏ๋ก ์๋ ๋ฐ์ดํฐ ๋๊ธฐํ๊ฐ ํ์ํ์ง ์๋ค.
๋ก๋ฉ ๋ฐ ์ค๋ฅ ์ํ: React Query๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ์ฌ์ฉ์์๊ฒ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ด์ฅ ๋ก๋ฉ ๋ฐ ์ค๋ฅ ์ํ๋ฅผ ์ ๊ณตํ๋ค.
๋ณ๋ ฌ ์ฟผ๋ฆฌ: React Query๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ ฌ๋ก ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฏ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ์ค์ด๋ค์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ด ํฅ์๋๋ค.
Last updated