๋‚ด์žฅ React Hook

Hook์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ์—์„œ ๋‹ค์–‘ํ•œ React ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์žฅ๋œ Hook์„ ์ด์šฉํ•˜๊ฑฐ๋‚˜ ์ด๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ž์‹ ๋งŒ์˜ Hook์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—๋Š” React์— ๋‚ด์žฅ๋œ ๋ชจ๋“  Hook์ด ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


State Hooks

State๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋Š” ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ โ€œ๊ธฐ์–ตโ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํผ ์ปดํฌ๋„ŒํŠธ๋Š” State๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋ฏธ์ง€ ๊ฐค๋Ÿฌ๋ฆฌ ์ปดํฌ๋„ŒํŠธ๋Š” State๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒํ•œ ์ด๋ฏธ์ง€ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ์— State๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด, ๋‹ค์Œ Hook ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • useState๋Š” ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” State ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
  • useReducer๋Š” Reducer ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ์‚ฌ์šฉํ•˜์—ฌ State ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
function ImageGallery() {
const [index, setIndex] = useState(0);
// ...

Context Hooks

Context๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ Props๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ํ˜„์žฌ UI ํ…Œ๋งˆ๋ฅผ ์•„๋ž˜์˜ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ๊นŠ์ด์™€ ์ƒ๊ด€์—†์ด ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • useContext๋Š” Context๋ฅผ ์ฝ๊ณ  ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค.
function Button() {
const theme = useContext(ThemeContext);
// ...

Ref Hooks

Ref๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM ๋…ธ๋“œ๋‚˜ Timeout ID์™€ ๊ฐ™์ด ๋ Œ๋”๋ง์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ผ๋ถ€ ์ •๋ณด๋ฅผ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. State์™€ ๋‹ฌ๋ฆฌ, Ref๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด๋„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Ref๋Š” React ํŒจ๋Ÿฌ๋‹ค์ž„์˜ โ€œํƒˆ์ถœ๊ตฌโ€์ž…๋‹ˆ๋‹ค. ๋‚ด์žฅ๋œ ๋ธŒ๋ผ์šฐ์ € API์™€ ๊ฐ™์ด, React๊ฐ€ ์•„๋‹Œ ์‹œ์Šคํ…œ์œผ๋กœ ์ž‘์—…ํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • useRef๋Š” Ref๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์–ด๋–ค ๊ฐ’์ด๋ผ๋„ ๋‹ด์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„ DOM ๋…ธ๋“œ๋ฅผ ๋‹ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • useImperativeHandle์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ์— ๋…ธ์ถœ๋˜๋Š” Ref๋ฅผ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
function Form() {
const inputRef = useRef(null);
// ...

Effect Hooks

Effect๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ์—ฐ๊ฒฐํ•˜๊ณ  ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋„คํŠธ์›Œํฌ, ๋ธŒ๋ผ์šฐ์ € DOM, ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋‹ค๋ฅธ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ๋œ ์œ„์ ฏ, ๊ธฐํƒ€ React๊ฐ€ ์•„๋‹Œ ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • useEffect๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
function ChatRoom({ roomId }) {
useEffect(() => {
const connection = createConnection(roomId);
connection.connect();
return () => connection.disconnect();
}, [roomId]);
// ...

Effect๋Š” React ํŒจ๋Ÿฌ๋‹ค์ž„์˜ โ€œํƒˆ์ถœ๊ตฌโ€์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด Effect๋ฅผ ์“ฐ์ง€ ๋งˆ์„ธ์š”. ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, Effect๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ€์ด๋ฐ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” useEffect์˜ ๋‘ ๊ฐ€์ง€ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • useLayoutEffect๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • useInsertionEffect๋Š” React๊ฐ€ DOM์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—ฌ๊ธฐ์— ๋™์  CSS๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Performance Hooks

์žฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ถˆํ•„์š”ํ•œ ์ž‘์—…์„ ๊ฑด๋„ˆ๋›ฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ „ ๋ Œ๋”๋ง ์ดํ›„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์บ์‹œ๋œ ๊ณ„์‚ฐ์„ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์žฌ๋ Œ๋”๋ง์„ ๊ฑด๋„ˆ๋›ฐ๋„๋ก React์— ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ„์‚ฐ๊ณผ ๋ถˆํ•„์š”ํ•œ ์žฌ๋ Œ๋”๋ง์„ ๊ฑด๋„ˆ๋›ฐ๋ ค๋ฉด ๋‹ค์Œ Hook ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • useMemo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • useCallback์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ ์ •์˜๋ฅผ ์ตœ์ ํ™”๋œ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ์บ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
function TodoList({ todos, tab, theme }) {
const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]);
// ...
}

ํ™”๋ฉด์„ ์‹ค์ œ๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์žฌ๋ Œ๋”๋ง์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋™๊ธฐ์‹์ด์–ด์•ผ ํ•˜๋Š” Blocking ์—…๋ฐ์ดํŠธ(์˜ˆ: Input์— ์ž…๋ ฅ)์™€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฐจ๋‹จํ•  ํ•„์š”๊ฐ€ ์—†๋Š” Non-Blocking ์—…๋ฐ์ดํŠธ(์˜ˆ: ์ฐจํŠธ ์—…๋ฐ์ดํŠธ)๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ Œ๋”๋ง ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜๋ ค๋ฉด, ๋‹ค์Œ Hook ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • useTransition์„ ์‚ฌ์šฉํ•˜๋ฉด State ์ „ํ™˜์„ Non-Blocking์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ , ๋‹ค๋ฅธ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ฅผ ์ค‘๋‹จํ•˜๋„๋ก ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • useDeferredValue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด UI์˜ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐํ•˜๊ณ , ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ๋จผ์ € ์—…๋ฐ์ดํŠธ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Other Hooks

๋‹ค์Œ Hook์€ ๋Œ€๋ถ€๋ถ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž์—๊ฒŒ ์œ ์šฉํ•˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • useDebugValue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปค์Šคํ…€ Hook์— ๋Œ€ํ•ด React ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์— ํ‘œ์‹œํ•˜๋Š” ๋ ˆ์ด๋ธ”์„ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • useId๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ณ ์œ  ID๋ฅผ ์ž์‹ ๊ณผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ ‘๊ทผ์„ฑ API์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • useSyncExternalStore๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์™ธ๋ถ€ ์ €์žฅ์†Œ๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • useActionState๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ก์…˜์„ ํ†ตํ•ด State๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋งŒ์˜ Hooks

๋˜ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๋กœ ๋‚˜๋งŒ์˜ ์ปค์Šคํ…€ Hook์„ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.